
    c2                        d dl Z d dlZd dlZd dlZd dlZd dlZddlmZ ddl	m
Z
mZ ddlmZmZm	Z	mZ ddlmZ ej        Zej        Zej        Zej        ZddlmZ d	 Z G d
 d          Z G d dej                  Z G d de          Z	 d dlZ ej                     ej        Z n1# e!$ r)  ej"        ed          rej#        Z n G d d          Z Y nw xY wd Z$ G d de ej        e%          Z& G d de&          Z'd Z(dS )    N   )_)getattropen)encodingerrorpycompatutil)urlutil   )commonc                 ~    d| v r|                      dd          \  }}n| d}}t                              |          |fS )zReturn 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   )   sF     czziiQ''ee3e>>$&&    c                   &    e Zd Zd Zd Zd Zd ZdS )_error_loggerc                     || _         d S N)handler)selfr   s     r   __init__z_error_logger.__init__7   s    r   c                     d S r    r   s    r   flushz_error_logger.flush:   s    r   c                 V    |                      |                    d                     d S )N   
)
writelinesr   )r   strs     r   writez_error_logger.write=   s&    		%(()))))r   c                 j    |D ]/}| j                             dt          j        |                     0d S )NzHG error:  %s)r   	log_errorr   strfromlocal)r   seqmsgs      r   r'   z_error_logger.writelines@   sE     	P 	PCL""?H4I#4N4NOOOO	P 	Pr   N)__name__
__module____qualname__r    r$   r)   r'   r"   r   r   r   r   6   sU            * * *P P P P Pr   r   c                       e Zd ZdZed             Zd Zd Zd Zd Z	ddZ
d	 Zd
 Zd Zd Zd Zd ZddZd Zd Zd ZdS )_httprequesthandlers   httpc                     dS )z*Prepare .socket of new HTTPServer instanceNr"   )
httpserveruis     r   preparehttpserverz%_httprequesthandler.preparehttpserverI   s      r   c                 H    d| _         t          j        j        | g|R i | d S )NHTTP/1.1)protocol_versionhttpservermodbasehttprequesthandlerr    )r   argskargss      r   r    z_httprequesthandler.__init__M   s4     +,5dKTKKKUKKKKKr   c           
          |                     t          j        | j        d         d|                                 d||z            dz              |                                 d S )Nr   z - - [z] r&   )r)   r	   sysbytesclient_addresslog_date_time_stringr$   )r   fpformatr=   s       r   _log_anyz_httprequesthandler._log_anyQ   s{    
 '***--////TMM	  
	
 
	
 
	
 	




r   c                 8     | j         | j        j        |g|R   d S r   )rE   servererrorlogr   rD   r=   s      r   r+   z_httprequesthandler.log_error_   s)    dk*F:T::::::r   c                 8     | j         | j        j        |g|R   d S r   )rE   rG   	accesslogrI   s      r   log_messagez_httprequesthandler.log_messageb   s)    dk+V;d;;;;;;r   -c                 >   g }t          j        | d          r#d | j                                        D             }|                     d| j        t          |          t          |          d                    d t          |          D                                  d S )Ns   headersc                 H    g | ]}|d                               d          | S )r   zx-)
startswith.0hs     r   
<listcomp>z3_httprequesthandler.log_request.<locals>.<listcomp>h   s=       1Q4??43H3H  r   z"%s" %s %s%sr   c                     g | ]}d |z  S )z %s:%sr"   rQ   s     r   rT   z3_httprequesthandler.log_request.<locals>.<listcomp>p   s    <<<aX\<<<r   )	r
   safehasattrheadersitemsrL   requestliner(   joinsorted)r   codesizexheaderss       r   log_requestz_httprequesthandler.log_requeste   s    D*-- 	 <--//  H 	IIIIGG<<6(+;+;<<<==	
 	
 	
 	
 	
