
    6h2                    $   S SK Jr  S SKrS SKrS SKrS SKrS SKrSSKJ	r	  SSK
JrJrJrJr  SSKJr  \R"                  r\R&                  r\R(                  r\R*                  rSSK
Jr  S	 r " S
 S5      r " S S\R2                  5      r " S S\5      r S SKr\R:                  " 5         \R<                  rS r# " S S\\R"                  5      r$ " S S\$5      r%S r&g! \  a)    \!" \S5      (       a  \RD                  r NJ " S S5      r NVf = f)    )annotationsN   )_)encodingerrorpycompatutil)urlutil   )commonc                l    SU ;   a  U R                  SS5      u  pOU Sp![        R                  U5      U4$ )zwReturn path and query that has been split from uri

Just like CGI environment, the path is unquoted, the query is
not.
?r    )spliturlrequnquote)uripathquerys      8/usr/lib/python3/dist-packages/mercurial/hgweb/server.py	_splitURIr   %   s:     cziiQ'e3e>>$&&    c                  ,    \ rS rSrS rS rS rS rSrg)_error_logger2   c                    Xl         g Nhandler)selfr   s     r   __init___error_logger.__init__3   s    r   c                    g r    r    s    r   flush_error_logger.flush6   s    r   c                D    U R                  UR                  S5      5        g )N   
)
writelinesr   )r    strs     r   write_error_logger.write9   s    		%()r   c                v    U H3  nU R                   R                  S[        R                  " U5      5        M5     g )NzHG error:  %s)r   	log_errorr   strfromlocal)r    seqmsgs      r   r*   _error_logger.writelines<   s+    CLL""?H4I4I#4NO r   r   N)	__name__
__module____qualname____firstlineno__r!   r&   r,   r*   __static_attributes__r$   r   r   r   r   2   s    *Pr   r   c                      \ rS rSrSr\S 5       rS rS rS r	S r
SS jrS	 rS
 rS rS rS rS rS rSS jrS rS rS rSrg)_httprequesthandlerA   s   httpc                    g)z*Prepare .socket of new HTTPServer instanceNr$   )
