o ]Lb7@snddlmZddlZddlZddlZddlZddlZddlZddlZ ddl m Z ddl m Z mZddlmZmZm Z mZddlmZejZejZejZejZdd lmZd d ZGd d d eZGdddejZGdddeZ z ddl!Z!e!"ej#Z$Wne%ye&edrej'Z$nGdddeZ$YnwddZ(Gddde$ejeZ)Gddde)Z*ddZ+dS))absolute_importN)_)getattropen)encodingerrorpycompatutil)urlutil)commoncCs2d|vr |dd\}}n|d}}t||fS)zReturn path and query that has been split from uri Just like CGI environment, the path is unquoted, the query is not. ?r )spliturlrequnquote)uripathqueryr8/usr/lib/python3/dist-packages/mercurial/hgweb/server.py _splitURI+s rc@s,eZdZddZddZddZddZd S) _error_loggercCs ||_dSN)handler)selfrrrr__init__9s z_error_logger.__init__cCsdSrrrrrrflush<sz_error_logger.flushcCs||ddS)N ) writelinesr)rstrrrrwrite?sz_error_logger.writecCs"|D] }|jdt|qdS)Nz HG error: %s)r log_errorr strfromlocal)rseqmsgrrrr!Bsz_error_logger.writelinesN)__name__ __module__ __qualname__rrr#r!rrrrr8s  rc@seZdZdZeddZddZddZdd Zd d Z d$d dZ ddZ ddZ ddZ ddZddZddZd%ddZddZd d!Zd"d#ZdS)&_httprequesthandlershttpcCsdS)z*Prepare .socket of new HTTPServer instanceNr) httpserveruirrrpreparehttpserverKsz%_httprequesthandler.preparehttpservercOs$d|_tjj|g|Ri|dS)NHTTP/1.1)protocol_version httpservermodbasehttprequesthandlerr)rargskargsrrrrOsz_httprequesthandler.__init__c Gs8|td|jd|||fd|dS)Nz%s - - [%s] %srr )r#r sysbytesclient_addresslog_date_time_stringr)rfpformatr3rrr_log_anySs z_httprequesthandler._log_anycG|j|jj|g|RdSr)r:servererrorlogrr9r3rrrr$az_httprequesthandler.log_errorcGr;r)r:r< accesslogr>rrr log_messagedr?z_httprequesthandler.log_message-c CsXg}t|drdd|jD}|d|jt|t|dddt|DdS)NsheaderscSsg|] }|ddr|qS)rzx-) startswith.0hrrr js z3_httprequesthandler.log_request..z "%s" %s %s%srcSsg|]}d|qS)z %s:%srrDrrrrGrs) r safehasattrheadersitemsrA requestliner"joinsorted)rcodesizexheadersrrr log_requestgs z_httprequesthandler.log_requestc CsFz|WdStjy"}z|jtjkrWYd}~dSd}~wwr)do_hgwebsocketrerrnoEPIPE)rinstrrrdo_writeus z_httprequesthandler.do_writec Csz|WdStyN}z;t|ttjfr|jtjks4dt j t }t d}|d|j|||dg|d|WYd}~dSd}~ww)Nr z6Exception happened during processing request '%s':%s%sz500 Internal Server ErrorsInternal Server Error)rW Exception isinstanceOSErrorrSrrT ECONNRESETrL tracebackformat_exceptionsysexc_infochrr$r_start_response_write_done)retbnewlinerrrdo_POST|s&   z_httprequesthandler.do_POSTcC |dSrrhrrrrdo_PUT z_httprequesthandler.do_PUTcCrirrjrrrrdo_GETrlz_httprequesthandler.do_GETc Csd|_t|j\}}||jjkr9||jjds9|tt dg|j dkr.dg|_ | d|dSi}d|d<|j |d <|jj|d <t|jj|d <|j|d <t|jj|d <t|t|jjd|d<|jd|d<|jd|d<|pd|d<tjr|jdur|j|d<n|j|d<|jd}n|jjdur|jj|d<n|jj|d<|jd}|r||d<dd|jDD] }d|dd}|j|}|dd }|r|||<q|j!|d<d|d<t|j"|d <|d!d"#d#krt $|j%|j&j'|_%|j%|d$<t(||d%<t)|jt*j+|d&<t,-t*d'r8t)|jt*j.|d(<nd|d(<d|d)<t/j01|d|_2g|_ d|_3d|_4|j5||jD]}| |qZ|jsk|6|dS)*NF/iPOST) ConnectionCloses Not FoundzCGI/1.1GATEWAY_INTERFACEREQUEST_METHOD SERVER_NAME SERVER_PORT REQUEST_URI SCRIPT_NAME PATH_INFOr REMOTE_HOST REMOTE_ADDRr QUERY_STRING CONTENT_TYPEcontent-lengthCONTENT_LENGTHcSsg|] }|dvr|qS))z content-typer}lowerrDrrrrGs  z0_httprequesthandler.do_hgweb..HTTP_rBr SERVER_PROTOCOL)r rz wsgi.versionzwsgi.url_scheme HTTP_EXPECTs 100-continuez wsgi.inputz wsgi.errorszwsgi.multithreads ForkingMixInzwsgi.multiprocessz wsgi.run_once)7 sent_headersrrr<prefixrCrbr strurlr statusmessagecommand saved_headersrcrd server_namer" server_portsysstrlenr6ispy3rIget_content_typeget_default_typeget typeheadertype getheaderkeysreplaceupperstriprequest_version url_schemercontinuereaderrfilewfiler#rrZ socketserverThreadingMixInr rH ForkingMixInwsgirefvalidate check_environ saved_statuslength_chunked application send_headers) rrrenvrheaderhkeyhvalchunkrrrrRs                  z_httprequesthandler.do_hgwebcCs|jstd|jdd}t|d|d<|j|d|_d|_|jD]}|j||d dkr:t|d|_q$|jdura|dt j kra|j oO|j dk|_|jr[|ddn|d d |d |_dS) Ns.Sending headers before start_response() calledr rFr}r/zTransfer-EncodingchunkedrpcloseT)rAssertionErrorrint send_responserrr send_headerrr HTTP_NOT_MODIFIEDclose_connectionr end_headersr)rrrFrrrrs,     z _httprequesthandler.send_headersNcsJt|tsJ|dd\}}t|}||_dfdd|D|_|jS)Nr ) connectionztransfer-encodingcs g|] }|dvr|qS)rrrD bad_headersrrrGsz7_httprequesthandler._start_response..)rZr"rrrrrc)r http_statusrIr`rNr'rrrrbs z#_httprequesthandler._start_responsecCs|jstd|js||jdur't||jkrtd|jt||_n |jr4|r4dt||f}|j||j dS)Ns+data written before start_response() calledsLContent-length header sent, but more bytes than specified are being written.s%x %s ) rrrrrrrrr#r)rdatarrrrcs   z_httprequesthandler._writecCs$|jr|jd|jdSdS)Ns0 )rrr#rrrrrrd*s z_httprequesthandler._donecCs"|jjr t|jjStj|Sr)r< serverheaderrr%r1r2version_stringrrrrr/s z"_httprequesthandler.version_string)rBrBr)r(r)r*r staticmethodr.rr:r$rArQrWrhrkrmrRrrbrcrdrrrrrr+Gs&  X   r+c@s(eZdZdZdZeddZddZdS)_httprequesthandlersslz*HTTPS handler based on Python's ssl moduleshttpscCstz ddlm}|jWntyttdw|dd}|dd}|dd}|j|j ||||d |_ dS) Nr)sslutilsSSL support is unavailableweb certificatesdevels servercafilesserverrequirecert)certfilecafilerequireclientcert) rrwrapserversocket ImportErrorrAbortrconfig configboolrS)r,r-rrrreqcertrrrr.:s        z(_httprequesthandlerssl.preparehttpservercCs0|j|_|jd|j|_|jd|j|_dS)Nrbwb)requestrmakefilerbufsizerwbufsizerrrrrsetupRsz_httprequesthandlerssl.setupN)r(r)r*__doc__rrr.rrrrrr5s   rsforkc@s eZdZdS)_mixinN)r(r)r*rrrrrbsrcCs|r |dkr t|dS|S)N-sab)r)optdefaultrrropenlogfs  rc@seZdZejr dZddZdS)MercurialHTTPServerrc Kstjj|||fi|d|_||_||||dd}|r'd|d}||_t |dd|j }t |dd|j }||_ ||_ |jdd\|_|_|j|_|dd |_dS) NTrsprefixrns accesslogserrorlogrrs server-header)r1r,rdaemon_threadsrr.rrrrfoutferrr@r=rS getsocknameaddrportrfqaddrr) rr-apprrkwargsralogelogrrrrrs  zMercurialHTTPServer.__init__N)r(r)r*r iswindowsallow_reuse_addressrrrrrrls rcs(eZdZeeddZfddZZS)IPv6HTTPServerAF_INET6Ncs2|jdur ttdtt|j|i|dS)Ns$IPv6 is not available on this system)address_familyr RepoErrorrsuperrr)rr3r __class__rrrs zIPv6HTTPServer.__init__)r(r)r*rrSrr __classcell__rrrrrs rc Cs|ddr t}nt}|ddrt}nt}z ddl}|Wn3tySt j zt t Wn t y>t t Ynwt }t d|t |Ynw|dd}t|dd}z |||||f|WStjy}zttd||t|jd fd}~ww) Nrrsipv6rslatin1saddresssports"cannot start server at '%s:%d': %sr )rrr+rrr mimetypesinitUnicodeDecodeErrorr_argv importlibreloadAttributeErrorgetdefaultencodingsetdefaultencodingr getportrSrrrr strtolocalr3) r-rrclsroldencaddressrrVrrr create_serversB        r), __future__rrTrosrSr_r]wsgiref.validateri18nrr rrrrrr utilsr r,r1rurlerrrr robjectrr2r+r threading active_countrrrrHrrrrrrrrrsH     o#