r   c                 R    	 |                                   d S # t          $ r Y d S w xY wr   )do_hgwebBrokenPipeErrorr#   s    r   do_writez_httprequesthandler.do_writes   s:    	MMOOOOO 	 	 	DD	s    
&&c                    	 |                                   d S # t          $ r}t          |t          t          j        f          r|j        t          j        k    s^d                    t          j
        t          j                               }t          d          }|                     d| j        ||           |                     dg            |                     d           |                                  Y d }~d S d }~ww xY w)Nr   
   z6Exception happened during processing request '%s':%s%sz500 Internal Server Errors   Internal Server Error)rc   	Exception
isinstanceOSErrorsocketr   errno
ECONNRESETrZ   	tracebackformat_exceptionsysexc_infochrr+   r   _start_response_write_done)r   etbnewlines       r   do_POSTz_httprequesthandler.do_POSTy   s    	MMOOOOO 	 	 	 1w566Gu///WWY7HII b''(I     !<bAAAKK0111JJLLLLLLLLL-	s    
D CC;;D c                 .    |                                   d S r   rw   r#   s    r   do_PUTz_httprequesthandler.do_PUT       r   c                 .    |                                   d S r   ry   r#   s    r   do_GETz_httprequesthandler.do_GET   r{   r   c                    d| _         t          | j                  \  }}|| j        j        k    r|                    | j        j        dz             sx|                     t          j        t          j
        d                    g            | j        dk    rdg| _        |                     d           |                                  d S i }d|d<   | j        |d	<   | j        j        |d
<   t!          | j        j                  |d<   | j        |d<   t          j        | j        j                  |d<   t          j        |t'          | j        j                  d                    |d<   | j        d         |d<   | j        d         |d<   |pd|d<   | j                                        | j                                        |d<   n| j                                        |d<   | j                            d          }|r||d<   d | j                                        D             D ]v}d|                    dd                                          z   }| j                            |          }|                    dd                                          }|r|||<   w| j        |d<   d|d<   t          j        | j                  |d<   |                    d d                                          d!k    r)t          j         | j!        | j"        j#                  | _!        | j!        |d"<   tI          |           |d#<   tK          | j        tL          j'                  |d$<   tQ          j)        tL          d%          r#tK          | j        tL          j*                  |d&<   nd|d&<   d|d'<   tV          j,        -                    |           d | _.        g | _        d | _/        d | _0        | j        1                    || j                  D ]}|                     |           | j         s| 2                                 |                                  d S )(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_LENGTHc                 >    g | ]}|                                 d v|S ))zcontent-typer   lowerrQ   s     r   rT   z0_httprequesthandler.do_hgweb.<locals>.<listcomp>   s6     
 
 
wwyy BBB BBBr   HTTP_rM   r   
SERVER_PROTOCOL)r   r   zwsgi.versionzwsgi.url_schemeHTTP_EXPECTz100-continuez
wsgi.inputzwsgi.errorszwsgi.multithreads   ForkingMixInzwsgi.multiprocesszwsgi.run_once)3sent_headersr   r   rG   prefixrP   rq   r	   strurlr   statusmessagecommandsaved_headersrr   rs   server_namer(   server_portsysstrlenrA   rW   get_content_typeget_default_typegetkeysreplaceupperstriprequest_version
url_schemer   continuereaderrfilewfiler)   r   rg   socketserverThreadingMixInr
   rV   ForkingMixInwsgirefvalidatecheck_environsaved_statuslength_chunkedapplicationsend_headers)	r   r   r   envr   headerhkeyhvalchunks	            r   ra   z_httprequesthandler.do_hgweb   s*   !	**e 4;%%%dooK%/
 /
%   1Ec1J1J!K!KRPPP|v%% '>%>"KK%%%JJLLLF#,  $![4M !899M!YM%_T[-?@@M#?4DK4F0G0G0I0I+JKKK!03M!03M#krN<((**2"&,"?"?"A"AC"&,"?"?"A"AC!!"233 	+$*C !
 