httpserveruis     r   preparehttpserver%_httprequesthandler.preparehttpserverD   s    r   c                Z    SU l         [        R                  R                  " U /UQ70 UD6  g )NHTTP/1.1)protocol_versionhttpservermodbasehttprequesthandlerr!   )r    argskargss      r   r!   _httprequesthandler.__init__H   s(     +,,55dKTKUKr   c           
         UR                  [        R                  " U R                  S   < SU R	                  5       < SX#-  < 35      S-   5        UR                  5         g )Nr   z - - [z] r)   )r,   r   sysbytesclient_addresslog_date_time_stringr&   )r    fpformatrF   s       r   _log_any_httprequesthandler._log_anyL   sW    
 ''*--/M	 
	
 	
r   c                T    U R                   " U R                  R                  U/UQ76   g r   )rO   servererrorlogr    rN   rF   s      r   r/   _httprequesthandler.log_errorZ   s    dkk**F:T:r   c                T    U R                   " U R                  R                  U/UQ76   g r   )rO   rR   	accesslogrT   s      r   log_message_httprequesthandler.log_message]   s    dkk++V;d;r   c                   / n[        U S5      (       aD  U R                  R                  5        Vs/ s H  oDS   R                  S5      (       d  M  UPM!     nnU R	                  SU R
                  [        U5      [        U5      SR                  [        U5       Vs/ s H  nSU-  PM
     sn5      5        g s  snf s  snf )Nheadersr   zx-z"%s" %s %s%sr   z %s:%s)	hasattrr[   items
startswithrX   requestliner+   joinsorted)r    codesizexheadershs        r   log_request_httprequesthandler.log_request`   s    4##<<--//aQ4??43H/   	IIGG6(+;<+;aX\+;<=	
 =s   B6B6B;c                F     U R                  5         g ! [         a     g f = fr   )do_hgwebBrokenPipeErrorr%   s    r   do_write_httprequesthandler.do_writen   s"    	MMO 		s    
  c                    U R                  5         g ! [         a  n[        U[        [        45      (       d^  SR                  [        R                  " [        R                  " 5       6 5      n[        S5      nU R                  SU R                  UU5        U R                  S/ 5        U R                  S5        U R                  5          S nAg S nAff = f)Nr   
   z6Exception happened during processing request '%s':%s%sz500 Internal Server Errors   Internal Server Error)rk   	Exception
isinstanceConnectionResetErrorConnectionAbortedErrorr`   	tracebackformat_exceptionsysexc_infochrr/   r   _start_response_write_done)r    etbnewlines       r   do_POST_httprequesthandler.do_POSTt   s    	MMO 	 135KLMMWWY77HI b'(II   !<bAKK01JJLL+	s    
CB,CCc                $    U R                  5         g r   r~   r%   s    r   do_PUT_httprequesthandler.do_PUT       r   c                $    U R                  5         g r   r   r%   s    r   do_GET_httprequesthandler.do_GET   r   r   c                $    U R                  5         g r   r   r%   s    r   do_HEAD_httprequesthandler.do_HEAD   r   r   c                	   SU l         [        U R                  5      u  pXR                  R                  :w  a  UR                  U R                  R                  S-   5      (       dt  U R                  [        R                  " [        R                  " S5      5      / 5        U R                  S:X  a  S/U l        U R                  S5        U R                  5         g 0 nSUS'   U R                  US	'   U R                  R                  US
'   [!        U R                  R"                  5      US'   U R                  US'   [        R$                  " U R                  R                  5      US'   [        R$                  " U['        U R                  R                  5      S  5      US'   U R(                  S   US'   U R(                  S   US'   U=(       d    SUS'   U R*                  R-                  5       c  U R*                  R/                  5       US'   OU R*                  R-                  5       US'   U R*                  R1                  S5      nU(       a  XCS'   U R*                  R3                  5        Vs/ s H  nUR5                  5       S;  d  M  UPM     sn Hn  nSUR7                  SS5      R9                  5       -   nU R*                  R1                  U5      nUR7                  SS5      R;                  5       nU(       d  Mj  XU'   Mp     U R<                  US'   SUS'   [        R$                  " U R>                  5      US'   UR1                  S S5      R5                  5       S!:X  a:  [        R@                  " U RB                  U RD                  RF                  5      U l!        U RB                  US"'   [I        U 5      US#'   [K        U R                  [L        RN                  5      US$'   [Q        [L        S%5      (       a(  [K        U R                  [L        RR                  5      US&'   OSUS&'   SUS''   [T        RV                  RY                  U5        S U l-        / U l        S U l.        S U l/        U R                  Ra                  X0R                  5       H  n	U R                  U	5        M     U R                   (       d  U Rc                  5         U R                  5         g s  snf )(NF   /i  POST)
ConnectionCloses	   Not FoundzCGI/1.1GATEWAY_INTERFACEREQUEST_METHODSERVER_NAMESERVER_PORTREQUEST_URISCRIPT_NAME	PATH_INFOr   REMOTE_HOSTREMOTE_ADDRr   QUERY_STRINGCONTENT_TYPEcontent-lengthCONTENT_LENGTH)zcontent-typer   HTTP_-r   
SERVER_PROTOCOL)r   r   zwsgi.versionzwsgi.url_schemeHTTP_EXPECTz100-continuez
wsgi.inputzwsgi.errorszwsgi.multithreadForkingMixInzwsgi.multiprocesszwsgi.run_once)2sent_headersr   r   rR   prefixr^   rx   r   strurlr   statusmessagecommandsaved_headersry   rz   server_namer+   server_portsysstrlenrK   r[   get_content_typeget_default_typegetkeyslowerreplaceupperstriprequest_version
url_schemecontinuereaderrfilewfiler,   r   rp   socketserverThreadingMixInr\   r   wsgirefvalidatecheck_environsaved_statuslength_chunkedapplicationsend_headers)
r    r   r   envr   re   headerhkeyhvalchunks
             r   ri   _httprequesthandler.do_hgweb   s   !		* ;;%%%dooKK%/
 /
   1E1Ec1J!KRP||v% '>%>"KK%JJL#,  $![[44M !8!89M!YYM%__T[[-?-?@M#??4DKK4F4F0G0I+JKK!003M!003M#krN<<((*2"&,,"?"?"AC"&,,"?"?"AC!!"23$* ! \\&&(
(wwy BB (
F
 V^^C5;;==D<<##F+D<<b)//1Dt D	
 "&!5!5$N!)!A77="%++-?..tzz4::;K;KLDJ JJL*40M",KK44#
 <00'1\66(C#$ (-C#$ O&&s+ [[,,S2F2FGEKK H  

Q
s   )S
S
c                   U R                   (       d  [        S5      eU R                   R                  S S5      n[        US   5      US'   U R                  " U6   S U l        SU l        U R                   H>  nU R                  " U6   US   R                  5       S:X  d  M+  [        US   5      U l        M@     U R
                  c  US   [        R                  :w  ar  U R                  S:w  ab  U R                  (       + =(       a    U R                  S:H  U l        U R                  (       a  U R                  SS	5        OU R                  S
S5        U R                  5         SU l        g )Ns.   Sending headers before start_response() calledr   r   Fr   HEADrB   zTransfer-Encodingchunkedr   closeT)r   AssertionErrorr   intsend_responser   r   r   send_headerr   r   HTTP_NOT_MODIFIEDr   close_connectionr   end_headersr   )r    r   re   s      r   r    _httprequesthandler.send_headers   s0      A  ((..tQ7l1o.QL)##Aa tzz|//!!A$i $
 KKQ6#;#;;& )))Pd.B.Bj.P M }}  !4i@  w7 r   Nc                    [        U[        5      (       d   eUR                  S S5      u  pE[        U5      nXl        SnU Vs/ s H  owS   R                  5       U;  d  M  UPM     snU l        U R                  $ s  snf )Nr   )
connectionztransfer-encodingr   )rp   r+   r   r   r   r   r   ry   )r    http_statusr[   rv   rb   r2   bad_headersre   s           r   rx   #_httprequesthandler._start_response  sy    +s++++%%dA.	4y'9
!A$**,k"AAw
 {{
s   A;!A;c                   U R                   (       d  [        S5      eU R                  (       d  U R                  5         U R                  bB  [        U5      U R                  :  a  [        S5      eU R                  [        U5      -
  U l        O(U R                  (       a  U(       a  S[        U5      U4-  nU R                  R                  U5        U R                  R                  5         g )Ns+   data written before start_response() calledsL   Content-length header sent, but more bytes than specified are being written.s   %x
%s
)
r   r   r   r   r   r   r   r   r,   r&   )r    datas     r   ry   _httprequesthandler._write  s       !OPP"";;"4y4;;&$?  ++D	1DK]]t"c$i%66D



r   c                    U R                   (       a6  U R                  R                  S5        U R                  R                  5         g g )Ns   0

)r   r   r,   r&   r%   s    r   rz   _httprequesthandler._done!  s0    ==JJ\*JJ r   c                    U R                   R                  (       a*  [        R                  " U R                   R                  5      $ [        R
                  R                  U 5      $ r   )rR   serverheaderr   r0   rD   rE   version_stringr%   s    r   r   "_httprequesthandler.version_string&  sA    ;;##(()A)ABB33BB4HHr   )r   r   rC   r   r   r   r   )r   r   r   )r4   r5   r6   r7   r   staticmethodr?   r!   rO   r/   rX   rf   rk   r~   r   r   r   ri   r   rx   ry   rz   r   r8   r$   r   r   r:   r:   A   sm    J9 9L;<
4Ob!:	"
Ir   r:   c                  2    \ rS rSrSrSr\S 5       rS rSr	g)_httprequesthandlerssli,  z*HTTPS handler based on Python's ssl modules   httpsc                4    SSK Jn  UR                    UR                  SS5      nUR                  SS5      nUR                  SS5      nUR                  U R                  UUUUS	9U l	        g ! [         a     [        R
                  " [        S5      5      ef = f)
Nr   )sslutils   SSL support is unavailable   web   certificates   devels   servercafiles   serverrequirecert)certfilecafilerequireclientcert)
r   r   wrapserversocketImportErrorr   Abortr   config
configboolsocket)r=   r>   r   r   r   reqcerts         r   r?   (_httprequesthandlerssl.preparehttpserver1  s    	@"$$ 99V^4 8_5--*>?#44% 5 

  	@++a =>??	@s   A- -*Bc                    U R                   U l        U R                   R                  SU R                  5      U l        U R                   R                  SU R
                  5      U l        g )Nrbwb)requestr   makefilerbufsizer   wbufsizer   r%   s    r   setup_httprequesthandlerssl.setupI  sE    ,,\\**4?
\\**4?
r   )r   r   r   N)
r4   r5   r6   r7   __doc__r   r   r?   r   r8   r$   r   r   r   r   ,  s"    4J
 
.@r   r   forkc                      \ rS rSrSrg)_mixiniY  r$   N)r4   r5   r6   r7   r8   r$   r   r   r  r  Y  s    r   r  c                8    U (       a  U S:w  a  [        U S5      $ U$ )N   -ab)open)optdefaults     r   openlogr	  ]  s    
sd{CNr   c                  @    \ rS rSr\R
                  (       a  SrS rSrg)MercurialHTTPServeric  r   c                >   [         R                  R                  " XU40 UD6  SU l        X l        UR                  X5        UR                  SS5      nU(       a  SUR                  S5      -   nX`l        [        UR                  SS5      UR                  5      n[        UR                  SS5      UR                  5      nXpl        Xl        U R                  R                  5       SS u  U l        U l        U R$                  U l        UR                  SS	5      U l        g )
NTr   s   prefixr   s	   accesslogs   errorlogr   r   s   server-header)rD   r=   r!   daemon_threadsr   r?   r   r   r   r	  foutferrrW   rS   r   getsocknameaddrportr   fqaddrr   )	r    r>   appr  r   kwargsr   alogelogs	            r   r!   MercurialHTTPServer.__init__h  s      ))$gHH"!!$+69-FLL..Fryy6@ryy5rww?#{{6681=	49&&IIf.>?r   )	rW   r  r   r  rS   r  r  r   r   N)	r4   r5   r6   r7   r   	iswindowsallow_reuse_addressr!   r8   r$   r   r   r  r  c  s    @r   r  c                  <   ^  \ rS rSr\" \SS5      rU 4S jrSrU =r	$ )IPv6HTTPServeri  AF_INET6Nc                ~   > U R                   c  [        R                  " [        S5      5      e[        TU ]  " U0 UD6  g )Ns$   IPv6 is not available on this system)address_familyr   	RepoErrorr   superr!   )r    rF   r  	__class__s      r   r!   IPv6HTTPServer.__init__  s6    &//!$K"LMM$)&)r   r$   )
r4   r5   r6   r7   getattrr   r  r!   r8   __classcell__)r"  s   @r   r  r    s    VZ6N* *r   r  c           
        U R                  SS5      (       a  [        nO[        nU R                  SS5      (       a  [        nO[
        nSS KnUR                  5         U R                  SS5      n[        R                  " U R                  SS5      5      n U" XXV4U5      $ ! [         aJ  n[        R                  " [        S5      XV[        R                  " UR                   S   5      4-  5      eS nAff = f)	Nr   r   s   ipv6r   s   addresss   ports"   cannot start server at '%s:%d': %sr   )r   r   r:   r   r  r  	mimetypesinitr
   getportOSErrorr   r   r   r   
strtolocalrF   )r>   r  r   clsr'  addressr  insts           r   create_serverr/    s    	yy(((%	}}VW%%! NNii
+G??299VW56D
2WOW55 
kk34h11$))A,?@A
 	

s   
B! !
C5+AC00C5)'
__future__r   osr   ru   rs   wsgiref.validater   i18nr   r   r   r   r   r	   utilsr
   r=   rD   r   urlerrr   r   r   r   rE   r:   r   	threadingactive_countr   r  r   r\   r   r	  r  r  r/  r$   r   r   <module>r8     s   # 	  
       		 
'P PhI->> hIV @0  @F((F@&-":": @8*( *
i  r6**	 	s   !C    D
DD