o ,º]ò¹ã @sdZddlmZmZmZmZddlmZmZm Z m Z ddl m Z ddl mZddl mZddlmZddlZddlZddlZdd lmZddlZdd lmZe rWdd lmZndd lmZgd ¢Zd Z dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2d Z3d!Z4d"Z5d#Z6d$Z7d%Z8d&Z9d'Z:d(Z;d)Zd,Z?d-Z@d.ZAd/ZBd0ZCd1ZDd2ZEd3ZFd4ZGd5ZHd6ZId7ZJd8ZKd9ZLd:ZMd;ZNdZQd?ZRd@ZSdAZTdBZUdCZVdDZWdEZXdFZYdGZZiddH“ddI“ddJ“ddK“ddL“ddM“ddN“ddO“ddP“ddQ“d dR“d!dS“d"dT“d#dU“d$dV“dWdX“d%dY“id&dZ“d'd[“d(d\“d)d]“d*d^“d+d_“d,d`“d-da“d.db“d/dc“d0dd“d1de“d2df“d3dg“d4dh“d5di“d6dj“¥dkdldmdndodpdqdrdsdtdudvœ ¥Z[dwZ\dxZ]dZ^Gdydz„dzej_ƒZ`e`fd{d|„ZaebƒZcGd}d~„d~ejdƒZeGdd€„d€ebƒZfz ddlgZgddlgmhZhWn eiyŽYnwGd‚dƒ„dƒefƒZje kdƒ¡Gd„d…„d…elƒZmGd†d‡„d‡emƒZnGdˆd‰„d‰emƒZoGdŠd‹„d‹emƒZpGdŒd„demƒZqGdŽd„demƒZrGdd‘„d‘emƒZsGd’d“„d“emƒZtGd”d•„d•etƒZuGd–d—„d—etƒZvGd˜d™„d™etƒZwGdšd›„d›emƒZxGdœd„demƒZyemZzdS)žaD HTTP/1.1 client library A backport of the Python 3.3 http/client.py module for python-future. HTTPConnection goes through a number of "states", which define when a client may legally make another request or fetch the response for a particular request. This diagram details these state transitions: (null) | | HTTPConnection() v Idle | | putrequest() v Request-started | | ( putheader() )* endheaders() v Request-sent | | response = getresponse() v Unread-response [Response-headers-read] |\____________________ | | | response.read() | putrequest() v v Idle Req-started-unread-response ______/| / | response.read() | | ( putheader() )* endheaders() v v Request-started Req-sent-unread-response | | response.read() v Request-sent This diagram presents the following rules: -- a second request may not be started until {response-headers-read} -- a response [object] cannot be retrieved until {request-sent} -- there is no differentiation between an unread response body and a partially read response body Note: this enforcement is applied by the HTTPConnection class. The HTTPResponse class does not enforce this state machine, which implies sophisticated clients may accelerate the request/response pipeline. Caution should be taken, though: accelerating the states beyond the above pattern may imply knowledge of the server's connection-close behavior for certain requests. For example, it is impossible to tell whether the server will close the connection UNTIL the response headers have been read; this means that further requests cannot be placed into the pipeline until it is known that the server will NOT be closing the connection. Logical State __state __response ------------- ------- ---------- Idle _CS_IDLE None Request-started _CS_REQ_STARTED None Request-sent _CS_REQ_SENT None Unread-response _CS_IDLE Req-started-unread-response _CS_REQ_STARTED Req-sent-unread-response _CS_REQ_SENT é)Úabsolute_importÚdivisionÚprint_functionÚunicode_literals)ÚbytesÚintÚstrÚsuper)ÚPY2)Úparser)Úmessage)Úcreate_connectionN)Úurlsplit)Úarray)ÚIterable)Ú HTTPResponseÚHTTPConnectionÚ HTTPExceptionÚ NotConnectedÚUnknownProtocolÚUnknownTransferEncodingÚUnimplementedFileModeÚIncompleteReadÚ InvalidURLÚImproperConnectionStateÚCannotSendRequestÚCannotSendHeaderÚResponseNotReadyÚ BadStatusLineÚerrorÚ responseséPi»ÚUNKNOWNÚIdlezRequest-startedz Request-sentédéeéféÈéÉéÊéËéÌéÍéÎéÏéâi,i-i.i/i0i1i3ii‘i’i“i”i•i–i—i˜i™iši›iœiižiŸi é¡i¦i§i¨iªé¬é­é¯éôéõéöé÷éøéùiûiþéÿÚContinuezSwitching ProtocolsÚOKÚCreatedÚAcceptedzNon-Authoritative Informationz No Contentz Reset ContentzPartial ContentzMultiple ChoiceszMoved PermanentlyÚFoundz See Otherz Not Modifiedz Use Proxyi2z(Unused)zTemporary Redirectz Bad RequestÚ UnauthorizedzPayment RequiredÚ Forbiddenz Not FoundzMethod Not AllowedzNot AcceptablezProxy Authentication RequiredzRequest TimeoutÚConflictÚGonezLength RequiredzPrecondition FailedzRequest Entity Too LargezRequest-URI Too LongzUnsupported Media TypezRequested Range Not SatisfiablezExpectation FailedzPrecondition RequiredzToo Many RequestszRequest Header Fields Too LargezInternal Server ErrorzNot Implementedz Bad GatewayzService UnavailablezGateway TimeoutzHTTP Version Not SupportedzNetwork Authentication Required) r0r1r2r3r4r5r6r7r8r9r:iic@óeZdZdd„ZdS)Ú HTTPMessagecCsj| ¡d}t|ƒ}g}d}| ¡D] }|d|… ¡|kr!d}n |dd… ¡s+d}|r2| |¡q|S)aºFind all header lines matching a given header name. Look through the list of headers and find all lines matching a given header name (and their continuation lines). A list of the lines is returned, without interpretation. If the header does not occur, an empty list is returned. If the header occurs multiple times, all occurrences are returned. Case is not important in the header name. ú:rNé)ÚlowerÚlenÚkeysÚisspaceÚappend)ÚselfÚnameÚnÚlstÚhitÚline©rSú>/usr/lib/python3/dist-packages/future/backports/http/client.pyÚgetallmatchingheadersðs   €z!HTTPMessage.getallmatchingheadersN)Ú__name__Ú __module__Ú __qualname__rUrSrSrSrTrEés rEcCs|g} | td¡}t|ƒtkrtdƒ‚| |¡t|ƒtkr%tdtƒ‚|dvr*nqtdƒ |¡  d¡}t j |d  |¡S) aGParses only RFC2822 headers from a file pointer. email Parser wants to see strings rather than bytes. But a TextIOWrapper around self.rfile would buffer too many bytes from the stream, bytes which we later need to read as bytes. So we read the correct bytes here, as bytes, for email Parser to parse. TrGú header linezgot more than %d headers©ó ó ór]ú iso-8859-1)Ú_class) ÚreadlineÚ_MAXLINErIÚ LineTooLongrLÚ _MAXHEADERSrrÚjoinÚdecodeÚ email_parserÚParserÚparsestr)Úfpr_ÚheadersrRÚhstringrSrSrTÚ parse_headerss     ø rlcsêeZdZdeddfdd„Zdd„Zdd„Zd d „Zd d „Z‡fd d„Z ‡fdd„Z dd„Z dd„Z d3‡fdd„ Z dd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd3d'd(„Zd)d*„Zd+d,„Zd-d.„Zd/d0„Zd1d2„Z‡ZS)4rrNcCsh| d¡|_||_|turt dtd¡||_d|_|_ t |_ t |_ t |_ t |_t |_t |_t |_dS)NÚrbúithe 'strict' argument isn't supported anymore; http.client now always assumes HTTP/1.x compliant servers.é)ÚmakefileriÚ debuglevelÚ_strict_sentinelÚwarningsÚwarnÚDeprecationWarningÚ_methodrjÚmsgÚ_UNKNOWNÚversionÚstatusÚreasonÚchunkedÚ chunk_leftÚlengthÚ will_close)rMÚsockrqÚstrictÚmethodÚurlrSrSrTÚ__init__*s þ  zHTTPResponse.__init__c Cst|j td¡dƒ}t|ƒtkrtdƒ‚|jdkr!tdt|ƒƒ|s't |ƒ‚z |  dd¡\}}}Wn!t ySz |  dd¡\}}d}Wn t yPd}YnwYnw|  d¡sa|  ¡t |ƒ‚zt|ƒ}|d ksn|d krrt |ƒ‚Wn t y~t |ƒ‚w|||fS) NrGr^z status linerzreply:roÚzHTTP/r$iç)rrir`rarIrbrqÚprintÚreprrÚsplitÚ ValueErrorÚ startswithÚ _close_connr)rMrRryrzr{rSrSrTÚ _read_statusLs<    þ€ü ÿ ÿ zHTTPResponse._read_statuscCsî|jdurdS | ¡\}}}|tkrn& |j td¡}t|ƒtkr'tdƒ‚| ¡}|s.n |j dkr8t d|ƒqq||_ |_ | ¡|_ |dvrMd|_n | d¡rVd |_nt|ƒ‚t|jƒ|_|_|j dkru|jD] }t d|d d qk|j d ¡}|rŠ| ¡d krŠd|_d|_nd|_| ¡|_d|_|j d¡}|j d ¡}|rÃ|jsÃzt|ƒ|_Wn ty¹d|_Yn w|jdkrÂd|_nd|_|tksÞ|tksÞd|krØdksÞn|jdkrád|_|jsñ|jsó|jdurõd|_dSdSdSdS)NTrGrYrzheader:)zHTTP/1.0zHTTP/0.9é zHTTP/1.é ú )Úendztransfer-encodingr|Fúcontent-lengthr$r'ÚHEAD)rjrŒÚCONTINUErir`rarIrbÚstriprqr†Úcoderzr{ryrŠrrlrwÚgetrHr|r}Ú _check_closerr~rr‰Ú NO_CONTENTÚ NOT_MODIFIEDrv)rMryrzr{ÚskipÚhdrÚtr_encr~rSrSrTÚbeginlst    øû            ÿ € ÿ  ýzHTTPResponse.begincCs‚|j d¡}|jdkr|j d¡}|rd| ¡vrdSdS|j d¡r%dS|r/d| ¡vr/dS|j d¡}|r?d| ¡vr?dSdS)NÚ connectionrŽÚcloseTFz keep-alivezproxy-connection)rjr–ryrH)rMÚconnÚpconnrSrSrTr—¼s     zHTTPResponse._check_closecCs|j}d|_| ¡dS©N)rirŸ)rMrirSrSrTr‹Ús zHTTPResponse._close_conncs tƒ ¡|jr| ¡dSdSr¢)r rŸrir‹©rM©Ú __class__rSrTrŸßs  ÿzHTTPResponse.closecs"tƒ ¡|jr|j ¡dSdSr¢)r Úflushrir£r¤rSrTr¦és ÿzHTTPResponse.flushcCsdS)NTrSr£rSrSrTÚreadableîózHTTPResponse.readablecCs |jduS)z!True if the connection is closed.N)rir£rSrSrTÚisclosedós zHTTPResponse.isclosedcs¬|jdur tdƒS|jdkr| ¡tdƒS|dur$ttt|ƒ |¡ƒS|jr+| ¡S|j dur6|j ¡}nz|  |j ¡}Wn t yJ| ¡‚wd|_ | ¡t|ƒS)Nr]r’r) rirrvr‹r rÚreadr|Ú_readall_chunkedr~Ú _safe_readr)rMÚamtÚsr¤rSrTrªýs(     þzHTTPResponse.readcCsÒ|jdurdS|jdkr| ¡dS|jr| |¡S|jdur/t|ƒ|jkr/t|ƒd|j…}trD|j  t|ƒ¡}t|ƒ}||d|…<n|j  |¡}|sT|rT| ¡|S|jdurg|j|8_|jsg| ¡|S)Nrr’) rirvr‹r|Ú_readinto_chunkedr~rIÚ memoryviewr rªÚreadinto)rMÚbÚdatarOrSrSrTr±s.      üzHTTPResponse.readintocCsh|j td¡}t|ƒtkrtdƒ‚| d¡}|dkr!|d|…}zt|dƒWSty3| ¡‚w)NrGz chunk sizeó;ré) rir`rarIrbÚfindrr‰r‹)rMrRÚirSrSrTÚ_read_next_chunk_sizeAs     üz"HTTPResponse._read_next_chunk_sizecCs< |j td¡}t|ƒtkrtdƒ‚|sdS|dvrdSq)NTrGz trailer linerZ)rir`rarIrb©rMrRrSrSrTÚ_read_and_discard_trailerQs ÷z&HTTPResponse._read_and_discard_trailercCsš|jtksJ‚|j}g} |dur.z | ¡}|dkrWn"Wnty-ttdƒ |¡ƒ‚w| |  |¡¡|  d¡d}q |  ¡|  ¡tdƒ |¡S)NTrr]ro) r|rxr}r¸r‰rrrdrLr¬rºr‹)rMr}ÚvaluerSrSrTr«_s(ÿ ÿ ôzHTTPResponse._readall_chunkedcCs |jtksJ‚|j}d}t|ƒ} |dur3z | ¡}|dkr Wn[Wnty2tt|d|…ƒƒ‚wt|ƒ|krG|  |¡}|||_||St|ƒ|kr^|  |¡}|  d¡d|_||S|d|…}|  |¡}||d…}||7}|  d¡d}q|  ¡|  ¡|S)NrTro) r|rxr}r°r¸r‰rrrIÚ_safe_readintor¬rºr‹)rMr²r}Ú total_bytesÚmvbrOÚtemp_mvbrSrSrTr¯xsBÿ ÿ          æzHTTPResponse._readinto_chunkedcCsbg}|dkr*|j t|tƒ¡}|sttdƒ |¡|ƒ‚| |¡|t|ƒ8}|dkstdƒ |¡S)aVRead the number of bytes requested, compensating for partial reads. Normally, we have a blocking socket, but a read() can be interrupted by a signal (resulting in a partial read). Note that we cannot distinguish between EOF and an interrupt when zero bytes have been read. IncompleteRead() will be raised in this situation. This function should be used when bytes "should" be present for reading. If the bytes are truly not available (due to EOF), then the IncompleteRead exception can be used to detect the problem. rr]) rirªÚminÚ MAXAMOUNTrrrdrLrI)rMr­r®ÚchunkrSrSrTr¬¡s  ûzHTTPResponse._safe_readcCsàd}t|ƒ}|t|ƒkrntt|ƒkr4|dt…}tr-|j t|ƒ¡}t|ƒ}||d|…<n"|j |¡}ntrI|j t|ƒ¡}t|ƒ}||d|…<n|j |¡}|s^tt|d|…ƒt|ƒƒ‚||d…}||7}|t|ƒks |S)z2Same as _safe_read, but for reading into a buffer.rN) r°rIrÁr rirªr±rr)rMr²r½r¾r¿r³rOrSrSrTr¼¸s*      ízHTTPResponse._safe_readintocCs |j ¡Sr¢)riÚfilenor£rSrSrTrÃÒó zHTTPResponse.filenocCsB|jdurtƒ‚|j |¡p|}t|tƒst|dƒs|Sd |¡S)NÚ__iter__z, )rjrÚget_allÚ isinstancerÚhasattrrd)rMrNÚdefaultrjrSrSrTÚ getheaderÕs  zHTTPResponse.getheadercCs|jdurtƒ‚t|j ¡ƒS)z&Return list of (header, value) tuples.N)rjrÚlistÚitemsr£rSrSrTÚ getheadersÞs zHTTPResponse.getheaderscCs|Sr¢rSr£rSrSrTrÅær¨zHTTPResponse.__iter__cCó|jSr¢)rjr£rSrSrTÚinfoëózHTTPResponse.infocCrÎr¢)rƒr£rSrSrTÚgeturlîrÐzHTTPResponse.geturlcCrÎr¢)rzr£rSrSrTÚgetcodeñrÐzHTTPResponse.getcoder¢)rVrWrXrrr„rŒrr—r‹rŸr¦r§r©rªr±r¸rºr«r¯r¬r¼rÃrÊrÍrÅrÏrÑrÒÚ __classcell__rSrSr¤rTr!s2 " P   %)  rc@sÆeZdZdZdZeZeZdZ dZ de e j dfdd„Zd(dd „Zd d „Zd d „Zdd„Zdd„Zdd„Zdd„Zdd„Zd)dd„Zd*dd„Zdd„Zd)dd„Zdifd d!„Zd"d#„Zd$d%„Zd&d'„ZdS)+rrŽzHTTP/1.1rGrNcCsb|tur t dtd¡||_||_d|_g|_d|_t |_ d|_ d|_ d|_ i|_| ||¡dS)Nrnro)rrrsrtruÚtimeoutÚsource_addressr€Ú_bufferÚ_HTTPConnection__responseÚ_CS_IDLEÚ_HTTPConnection__statervÚ _tunnel_hostÚ _tunnel_portÚ_tunnel_headersÚ _set_hostport)rMÚhostÚportrrÔrÕrSrSrTr„þsþzHTTPConnection.__init__cCs(||_||_|r ||_dS|j ¡dS)zº Sets up the host and the port for the HTTP CONNECT Tunnelling. The headers argument should be a mapping of extra HTTP headers to send with the CONNECT request. N)rÚrÛrÜÚclear)rMrÞrßrjrSrSrTÚ set_tunnels  zHTTPConnection.set_tunnelcCsÐ|dur`| d¡}| d¡}||krIz t||dd…ƒ}Wn#tyA||dd…dkr3|j}n td||dd…ƒ‚Ynw|d|…}n|j}|r`|ddkr`|ddkr`|dd…}||_||_dS) NrFú]rGr…znonnumeric port: '%s'rú[éÿÿÿÿ)Úrfindrr‰Ú default_portrrÞrß)rMrÞrßr·ÚjrSrSrTrÝs$   þþ  zHTTPConnection._set_hostportcCs ||_dSr¢)rq)rMÚlevelrSrSrTÚset_debuglevel2rÄzHTTPConnection.set_debuglevelc Csø| |j|j¡d|j|jf}| d¡}| |¡|j ¡D]\}}d||f}| d¡}| |¡q| t dƒ¡|j |j |j d}|  ¡\}} } | dkr^| ¡t d| |  ¡f¡‚ |j td ¡} t| ƒtkrqtd ƒ‚| sudS| d vr{dSq_) NzCONNECT %s:%d HTTP/1.0 Úasciiz%s: %s úlatin-1r[©r‚r'zTunnel connection failed: %d %sTrGrYrZ)rÝrÚrÛrÞrßÚencodeÚsendrÜrÌrÚresponse_classr€rvrŒrŸÚsocketrr”rir`rarIrb) rMÚ connect_strÚ connect_bytesÚheaderr»Ú header_strÚ header_bytesÚresponseryr•r rRrSrSrTÚ_tunnel5s2     ÿ øzHTTPConnection._tunnelcCs0t|j|jf|j|jƒ|_|jr| ¡dSdS)z3Connect to the host and port specified in __init__.N)Úsocket_create_connectionrÞrßrÔrÕr€rÚr÷r£rSrSrTÚconnectQs ÿ ÿzHTTPConnection.connectcCs6|jr |j ¡d|_|jr|j ¡d|_t|_dS)z(Close the connection to the HTTP server.N)r€rŸr×rØrÙr£rSrSrTrŸXs   zHTTPConnection.closecCs,|jdur|jr | ¡ntƒ‚|jdkrtdt|ƒƒd}t|dƒrjt|t ƒsj|jdkr1tdƒd}z|j }Wn t yAYnwd|vrQd }|jdkrQtd ƒ |  |¡}|s\ dS|rc|  d ¡}|j |¡qRz |j |¡WdSty•t|tƒr|D]}|j |¡qYdStd t|ƒƒ‚w)z¿Send `data' to the server. ``data`` can be a string object, a bytes object, an array object, a file-like object that supports a .read() method, or an iterable object. Nrzsend:i rªzsendIng a read()ableFr²Tzencoding file using iso-8859-1rGr^z9data should be a bytes-like object or an iterable, got %r)r€Ú auto_openrùrrqr†r‡rÈrÇrÚmodeÚAttributeErrorrªríÚsendallÚ TypeErrorrÚtype)rMr³Ú blocksizerírûÚ datablockÚdrSrSrTrîbsP      ý  ý  ú  ÿÿûzHTTPConnection.sendcCs|j |¡dS)zuAdd a line of output to the current request buffer. Assumes that the line does *not* end with \r\n. N)rÖrL)rMr®rSrSrTÚ_output”szHTTPConnection._outputcCsn|j tdƒtdƒf¡tdƒ |j¡}|jdd…=t|tƒr%||7}d}| |¡|dur5| |¡dSdS)z¸Send the currently buffered request and clear the buffer. Appends an extra \r\n to the buffer. A message_body may be specified, to be appended to the request. r]r[N)rÖÚextendrrdrÇrî)rMÚ message_bodyrwrSrSrTÚ _send_output›s   ýzHTTPConnection._send_outputc Cst|jr |j ¡r d|_|jtkrt|_nt|jƒ‚||_|s d}d|||jf}| |  d¡¡|j dkr·|s«d}|  d¡rGt |ƒ\}}}}}|rfz|  d¡}Wnt y^|  d¡}Ynw| d |¡nEz|j  d¡} Wnt y}|j  d¡} Ynw|j d ¡d krŽtd | d ƒ} |j|jkr›| d | ¡n|  d¡} | d d| |jf¡|sµ| dd¡dSdS dS)a`Send a request to the server. `method' specifies an HTTP request method, e.g. 'GET'. `url' specifies the object being requested, e.g. '/index.html'. `skip_host' if True does not add automatically a 'Host:' header `skip_accept_encoding' if True does not add automatically an 'Accept-Encoding:' header Nú/z%s %s %srêrŽr…ÚhttpÚidnaÚHostrFró[ó]z%s:%szAccept-EncodingÚidentity)r×r©rÙrØÚ_CS_REQ_STARTEDrrvÚ _http_vsn_strrríÚ _http_vsnrŠrÚUnicodeEncodeErrorÚ putheaderrÞr¶rrßrære) rMr‚rƒÚ skip_hostÚskip_accept_encodingÚrequestÚnetlocÚnilÚ netloc_encÚhost_encrSrSrTÚ putrequest°sJ      ÿ ÿ   ÿ zHTTPConnection.putrequestcGs |jtkrtƒ‚t|dƒr| d¡}t|ƒ}t|ƒD]\}}t|dƒr+| d¡||<qt|tƒr9t |ƒ d¡||<qt dƒ  |¡}|t dƒ|}|  |¡dS)zkSend a request header line to the server. For example: h.putheader('Accept', 'text/html') rírêrës s: N) rÙrrrÈrírËÚ enumeraterÇrrrrdr)rMróÚvaluesr·Ú one_valuer»rSrSrTr$s     €zHTTPConnection.putheadercCs&|jtkr t|_ntƒ‚| |¡dS)a‰Indicate that the last header line has been sent to the server. This method sends the request to the server. The optional message_body argument can be used to pass a message body associated with the request. The message body will be sent in the same packet as the message headers if it is a string, otherwise it is sent as a separate packet. N)rÙrÚ _CS_REQ_SENTrr)rMrrSrSrTÚ endheaders8s zHTTPConnection.endheaderscCs| ||||¡dS)z&Send a complete request to the server.N)Ú _send_request)rMr‚rƒÚbodyrjrSrSrTrGszHTTPConnection.requestc Cs˜d}ztt|ƒƒ}Wn3ty=}z'z tt | ¡¡jƒ}Wnttfy2|j dkr0t dƒYnwWYd}~nd}~ww|durJ|  d|¡dSdS)Nrz Cannot stat!!zContent-Length) rrIrþÚosÚfstatrÃÚst_sizerüÚOSErrorrqr†r)rMr!ÚthelenÚterSrSrTÚ_set_content_lengthKs€þ€û ÿz"HTTPConnection._set_content_lengthc Cs¦t dd„|Dƒ¡}i}d|vrd|d<d|vrd|d<|j||fi|¤Ž|dur3d|vr3| |¡| ¡D] \}}| ||¡q7t|tƒrL| d ¡}|  |¡dS) NcSsg|]}| ¡‘qSrS)rH)Ú.0ÚkrSrSrTÚ ^sz0HTTPConnection._send_request..rÞrGrzaccept-encodingrr‘r^) ÚdictÚfromkeysrr(rÌrrÇrrír) rMr‚rƒr!rjÚ header_namesÚskipsr›r»rSrSrTr \s   zHTTPConnection._send_requestcCsœ|jr |j ¡r d|_|jtks|jrt|jƒ‚|jdkr)|j|j|j|jd}n |j|j|jd}|  ¡|j t ks=J‚t |_|j rI|  ¡|S||_|S)a/Get the response from the server. If the HTTPConnection is in the correct state, returns an instance of HTTPResponse or of whatever object is returned by class the response_class variable. If a request has not been sent or if a previous response has not be handled, ResponseNotReady is raised. If the HTTP response indicates that the connection should be closed, then it will be closed before the response is returned. When the connection is closed, the underlying socket is closed. Nrrì)r×r©rÙrrrqrïr€rvrrrxrØrŸ)rMrörSrSrTÚ getresponseqs"   ÿþzHTTPConnection.getresponse)NNr¢)rr)rVrWrXrrrrïÚ HTTP_PORTrærúrqrrrðÚ_GLOBAL_DEFAULT_TIMEOUTr„rárÝrér÷rùrŸrîrrrrrrr(r r0rSrSrSrTrôs4 ÿ   2  t  r)Ú SSLContextcs<eZdZdZeZdddeejdf‡fdd„ Z dd„Z ‡Z S)ÚHTTPSConnectionz(This class allows communication via SSL.Nc  sÎd|vr |d} |d=nd} d|vr|d} |d=nd} tt|ƒ |||||¡||_||_| dur@t tj¡} | jtj O_| j tj k} | durM| } n| rU| sUt dƒ‚|sY|r_|   ||¡| |_| |_dS)NÚcheck_hostnameÚcontextzMcheck_hostname needs a SSL context with either CERT_OPTIONAL or CERT_REQUIRED)r r4r„Úkey_fileÚ cert_fileÚsslr3ÚPROTOCOL_SSLv23ÚoptionsÚ OP_NO_SSLv2Ú verify_modeÚ CERT_NONEr‰Úload_cert_chainÚ_contextÚ_check_hostname) rMrÞrßr7r8rrÔrÕÚ _3to2kwargsr5r6Ú will_verifyr¤rSrTr„µs*ÿ    zHTTPSConnection.__init__cCsžt|j|jf|j|jƒ}|jr||_| ¡tj r|jnd}|j j ||d|_z|j r8t  |j ¡|j¡WdSWdStyN|j tj¡|j ¡‚w)z(Connect to a host on a given (SSL) port.N)Úserver_hostname)rørÞrßrÔrÕrÚr€r÷r9ÚHAS_SNIr@Ú wrap_socketrAÚmatch_hostnameÚ getpeercertÚ ExceptionÚshutdownrðÚ SHUT_RDWRrŸ)rMr€rDrSrSrTrùÏs& ÿÿÿ  ýzHTTPSConnection.connect) rVrWrXÚ__doc__Ú HTTPS_PORTrærrrðr2r„rùrÓrSrSr¤rTr4®sþr4c@ó eZdZdS)rN©rVrWrXrSrSrSrTrsrc@rN)rNrOrSrSrSrTr órc@rN)rNrOrSrSrSrTr rPrc@rD)rcCs|f|_||_dSr¢)Úargsry)rMryrSrSrTr„s zUnknownProtocol.__init__N©rVrWrXr„rSrSrSrTró rc@rN)rNrOrSrSrSrTrrPrc@rN)rNrOrSrSrSrTrrPrc@s&eZdZddd„Zdd„Zdd„ZdS) rNcCs|f|_||_||_dSr¢)rQÚpartialÚexpected)rMrTrUrSrSrTr„s zIncompleteRead.__init__cCs,|jdur d|j}nd}dt|jƒ|fS)Nz, %i more expectedr…zIncompleteRead(%i bytes read%s))rUrIrT)rMÚerSrSrTÚ__repr__ s  zIncompleteRead.__repr__cCst|ƒSr¢)r‡r£rSrSrTÚ__str__&szIncompleteRead.__str__r¢)rVrWrXr„rWrXrSrSrSrTrs  rc@rN)rNrOrSrSrSrTr)rPrc@rN)rNrOrSrSrSrTr,rPrc@rN)rNrOrSrSrSrTr/rPrc@rN)rNrOrSrSrSrTr2rPrc@rD)rcCs|st|ƒ}|f|_||_dSr¢)r‡rQrRr¹rSrSrTr„6s zBadStatusLine.__init__NrRrSrSrSrTr5rSrc@rD)rbcCst |dt|f¡dS)Nz&got more than %d bytes when reading %s)rr„ra)rMÚ line_typerSrSrTr„=s ÿzLineTooLong.__init__NrRrSrSrSrTrb<rSrb){rLÚ __future__rrrrÚfuture.builtinsrrrr Ú future.utilsr Úfuture.backports.emailr rfr Ú email_messageÚfuture.backports.miscr røÚior"rðÚfuture.backports.urllib.parserrsrÚ collectionsrÚcollections.abcÚ__all__r1rMrxrØrrr“ÚSWITCHING_PROTOCOLSÚ PROCESSINGr<ÚCREATEDÚACCEPTEDÚNON_AUTHORITATIVE_INFORMATIONr˜Ú RESET_CONTENTÚPARTIAL_CONTENTÚ MULTI_STATUSÚIM_USEDÚMULTIPLE_CHOICESÚMOVED_PERMANENTLYÚFOUNDÚ SEE_OTHERr™Ú USE_PROXYÚTEMPORARY_REDIRECTÚ BAD_REQUESTÚ UNAUTHORIZEDÚPAYMENT_REQUIREDÚ FORBIDDENÚ NOT_FOUNDÚMETHOD_NOT_ALLOWEDÚNOT_ACCEPTABLEÚPROXY_AUTHENTICATION_REQUIREDÚREQUEST_TIMEOUTÚCONFLICTÚGONEÚLENGTH_REQUIREDÚPRECONDITION_FAILEDÚREQUEST_ENTITY_TOO_LARGEÚREQUEST_URI_TOO_LONGÚUNSUPPORTED_MEDIA_TYPEÚREQUESTED_RANGE_NOT_SATISFIABLEÚEXPECTATION_FAILEDÚUNPROCESSABLE_ENTITYÚLOCKEDÚFAILED_DEPENDENCYÚUPGRADE_REQUIREDÚPRECONDITION_REQUIREDÚTOO_MANY_REQUESTSÚREQUEST_HEADER_FIELDS_TOO_LARGEÚINTERNAL_SERVER_ERRORÚNOT_IMPLEMENTEDÚ BAD_GATEWAYÚSERVICE_UNAVAILABLEÚGATEWAY_TIMEOUTÚHTTP_VERSION_NOT_SUPPORTEDÚINSUFFICIENT_STORAGEÚ NOT_EXTENDEDÚNETWORK_AUTHENTICATION_REQUIREDr rÁrarcÚMessagerErlÚobjectrrÚ RawIOBaserrr9r3Ú ImportErrorr4rLrIrrrrrrrrrrrrrbrrSrSrSrTÚs‚F       ÿþüûúùø ÷ ö ô óòñðïîíëêéèçæåäãâá à!ß"Þ#Ý$Ü%Û&Ï5 V7ÿ 6!