\&&((
 
 
 		! 		!F
 V^^C55;;===D<##F++D<<b))//11D ! D	!%!5$N!)!A!A77="%%++--??.tz4:;KLLDJ JL*400M",K4#
 #
 L/:: 	-'1\6( (C#$$ (-C#$ O&&s+++ [,,S$2FGG 	 	EKK  	 

r   c                 h   | j         st          d          | j                             d d          }t          |d                   |d<    | j        |  d | _        d| _        | j        D ]D} | j        |  |d         	                                dk    rt          |d                   | _        E| j        b|d         t          j        k    rL| j         o
| j        dk    | _        | j        r|                     dd           n|                     d	d
           |                                  d| _        d S )Ns.   Sending headers before start_response() calledr   r   Fr   r9   zTransfer-Encodingchunkedr   closeT)r   AssertionErrorr   intsend_responser   r   r   send_headerr   r   HTTP_NOT_MODIFIEDclose_connectionr   end_headersr   )r   r   rS   s      r   r   z _httprequesthandler.send_headers   sM     	 A   (..tQ77l1o..QL))# 	( 	(ADa  tzz||///!!A$ii;<?f6N#N#N))Pd.Bj.P M } 8  !4i@@@@  w777 r   Nc                     t          |t                    sJ |                    d d          \  }}t          |          }|| _        dfd|D             | _        | j        S )Nr   )
connectionztransfer-encodingc                 L    g | ] }|d                                           v|!S )r   r   )rR   rS   bad_headerss     r   rT   z7_httprequesthandler._start_response.<locals>.<listcomp>
  s6     
 
 
!A$**,,k"A"AA"A"A"Ar   )rg   r(   r   r   r   r   rr   )r   http_statusrW   ro   r\   r.   r   s         @r   rq   z#_httprequesthandler._start_response  s    +s+++++%%dA..	c4yy'9
 
 
 

 
 
 {r   c                    | j         st          d          | j        s|                                  | j        Dt          |          | j        k    rt          d          | j        t          |          z
  | _        n| j        r|rdt          |          |fz  }| j                            |           | j        	                                 d S )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   rr   z_httprequesthandler._write  s      	  !OPPP" 	 ;"4yy4;&&$?   +D		1DKK] 	7t 	7"c$ii%66D

r   c                 ~    | j         r5| j                            d           | j                                         d S d S )Ns   0

)r   r   r)   r$   r#   s    r   rs   z_httprequesthandler._done   sF    = 	J\***J	 	r   c                     | j         j        rt          j        | j         j                  S t          j                            |           S r   )rG   serverheaderr   r,   r;   r<   version_stringr#   s    r   r   z"_httprequesthandler.version_string%  s=    ;# 	C()ABBB3BB4HHHr   )rM   rM   r   )r/   r0   r1   r   staticmethodr7   r    rE   r+   rL   r_   rc   rw   rz   r}   ra   r   rq   rr   rs   r   r"   r   r   r3   r3   E   s)       J9 9 \9L L L  ; ; ;< < <
 
 
 
    6    O O Ob! ! !2	 	 	 	  "  
I I I I Ir   r3   c                   2    e Zd ZdZdZed             Zd ZdS )_httprequesthandlersslz*HTTPS handler based on Python's ssl modules   httpsc                 N   	 ddl m} |j         n/# t          $ r" t	          j        t          d                    w xY w|                    dd          }|                    dd          }|                    dd          }|                    | j	        ||||	          | _	        d S )
Nr   )sslutils   SSL support is unavailable   web   certificates   devels   servercafiles   serverrequirecert)certfilecafilerequireclientcert)
r   r   wrapserversocketImportErrorr   Abortr   config
configboolri   )r5   r6   r   r   r   reqcerts         r   r7   z(_httprequesthandlerssl.preparehttpserver0  s    	@""""""$$$ 	@ 	@ 	@+a =>>???	@ 99V^44 8_55--*>??#44% 5 
 

s    ,<c                     | j         | _        | j                             d| j                  | _        | j                             d| j                  | _        d S )Nrbwb)requestr   makefilerbufsizer   wbufsizer   r#   s    r   setupz_httprequesthandlerssl.setupH  sE    ,\**4??
\**4??


