
    q&f3                         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
 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j2                        Z G d de      Z	 d dlZ ej:                          ej<                  Zd Z# G d deej"                  e$      Z% G d de%      Z&d Z'y# e $ r#  e!ed      rejD                  Zn
 G d d      ZY Pw xY w)    N   )_open)encodingerrorpycompatutil)urlutil   )commonc                 l    d| v r| j                  dd      \  }}n| d}}t        j                  |      |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   (   s<     cziiQ'e3e>>$&&    c                   $    e Zd Zd Zd Zd Zd Zy)_error_loggerc                     || _         y N)handler)selfr   s     r   __init__z_error_logger.__init__6   s	    r   c                      y r    r   s    r   flushz_error_logger.flush9   s    r   c                 D    | j                  |j                  d             y )N   
)
writelinesr   )r   strs     r   writez_error_logger.write<   s    		%()r   c                 p    |D ]1  }| j                   j                  dt        j                  |             3 y )NzHG error:  %s)r   	log_errorr   strfromlocal)r   seqmsgs      r   r'   z_error_logger.writelines?   s2     	PCLL""?H4I4I#4NO	Pr   N)__name__
__module____qualname__r    r$   r)   r'   r"   r   r   r   r   5   s    *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 ZddZd Zd Zd Zy)_httprequesthandlers   httpc                      y)z*Prepare .socket of new HTTPServer instanceNr"   )
httpserveruis     r   preparehttpserverz%_httprequesthandler.preparehttpserverH   s    r   c                 X    d| _         t        j                  j                  | g|i | y )NHTTP/1.1)protocol_versionhttpservermodbasehttprequesthandlerr    )r   argskargss      r   r    z_httprequesthandler.__init__L   s(     +,,55dKTKUKr   c           
          |j                  t        j                  | j                  d   d| j	                         d||z        dz          |j                          y )Nr   z - - [z] r&   )r)   r	   sysbytesclient_addresslog_date_time_stringr$   )r   fpformatr=   s       r   _log_anyz_httprequesthandler._log_anyP   sY    
 ''*--/TM	 
	
 	
