o ?Og@sN ddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z gdZ dZdZdZdZdZd Zeejjd d ejjDZd Zd ZedjZedjZ edZ!edZ"hdZ#d>ddZ$Gdddej%j&Z'ddZ(e'fddZ)Gdddej*Z+GdddZ,zddl-Z-Wn e.yYnwGd d!d!e,Z/e 0d!Gd"d#d#e1Z2Gd$d%d%e2Z3Gd&d'd'e2Z4Gd(d)d)e2Z5Gd*d+d+e2Z6Gd,d-d-e2Z7Gd.d/d/e2Z8Gd0d1d1e2Z9Gd2d3d3e9Z:Gd4d5d5e9Z;Gd6d7d7e9ZGdlsrids[^:\s][^:\r\n]*s\n(?![ \t])|\r(?![ \t\n])z[- ]z[-]>ZPATCHZPOSTZPUTdatac Cs\ z|dWSty-}zt|j|j|j|jd|||j|j|fdd}~ww)Nlatin-1z`%s (%.20r) is not valid Latin-1. Use %s.encode('utf-8') if you want to send it encoded in UTF-8.)encodeUnicodeEncodeErrorencodingobjectstartendtitle)rnameerrrrr_encodes" r(c@eZdZddZdS) HTTPMessagecCsl |d}t|}g}d}|D] }|d||kr"d}n |dds,d}|r3||q|S)N:r)lowerlenkeysisspaceappend)selfr&nZlstZhitlinerrrgetallmatchingheaderss   z!HTTPMessage.getallmatchingheadersN)__name__ __module__ __qualname__r5rrrrr*s r*cCs\ g} |td}t|tkrtd||t|tkr&tdt|dvr- |Sq)NTr, header linezgot more than %d headers  )readline_MAXLINEr.rr1 _MAXHEADERSr)fpheadersr4rrr _read_headerss    rCcCs. t|}d|d}tjj|d|S)Nr= iso-8859-1)_class)rCjoindecodeemailparserZParserZparsestr)rArErBZhstringrrr parse_headerss rJcseZdZd@ddZddZddZd d Zd d Zfd dZfddZ ddZ ddZ dAddZ ddZ ddZddZddZdAdd Zd!d"Zd#d$Zd%d&ZdBd(d)ZdBd*d+ZdBfd,d- Zd.d/Zd0d1Zd2d3ZdAd4d5Zd6d7Zd8d9Zd:d;Zdd?Z Z!S)CrrNcCsR|d|_||_||_d|_|_t|_t|_t|_ t|_ t|_ t|_ t|_ dS)Nrb)ZmakefilerA debuglevel_methodrBmsg_UNKNOWNversionstatusreasonchunked chunk_leftlength will_close)r2sockrLmethodurlrrr__init__s   zHTTPResponse.__init__c Cst|jtdd}t|tkrtd|jdkr!tdt||s't dz | dd\}}}Wn!t ySz | dd\}}d}Wn t yPd}YnwYnw| d sa| t|zt|}|d ksn|d krrt|Wn t y~t|w|||fS) Nr,rDz status linerzreply:z-Remote end closed connection without responsezHTTP/ri)strrAr>r?r.rrLprintreprrsplit ValueError startswith _close_connrint)r2r4rPrQrRrrr _read_statuss<       zHTTPResponse._read_statusc Cs|jdurdS |\}}}|tkrnt|j}|jdkr#td|~q||_|_| |_ |dvr8d|_ n | drAd|_ nt |t|j|_|_|jdkre|jD] \}}td|d |qX|jd }|rz|d krzd|_d|_nd |_||_d|_|jd }|r|jszt||_Wn tyd|_Yn w|jdkrd|_nd|_|tks|tksd|krdksn|jdkrd|_|js|js|jdurd|_dSdSdSdS)NTrzheaders:)zHTTP/1.0zHTTP/0.9 zHTTP/1. header:r+transfer-encodingrSFcontent-lengthrHEAD)rBreZCONTINUErCrArLr^coderQstriprRrPrbrrJrNitemsgetr-rSrT _check_closerVrUrdraZ NO_CONTENTZ NOT_MODIFIEDrM) r2rPrQrRZskipped_headershdrvalZtr_encrUrrrbegin7sf                 zHTTPResponse.begincCsv|jd}|jdkr|rd|vrdSdS|jdrdS|r)d|vr)dS|jd}|r9d|vr9dSdS)NZ connectionrgcloseTFz keep-alivezproxy-connection)rBrprPr-)r2ZconnZpconnrrrrqs    zHTTPResponse._check_closecCs|j}d|_|dSN)rAru)r2rArrrrcs zHTTPResponse._close_conncs6ztW|jr|dSdS|jr|wwrv)superrurArcr2 __class__rrrus   zHTTPResponse.closecs"t|jr|jdSdSrv)rwflushrArxryrrr{s zHTTPResponse.flushcCs dS)NTrrxrrrreadableszHTTPResponse.readablecCs |jduSrv)rArxrrriscloseds zHTTPResponse.isclosedcCs |jdurdS|jdkr|dS|jr||S|durS|jdur,||jkr,|j}|j|}|s<|r<||S|jdurQ|jt|8_|jsQ||S|jdur^|j}nz||j}Wn t yr|wd|_||S)Nr=rlr) rArMrcrS _read_chunkedrUreadr. _safe_readr )r2amtsrrrrs>        zHTTPResponse.readcCs |jdurdS|jdkr|dS|jr||S|jdur0t||jkr0t|d|j}|j|}|s@|r@||S|jdurS|j|8_|jsS||S)Nrrl) rArMrcrS_readinto_chunkedrUr. memoryviewreadinto)r2br3rrrrs(      zHTTPResponse.readintocCsh|jtd}t|tkrtd|d}|dkr!|d|}zt|dWSty3|w)Nr,z chunk size;r) rAr>r?r.rfindrdrarc)r2r4irrr_read_next_chunk_size s     z"HTTPResponse._read_next_chunk_sizecCs< |jtd}t|tkrtd|sdS|dvrdSq)NTr,z trailer liner:)rAr>r?r.rr2r4rrr_read_and_discard_trailers z&HTTPResponse._read_and_discard_trailercCsf|j}|s1|dur|dz|}Wn tytdw|dkr.||d}||_|S)Nr[r=r)rTrrrar rrc)r2rTrrr_get_chunk_left*s   zHTTPResponse._get_chunk_leftcCsg}z: |}|dur n*|dur#||kr#||||||_n||||dur3||8}d|_qd|WStyJtd|w)NTrr=)rr1rrTrFr )r2rvaluerTrrrr~Bs&   zHTTPResponse._read_chunkedcCsd}t|}z: |}|dur|WSt||kr(||}|||_||WS|d|}||}||d}||7}d|_qtyQtt|d|w)Nr)rrr._safe_readintorTr bytes)r2rZ total_bytesZmvbrTr3Ztemp_mvbrrrrXs(        zHTTPResponse._readinto_chunkedcCs0 |j|}t||krt||t||Srv)rArr.r )r2rrrrrrps   zHTTPResponse._safe_readcCs< t|}|j|}||krtt|d||||Srv)r.rArr r)r2rrr3rrrr|s  zHTTPResponse._safe_readintocCs |jdus |jdkr dS|jr||S|jdur&|dks#||jkr&|j}|j|}|s6|r6||S|jdurD|jt|8_|SNrlr=r)rArMrS_read1_chunkedrUread1rcr.)r2r3resultrrrrs   zHTTPResponse.read1cCs4|jdus |jdkr dS|jr||S|j|S)Nrlr=)rArMrS _peek_chunkedpeek)r2r3rrrrs   zHTTPResponse.peekcs|jdus |jdkr dS|jrt|S|jdur&|dks#||jkr&|j}|j|}|s6|r6||S|jdurD|jt|8_|Sr)rArMrSrwr>rUrcr.)r2limitrryrrr>s   zHTTPResponse.readlinecCsd|}|dus |dkrdSd|kr|ksn|}|j|}|jt|8_|s0td|S)Nrr=)rrArrTr.r )r2r3rTrrrrrs zHTTPResponse._read1_chunkedcCsBz|}Wn tyYdSw|durdS|j|d|S)Nr=)rr rAr)r2r3rTrrrrs  zHTTPResponse._peek_chunkedcCs |jSrv)rAfilenorxrrrr zHTTPResponse.filenocCsD |jdur t|j|p|}t|tst|ds|Sd|S)N__iter__z, )rBrZget_all isinstancer]hasattrrF)r2r&defaultrBrrr getheaders  zHTTPResponse.getheadercCs |jdur tt|jSrv)rBrlistrorxrrr getheaderss zHTTPResponse.getheaderscCs|SrvrrxrrrrszHTTPResponse.__iter__cC |jSrv)rBrxrrrinfoszHTTPResponse.infocCrrv)rYrxrrrgeturls zHTTPResponse.geturlcCrrv)rQrxrrrgetcodeszHTTPResponse.getcode)rNNrv)r)"r6r7r8rZrertrqrcrur{r|r}rrrrrr~rrrrrr>rrrrrrrrr __classcell__rrryrrs> !H   ("      rc@seZdZdZdZeZeZdZ dZ e ddZ e ddZ d ejd d fd d Zd7d dZddZddZddZddZddZddZddZddZd8d d!Z  d9d"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Z d:dd.d/d0Z!d ifdd.d1d2Z"d3d4Z#d5d6Z$d S);rrgzHTTP/1.1r,rcCs t|tjSrv)rio TextIOBase)streamrrr _is_textIO s zHTTPConnection._is_textIOcCsf |dur|tvr dSdSt|drdSzt|}|jWSty'Ynwt|tr1t|SdS)Nrr) upper_METHODS_EXPECTING_BODYrrnbytes TypeErrorrr]r.)bodyrXZmvrrr_get_content_length&s     z"HTTPConnection._get_content_lengthN cCsn||_||_||_d|_g|_d|_t|_d|_d|_ d|_ i|_ | ||\|_ |_||j tj|_dSrv)timeoutsource_address blocksizerW_buffer_HTTPConnection__response_CS_IDLE_HTTPConnection__staterM _tunnel_host _tunnel_port_tunnel_headers _get_hostporthostport_validate_hostsocketZcreate_connection_create_connection)r2rrrrrrrrrZFs  zHTTPConnection.__init__cCs@ |jrtd|||\|_|_|r||_dS|jdS)Nz.Can't set up tunnel for established connection)rW RuntimeErrorrrrrclear)r2rrrBrrr set_tunnel\s zHTTPConnection.set_tunnelcCs|dur`|d}|d}||krIz t||dd}Wn#tyA||dddkr3|j}n td||ddYnw|d|}n|j}|r`|ddkr`|ddkr`|dd}||fS) Nr+]r,r\znonnumeric port: '%s'r[r)rfindrdra default_portr )r2rrrjrrrrts"    zHTTPConnection._get_hostportcCs ||_dSrv)rL)r2levelrrrset_debuglevelrzHTTPConnection.set_debuglevelc Csd|jd|jf}|g}|jD]\}}||d|ddq|d|d|~|j|j |j d}| \}}}|t j jkrZ|td |d | |jtd } t| tkrmtd | sqdS| dvrwdS|jdkrtd| q[)NsCONNECT %s:%d HTTP/1.0 asciiz:  rr;r=rXzTunnel connection failed:  Tr,r9r:rrh)rrrrror1sendrFresponse_classrWrMrehttp HTTPStatusZOKruOSErrorrnrAr>r?r.rrLr^rG) r2connectrBheaderrresponserPrmmessager4rrr_tunnels2    zHTTPConnection._tunnelc Cs td||j|j||j|jf|j|j|_z |jt j t j dWnt y>}z |j t jkr4WYd}~nd}~ww|jrH|dSdS)Nzhttp.client.connectr,)sysauditrrrrrrWZ setsockoptrZ IPPROTO_TCPZ TCP_NODELAYrerrnoZ ENOPROTOOPTrrr2errrrs    zHTTPConnection.connectcCs` t|_z|j}|rd|_|W|j}|r d|_|dSdS|j}|r/d|_|wwrv)rrrWrur)r2rWrrrrrus$  zHTTPConnection.closecCs" |jdur|jr|nt|jdkrtdt|t|dr\|jdkr+td||}|r;|jdkr;td | |j }|sG dS|rN| d}t d|||j|qsz/HTTPConnection._send_request..rr,rzaccept-encodingrrjriFrzUnable to determine size of %rTzTransfer-EncodingrSzContent-Lengthrr) frozensetrrrLr^rr]rorr(r) r2rXrYrrBrZ header_namesZskipsZcontent_lengthrrrrrrrs4       zHTTPConnection._send_requestcCs |jr |jr d|_|jtks|jrt|j|jdkr*|j|j|j|jd}n |j|j|jd}z&z| Wn t yF| wt |_|j rT| |WS||_|WS| )Nrr)rr}rrrrLrrWrMrtConnectionErrorrurrV)r2rrrr getresponse3s4     zHTTPConnection.getresponse)NN)NF)FFrv)%r6r7r8rrrr HTTP_PORTrrrL staticmethodrrr_GLOBAL_DEFAULT_TIMEOUTrZrrrrrrurrrrrrrrrrrrrrrrrrrsL    ( 6     .rcsFeZdZ eZdddejdfddddfdd ZfddZZ S)HTTPSConnectionNr)contextcheck_hostnamerc stt|j||||| d|dus|dus|dur$ddl} | dtd||_||_|durEt }|j dkr=| dg|j durEd|_ |j tjk} |durR|j}|rZ| sZtd|s^|rl||||j durld|_ ||_|dury||j_dSdS) N)rrzTkey_file, cert_file and check_hostname are deprecated, use a custom context instead.r[rgzhttp/1.1TzMcheck_hostname needs a SSL context with either CERT_OPTIONAL or CERT_REQUIRED)rwrrZwarningswarnDeprecationWarningkey_file cert_filesslZ_create_default_https_contextrZset_alpn_protocolsZpost_handshake_authZ verify_modeZ CERT_NONErraZload_cert_chain_context) r2rrr!r"rrrrrrZ will_verifyryrrrZ~s>       zHTTPSConnection.__init__cs8 t|jr |j}n|j}|jj|j|d|_dS)N)server_hostname)rwrrrr$Z wrap_socketrW)r2r%ryrrrs   zHTTPSConnection.connect) r6r7r8 HTTPS_PORTrrrrZrrrrryrrws'rc@ eZdZdS)rNr6r7r8rrrrrsrc@r')rNr(rrrrrrc@r')r Nr(rrrrr r)r c@r))rcCs|f|_||_dSrv)argsrP)r2rPrrrrZs zUnknownProtocol.__init__Nr6r7r8rZrrrrr rc@r')rNr(rrrrrr)rc@r')r Nr(rrrrr r)r c@s$eZdZdddZddZejZdS)r NcCs|f|_||_||_dSrv)r*partialexpected)r2r-r.rrrrZs zIncompleteRead.__init__cCs2|jdur d|j}nd}d|jjt|j|fS)Nz, %i more expectedr\z%s(%i bytes read%s))r.rzr6r.r-rrrr__repr__s   zIncompleteRead.__repr__rv)r6r7r8rZr/r"__str__rrrrr s  r c@r')r Nr(rrrrr r)r c@r')r Nr(rrrrr r)r c@r')rNr(rrrrrr)rc@r')rNr(rrrrrr)rc@r))rcCs|st|}|f|_||_dSrv)r_r*r4rrrrrZs zBadStatusLine.__init__Nr+rrrrrr,rc@r))rcCst|dt|fdS)Nz&got more than %d bytes when reading %s)rrZr?)r2Z line_typerrrrZs zLineTooLong.__init__Nr+rrrrrr,rc@r))rcOs(t|dtj|g|Ri|dS)Nr\)rrZConnectionResetError)r2poskwrrrrZs zRemoteDisconnected.__init__Nr+rrrrrr,r)r)BZ email.parserrHZ email.messagerrrrerrZcollections.abcrZ urllib.parser__all__rr&rOrrrglobalsupdater __members__rrr?r@compile fullmatchr rr r rrr(rZMessager*rCrJBufferedIOBaserrr# ImportErrorrr1 Exceptionrrr rrr r r r rrrrr1rrrrrrs~F       +`   ;