r   N)r/   r0   r1   __doc__r   r   r7   r   r"   r   r   r   r   +  sL        44J
 
 \
.@ @ @ @ @r   r   s   forkc                       e Zd ZdS )_mixinN)r/   r0   r1   r"   r   r   r   r   X  s        Dr   r   c                 6    | r| dk    rt          | d          S |S )N   -s   ab)r   )optdefaults     r   openlogr   \  s'    
  sd{{CNr   c                   &    e Zd Zej        rdZd ZdS )MercurialHTTPServerr   c                 X   t          j        j        | ||fi | d| _        || _        |                    | |           |                    dd          }|rd|                    d          z   }|| _        t          |                    dd          |j
                  }t          |                    dd          |j                  }|| _        || _        | j                                        dd         \  | _        | _        | j        | _        |                    dd	          | _        d S )
NTr   s   prefixr   s	   accesslogs   errorlogr   r   s   server-header)r;   r5   r    daemon_threadsr   r7   r   r   r   r   foutferrrK   rH   ri   getsocknameaddrportr   fqaddrr   )	r   r6   appr   r   kwargsr   alogelogs	            r   r    zMercurialHTTPServer.__init__h  s    )$gHHHHH"!!$+++69-- 	/FLL...Fryy66@@ryy55rw??#{66881=	49&IIf.>??r   N)r/   r0   r1   r	   	iswindowsallow_reuse_addressr    r"   r   r   r   r   b  s;           @ @ @ @ @r   r   c                   8     e Zd Z eedd          Z fdZ xZS )IPv6HTTPServerAF_INET6Nc                     | j         !t          j        t          d                     t	          t
          |           j        |i | d S )Ns$   IPv6 is not available on this system)address_familyr   	RepoErrorr   superr  r    )r   r=   r   	__class__s      r   r    zIPv6HTTPServer.__init__  sM    &/!$K"L"LMMM,nd##,d=f=====r   )r/   r0   r1   r   ri   r  r    __classcell__)r	  s   @r   r  r    sK        WVZ66N> > > > > > > > >r   r  c           
         |                      dd          rt          }nt          }|                     dd          rt          }nt
          }dd l}|                                 |                      dd          }t          j	        |                      dd                    }	  || |||f|          S # t          j        $ rI}t          j        t          d          ||t          j        |j        d                   fz            d }~ww xY w)	Nr   r   s   ipv6r   s   addresss   ports"   cannot start server at '%s:%d': %sr   )r   r   r3   r   r  r   	mimetypesinitr   getportri   r   r   r   r   
strtolocalr=   )r6   r   r   clsr  addressr   insts           r   create_serverr    s   	yy(( &(%	}}VW%% "! NNii
++G?299VW5566D
s2sWdOW555< 
 
 
k344h1$)A,??@A
 
 	

s   "B2 2D
ADD
))rj   osri   rn   rl   wsgiref.validater   i18nr   r	   r   r   r   r   r   r
   utilsr   r5   r;   r   urlerrr   r   r   r   r<   r3   r   	threadingactive_countr   r   r   rV   r   r   objectr   r  r  r"   r   r   <module>r     s    				  



                     
                  		      
' 
' 
'P P P P P P P PcI cI cI cI cI-> cI cI cIL @  @  @  @  @0  @  @  @FI(FF   tG$$ *	 	 	 	 	 	 	 	  @ @ @ @ @&-":F @ @ @:> > > > >( > > >
 
 
 
 
s   B( (+CC