r   c                 T     | j                   | j                  j                  |g|  y r   )rE   servererrorlogr   rD   r=   s      r   r+   z_httprequesthandler.log_error^   s!    dkk**F:T:r   c                 T     | j                   | j                  j                  |g|  y r   )rE   rG   	accesslogrI   s      r   log_messagez_httprequesthandler.log_messagea   s!    dkk++V;d;r   c                 `   g }t        | d      r<| j                  j                         D cg c]  }|d   j                  d      s| }}| j	                  d| j
                  t        |      t        |      dj                  t        |      D cg c]  }d|z  	 c}             y c c}w c c}w )Nheadersr   zx-z"%s" %s %s%sr   z %s:%s)	hasattrrN   items
startswithrL   requestliner(   joinsorted)r   codesizexheadershs        r   log_requestz_httprequesthandler.log_requestd   s    4#<<--/1Q4??43HH  	IIGG6(+;<aX\<=	
 =s   B&B&B+c                 D    	 | j                          y # t        $ r Y y w xY wr   )do_hgwebBrokenPipeErrorr#   s    r   do_writez_httprequesthandler.do_writer   s"    	MMO 		s    	c                    	 | j                          y # t        $ r}t        |t        t        j
                  f      r|j                  t        j                  k(  s\dj                  t        j                  t        j                                }t        d      }| j                  d| j                  ||       | j!                  dg        | j#                  d       | j%                          Y d }~y d }~ww xY w)Nr   
   z6Exception happened during processing request '%s':%s%sz500 Internal Server Errors   Internal Server Error)r]   	Exception
isinstanceOSErrorsocketr   errno
ECONNRESETrS   	tracebackformat_exceptionsysexc_infochrr+   r   _start_response_write_done)r   etbnewlines       r   do_POSTz_httprequesthandler.do_POSTx   s    	MMO 	 1w56GGu///WWY77HI b'(II   !<bAKK01JJLL-	s    	C2CC--C2c                 $    | j                          y r   rq   r#   s    r   do_PUTz_httprequesthandler.do_PUT       r   c                 $    | j                          y r   rs   r#   s    r   do_GETz_httprequesthandler.do_GET   ru   r   c                 $    | j                          y r   rs   r#   s    r   do_HEADz_httprequesthandler.do_HEAD   ru   r   c                 @	   d| _         t        | j                        \  }}|| j                  j                  k7  r|j                  | j                  j                  dz         sq| j                  t        j                  t        j                  d            g        | j                  dk(  rdg| _        | j                  d       | j                          y 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<   |xs d|d<   | j*                  j-                         | j*                  j/                         |d<   n| j*                  j-                         |d<   | j*                  j1                  d      }|r||d<   | j*                  j3                         D cg c]  }|j5                         dvr| c}D ]h  }d|j7                  dd      j9                         z   }| j*                  j1                  |      }|j7                  dd      j;                         }|sd|||<   j | j<                  |d<   d|d<   t        j$                  | j>                        |d<   |j1                  d d      j5                         d!k(  r9t        j@                  | jB                  | jD                  jF                        | _!        | jB                  |d"<   tI        |       |d#<   tK        | j                  tL        jN                        |d$<   tQ        tL        d%      r(tK        | j                  tL        jR                        |d&<   nd|d&<   d|d'<   tT        jV                  jY                  |       d | _-        g | _        d | _.        d | _/        | j                  ja                  || j                        D ]  }	| j                  |	        | j                   s| jc                          | j                          y c c}w )(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   rG   prefixrQ   rk   r	   strurlr   statusmessagecommandsaved_headersrl   rm   server_namer(   server_portsysstrlenrA   rN   get_content_typeget_default_typegetkeyslowerreplaceupperstriprequest_version
url_schemecontinuereaderrfilewfiler)   r   ra   socketserverThreadingMixInrO   r   wsgirefvalidatecheck_environsaved_statuslength_chunkedapplicationsend_headers)
r   r   r   envr   rX   headerhkeyhvalchunks
             r   r[   z_httprequesthandler.do_hgweb   s   !		*e 4;;%%%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$*C ! \\&&(
wwy BB 
 		!F
 V^^C5;;==D<<##F+D<<b)//1D D			! "&!5!5$N!)!A77="%++-?..tzz4::;K;KLDJ JJL*40M",KK44#
 <0'1\66(C#$ (-C#$ O&&s+ [[,,S$2F2FG 	EKK	  

Q
s   Rc                    | j                   st        d      | j                   j                  d d      }t        |d         |d<    | j                  |  d | _        d| _        | j                  D ];  } | j                  |  |d   j                         dk(  s)t        |d         | _        = | j
                  y|d   t        j                  k7  rc| j                  dk7  rT| j                   xr | j                  dk(  | _        | j                  r| j                  dd	       n| j                  d
d       | j                          d| _        y )Ns.   Sending headers before start_response() calledr   r   Fr   HEADr9   zTransfer-Encodingchunkedr}   closeT)r   AssertionErrorr   intsend_responser   r   r   send_headerr   r   HTTP_NOT_MODIFIEDr   close_connectionr   end_headersr   )r   r   rX   s      r   r   z _httprequesthandler.send_headers   s9      A  ((..tQ7l1o.QL)## 	(ADa tzz|//!!A$i	(
 KKQ6#;#;;& )))Pd.B.Bj.P M }}  !4i@  w7 r   Nc                     t        |t              sJ |j                  d d      \  }}t        |      }|| _        d}|D cg c]  }|d   j                         |vs| c}| _        | j                  S c c}w )Nr   )
connectionztransfer-encodingr   )ra   r(   r   r   r   r   r   rl   )r   http_statusrN   ri   rU   r.   bad_headersrX   s           r   rk   z#_httprequesthandler._start_response
  sx    +s+++%%dA.	c4y'9
!A$**,k"AA
 {{
s    A3A3c                    | j                   st        d      | j                  s| j                          | j                  At        |      | j                  kD  rt        d      | j                  t        |      z
  | _        n| j                  r|rdt        |      |fz  }| j                  j                  |       | j                  j                          y )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   rl   z_httprequesthandler._write  s       !OPP"";;"4y4;;&$?  ++D	1DK]]t"c$i%66D



r   c                     | j                   r6| j                  j                  d       | j                  j                          y y )Ns   0

)r   r   r)   r$   r#   s    r   rm   z_httprequesthandler._done&  s0    ==JJ\*JJ r   c                     | j                   j                  r)t        j                  | j                   j                        S t        j
                  j                  |       S r   )rG   serverheaderr   r,   r;   r<   version_stringr#   s    r   r   z"_httprequesthandler.version_string+  sA    ;;##(()A)ABB33BB4HHr   )r   r   r   )r/   r0   r1   r   staticmethodr7   r    rE   r+   rL   rY   r]   rq   rt   rw   ry   r[   r   rk   rl   rm   r   r"   r   r   r3   r3   D   sm    J9 9L;<
6Ob!:	"
Ir   r3   c                   *    e Zd ZdZdZed        Zd Zy)_httprequesthandlersslz*HTTPS handler based on Python's ssl modules   httpsc                 6   	 ddl m} |j                   |j                  dd      }|j                  dd      }|j                  dd      }|j                  | j                  ||||	      | _	        y # t        $ r t	        j
                  t        d            w xY w)
Nr   )sslutils   SSL support is unavailable   web   certificates   devels   servercafiles   serverrequirecert)certfilecafilerequireclientcert)
r   r   wrapserversocketImportErrorr   Abortr   config
configboolrc   )r5   r6   r   r   r   reqcerts         r   r7   z(_httprequesthandlerssl.preparehttpserver6  s    	@"$$ 99V^4 8_5--*>?#44% 5 

  	@++a =>??	@s   A0 0(Bc                     | j                   | _        | j                   j                  d| j                        | _        | j                   j                  d| j
                        | _        y )Nrbwb)requestr   makefilerbufsizer   wbufsizer   r#   s    r   setupz_httprequesthandlerssl.setupN  sE    ,,\\**4?
\\**4?
r   N)r/   r0   r1   __doc__r   r   r7   r   r"   r   r   r   r   1  s"    4J
 
.@r   r   forkc                       e Zd Zy)_mixinN)r/   r0   r1   r"   r   r   r   r   ^  s    r   r   c                 ,    | r| dk7  rt        | d      S |S )N   -s   abr   )optdefaults     r   openlogr   b  s    
sd{CNr   c                   .    e Zd Zej                  rdZd Zy)MercurialHTTPServerr   c                 >   t        j                  j                  | ||fi | d| _        || _        |j                  | |       |j                  dd      }|rd|j                  d      z   }|| _        t        |j                  dd      |j                        }t        |j                  dd      |j                        }|| _        || _        | j                  j                         dd \  | _        | _        | j$                  | _        |j                  dd	      | _        y )
NTr   s   prefixr{   s	   accesslogs   errorlogr   r   s   server-header)r;   r5   r    daemon_threadsr   r7   r   r   r   r   foutferrrK   rH   rc   getsocknameaddrportr   fqaddrr   )	r   r6   appr   r   kwargsr   alogelogs	            r   r    zMercurialHTTPServer.__init__n  s      ))$gHH"!!$+69-FLL..Fryy6@ryy5rww?#{{6681=	49&&IIf.>?r   N)r/   r0   r1   r	   	iswindowsallow_reuse_addressr    r"   r   r   r   r   h  s     @r   r   c                   2     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
        |   |i | y )Ns$   IPv6 is not available on this system)address_familyr   	RepoErrorr   superr   r    )r   r=   r   	__class__s      r   r    zIPv6HTTPServer.__init__  s8    &//!$K"LMMnd,d=f=r   )r/   r0   r1   getattrrc   r  r    __classcell__)r  s   @r   r   r     s    VZ6N> >r   r   c           
         | j                  dd      rt        }nt        }| j                  dd      rt        }nt
        }dd l}|j                          | j                  dd      }t        j                  | 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   getportrc   r   r   r   r   
strtolocalr=   )r6   r   r   clsr	  addressr   insts           r   create_serverr    s    	yy((%	}}VW%! NNii
+G??299VW56D
2sWdOW55<< 
kk34h11$))A,?@A
 	

s   B C4+AC//C4)(rd   osrc   rh   rf   wsgiref.validater   i18nr   r	   r   r   r   r   r
   utilsr   r5   r;   r   urlerrr   r   r   r   r<   r3   r   	threadingactive_countr   r   r   rO   r   r   objectr   r   r  r"   r   r   <module>r     s    	  
       		 
'P PjI->> jIZ @0  @FI((F@&-":":F @:>( >
k  r6**	 	s   !C% %%DD