ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ A[c@`sdZddlmZmZmZmZddlmZmZm Z m Z ddl m Z ddl mZddl mZddlmZddlZddlZddlZddlZdd lmZddlZdd lmZd d d dddddddddddddgZdZdZdZ dZ!dZ"d Z#d!Z$d"Z%d#Z&d$Z'd%Z(d&Z)d'Z*d(Z+d)Z,d*Z-d+Z.d,Z/d-Z0d.Z1d/Z2d0Z3d1Z4d2Z5d3Z6d4Z7d5Z8d6Z9d7Z:d8Z;d9Z<d:Z=d;Z>d<Z?d=Z@d>ZAd?ZBd@ZCdAZDdBZEdCZFdDZGdEZHdFZIdGZJdHZKdIZLdJZMdKZNdLZOdMZPdNZQdOZRdPZSdQZTdRZUdSZVdTZWdUZXi-dVd!6dWd"6dXd$6dYd%6dZd&6d[d'6d\d(6d]d)6d^d*6d_d-6d`d.6dad/6dbd06dcd16ddd26dedf6dgd36dhd46did56djd66dkd76dld86dmd96dnd:6dod;6dpd<6dqd=6drd>6dsd?6dtd@6dudA6dvdB6dwdC6dxdD6dydE6dzdJ6d{dK6d|dL6d}dM6d~dN6ddO6ddP6ddQ6ddR6ddU6ZYdZZdZ[d!Z\dej]fdYZ^e^dZ_e`ZadejbfdYZcde`fdYZdy ddleZeddlemfZfWnegk ran$XdedfdYZhejiddejfdYZkdekfdYZldekfdYZmdekfdYZndekfdYZodekfdYZpdekfdYZqdekfdYZrderfdYZsderfdYZtderfdYZudekfdYZvdekfdYZwekZxdS(uD 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 i(tabsolute_importtdivisiontprint_functiontunicode_literals(tbytestinttstrtsuper(tPY2(tparser(tmessage(tcreate_connectionN(turlsplit(tarrayu HTTPResponseuHTTPConnectionu HTTPExceptionu NotConnecteduUnknownProtocoluUnknownTransferEncodinguUnimplementedFileModeuIncompleteReadu InvalidURLuImproperConnectionStateuCannotSendRequestuCannotSendHeaderuResponseNotReadyu BadStatusLineuerroru responsesiPiuUNKNOWNuIdleuRequest-startedu Request-sentidieifiiiiiiiiii,i-i.i/i0i1i3iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiuContinueuSwitching ProtocolsuOKuCreateduAccepteduNon-Authoritative Informationu No Contentu Reset ContentuPartial ContentuMultiple ChoicesuMoved PermanentlyuFoundu See Otheru Not Modifiedu Use Proxyu(Unused)i2uTemporary Redirectu Bad Requestu UnauthorizeduPayment Requiredu Forbiddenu Not FounduMethod Not AlloweduNot AcceptableuProxy Authentication RequireduRequest TimeoutuConflictuGoneuLength RequireduPrecondition FaileduRequest Entity Too LargeuRequest-URI Too LonguUnsupported Media TypeuRequested Range Not SatisfiableuExpectation FaileduPrecondition RequireduToo Many RequestsuRequest Header Fields Too LargeuInternal Server ErroruNot Implementedu Bad GatewayuService UnavailableuGateway TimeoutuHTTP Version Not SupporteduNetwork Authentication Requirediit HTTPMessagecB`seZdZRS(cC`s|jd}t|}g}d}xb|jD]T}|| j|krZd}n|d jssd}n|r5|j|q5q5W|S(uFind 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. u:ii(tlowertlentkeystisspacetappend(tselftnametntlstthittline((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pytgetallmatchingheaderss    (t__name__t __module__R(((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyRscC`sg}xtr|jtd}t|tkrCtdn|j|t|tkrutdtn|d kr Pq q Wtdj |j d}t j d|j |S( uGParses 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. iu header lineugot more than %d headerss s tu iso-8859-1t_class(s s R(tTruetreadlinet_MAXLINERt LineTooLongRt _MAXHEADERSt HTTPExceptionRtjointdecodet email_parsertParsertparsestr(tfpRtheadersRthstring((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyt parse_headerss    t HTTPResponsecB`seZdedddZdZdZdZdZdZ dZ dZ d Z dd Z d Zd Zd ZdZdZdZdZdZddZdZdZdZdZdZRS(icC`s|jd|_||_|tk r=tjdtdn||_d|_ |_ t |_ t |_ t |_t |_t |_t |_t |_dS(Nurbuithe 'strict' argument isn't supported anymore; http.client now always assumes HTTP/1.x compliant servers.i(tmakefileR*t debuglevelt_strict_sentineltwarningstwarntDeprecationWarningt_methodtNoneR+tmsgt_UNKNOWNtversiontstatustreasontchunkedt chunk_lefttlengtht will_close(RtsockR0tstricttmethodturl((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyt__init__&s           cC`sut|jjtdd}t|tkr@tdn|jdkretdt|n|szt |ny|j dd\}}}WnMt k ry"|j dd\}}d}Wqt k rd}qXnX|j ds|jt |ny7t|}|d ks8|d krGt |nWnt k rgt |nX|||fS( Niu iso-8859-1u status lineiureply:iuuHTTP/idi(RR*R R!RR"R0tprinttreprt BadStatusLinetsplitR6t ValueErrort startswitht _close_connR(RRR9R:R;((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyt _read_statusHs2      cC`s|jdk rdSxtr|j\}}}|tkrAPnxvtr|jjtd}t|tkrt dn|j }|sPn|j dkrDt d|qDqDWqW||_ |_|j |_|dkrd|_n'|jdrd |_n t|t|j|_|_|j dkrnx'|jD]}t d|d d qNWn|jjd }|r|jd krt|_d|_n t|_|j|_d|_|jjd}|jjd }|rP|j rPyt||_Wntk r1d|_qYX|jdkrYd|_qYn d|_|tks|t ksd|kodkns|j!dkrd|_n|j r|j r|jdkrt|_ndS(Niu header lineiuheader:uHTTP/1.0uHTTP/0.9i uHTTP/1.i tendu utransfer-encodinguchunkeducontent-lengthidiuHEAD(uHTTP/1.0uHTTP/0.9("R+R6RRLtCONTINUER*R R!RR"tstripR0REtcodeR:R;R9RJtUnknownProtocolR-R7tgetRR<R=tFalset _check_closeR?R>RRIt NO_CONTENTt NOT_MODIFIEDR5(RR9R:R;tskipthdrttr_encR>((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pytbeginhsf                  cC`s|jjd}|jdkrS|jjd}|rOd|jkrOtStS|jjdritS|rd|jkrtS|jjd}|rd|jkrtStS(Nu connectioni ucloseu keep-aliveuproxy-connection(R+RRR9RRRS(Rtconntpconn((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyRTscC`s |j}d|_|jdS(N(R*R6tclose(RR*((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyRKs  cC`s'tj|jr#|jndS(N(RR]R*RK(R((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyR]s  cC`s*tj|jr&|jjndS(N(RtflushR*(R((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyR^s  cC`stS(N(R(R((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pytreadablescC`s |jdkS(u!True if the connection is closed.N(R*R6(R((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pytisclosedscC`s|jdkrtdS|jdkr<|jtdS|dk rdttt|j|S|jrw|j S|j dkr|jj}n@y|j |j }Wnt k r|jnXd|_ |jt|SdS(NRuHEADi( R*R6RR5RKRR.treadR<t_readall_chunkedR>t _safe_readtIncompleteRead(Rtamtts((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyRas&          cC`s$|jdkrdS|jdkr0|jdS|jrF|j|S|jdk rt||jkrt|d|j!}qnt r|jj t|}t|}|||*n|jj |}| r|r|jn7|jdk r |j|8_|js |jq n|S(NiuHEAD( R*R6R5RKR<t_readinto_chunkedR>Rt memoryviewRRatreadinto(RtbtdataR((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyRis,        cC`s|jjtd}t|tkr7tdn|jd}|dkr_|| }nyt|dSWntk r|jnXdS(Niu chunk sizet;ii( R*R R!RR"tfindRRIRK(RRti((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyt_read_next_chunk_size=s    cC`sbx[tr]|jjtd}t|tkr@tdn|sJPn|dkrPqqWdS(Niu trailer lines s R(s s R(RR*R R!RR"(RR((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyt_read_and_discard_trailerMs  cC`s|j}g}xtr|dkrvy |j}|dkrCPnWqvtk rrttdj|qvXn|j|j ||j dd}qW|j |j tdj|S(NiRi( R=RR6RoRIRdRR%RRcRpRK(RR=tvalue((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyRb[s       "    cC`sT|j}d}t|}xtr;|dkry |j}|dkrOPnWqtk r|tt|d|!qXnt||kr|j |}|||_||St||kr|j |}|j dd|_||S|d|!}|j |}||}||7}|j dd}qW|j |j |S(Nii( R=RhRR6RoRIRdRRt_safe_readintoRcRpRK(RRjR=t total_bytestmvbRttemp_mvb((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyRgts:                  cC`sg}xo|dkrw|jjt|t}|sWttdj||n|j||t|8}q Wtdj|S(uVRead 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. iR( R*Ratmint MAXAMOUNTRdRR%RR(RReRftchunk((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyRcs! cC`sd}t|}x|t|krtt|kr[|dt!}|jj|}n|jj|}|stt|d|!t|n||}||7}qW|S(u2Same as _safe_read, but for reading into a buffer.i(RhRRwR*RiRdR(RRjRsRtRuR((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyRrs  % cC`s |jjS(N(R*tfileno(R((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyRyscC`sg|jdkrtn|jj|p0|}t|tsRt|d rV|Sdj|SdS(Nu__iter__u, (R+R6tResponseNotReadytget_allt isinstanceRthasattrR%(RRtdefaultR+((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyt getheaders  cC`s.|jdkrtnt|jjS(u&Return list of (header, value) tuples.N(R+R6Rztlisttitems(R((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyt getheaderss cC`s|S(N((R((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyt__iter__scC`s|jS(N(R+(R((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pytinfoscC`s|jS(N(RC(R((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pytgeturlscC`s|jS(N(R:(R((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pytgetcodesN(RRR1R6RDRLRZRTRKR]R^R_R`RaRiRoRpRbRgRcRrRyRRRRRR(((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyR.s0 " P      %    )       tHTTPConnectioncB`seZdZdZeZeZdZdZ de e j ddZdddZdZdZdZd Zd Zd Zd Zdd ZdddZdZddZdidZdZdZdZRS(i uHTTP/1.1iicC`s|tk r"tjdtdn||_||_d|_g|_d|_ t |_ d|_ d|_ d|_i|_|j||dS(Nuithe 'strict' argument isn't supported anymore; http.client now always assumes HTTP/1.x compliant servers.i(R1R2R3R4ttimeouttsource_addressR6R@t_buffert_HTTPConnection__responset_CS_IDLEt_HTTPConnection__stateR5t _tunnel_hostt _tunnel_portt_tunnel_headerst _set_hostport(RthosttportRARR((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyRDs             cC`s5||_||_|r$||_n |jjdS(u 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(RRRtclear(RRRR+((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyt set_tunnels    cC`s|dkr|jd}|jd}||kryt||d}WnItk r||ddkr~|j}qtd||dnX|| }n |j}|r|ddkr|ddkr|dd!}qn||_||_dS( Nu:u]iuunonnumeric port: '%s'iu[i(R6trfindRRIt default_portt InvalidURLRR(RRRRntj((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyRs       & cC`s ||_dS(N(R0(Rtlevel((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pytset_debuglevel$sc C`sq|j|j|jd|j|jf}|jd}|j|xI|jjD]8\}}d||f}|jd}|j|qXW|jt d|j |j d|j }|j \}} } | dkr|jtjd| | jfnx[trl|jjtd } t| tkrOtd n| sYPn| d krPqqWdS(NuCONNECT %s:%d HTTP/1.0 uasciiu%s: %s ulatin-1s RBiuTunnel connection failed: %d %siu header lines R(s s R(RRRRRtencodetsendRRRtresponse_classR@R5RLR]tsocketterrorRORR*R R!RR"( Rt connect_strt connect_bytestheaderRqt header_strt header_bytestresponseR9RPR R((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyt_tunnel's.      cC`sAt|j|jf|j|j|_|jr=|jndS(u3Connect to the host and port specified in __init__.N(tsocket_create_connectionRRRRR@RR(R((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pytconnectCs cC`sQ|jr"|jjd|_n|jrD|jjd|_nt|_dS(u(Close the connection to the HTTP server.N(R@R]R6RRR(R((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyR]Js      cC`s|jd kr1|jr%|jq1tn|jdkrVtdt|nd}t|dr;t |t  r;|jdkrtdnt }y |j }Wnt k rn2Xd|krt}|jdkrtdqnxE|j|}|s Pn|r#|jd}n|jj|qWd Sy|jj|Wn]tk rt |tjrx7|D]}|jj|qxWqtd t|nXd S( uSend `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. iusend:i ureadusendIng a read()ableubuencoding file using iso-8859-1u iso-8859-1Nu9data should be a bytes-like object or an iterable, got %r(R@R6t auto_openRt NotConnectedR0RERFR}R|R RStmodetAttributeErrorRRaRtsendallt TypeErrort collectionstIterablettype(RRkt blocksizeRRt datablocktd((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyRTsF         cC`s|jj|dS(uuAdd a line of output to the current request buffer. Assumes that the line does *not* end with \r\n. N(RR(RRf((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyt_outputscC`s|jjtdtdftdj|j}|j2t|trc||7}d}n|j||dk r|j|ndS(uSend 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. Rs N(RtextendRR%R|R6R(Rt message_bodyR7((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyt _send_outputs"    c C`s|jr$|jjr$d|_n|jtkr?t|_nt|j||_|sfd}nd|||jf}|j |j d|j dkr|sd}|j drt |\}}}}}n|r)y|j d}Wn tk r|j d}nX|jd|qy|jj d} Wn#tk rd|jj d} nX|jjd d krtd | d } n|j|jkr|jd| q| jd} |jdd | |jfn|s|jddqndS(u`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 u/u%s %s %suasciii uuhttpuidnauHostu:it[t]u%s:%suAccept-EncodinguidentityN(RR`R6RRt_CS_REQ_STARTEDtCannotSendRequestR5t _http_vsn_strRRt _http_vsnRJR tUnicodeEncodeErrort putheaderRRmRRRR&( RRBRCt skip_hosttskip_accept_encodingtrequesttnetloctnilt netloc_encthost_enc((sM/opt/alt/python27/lib/python2.7/site-packages/future/backports/http/client.pyt putrequestsD         cG`s|jtkrtnt|dr<|jd}nt|}xjt|D]\\}}t|dr|jd||Es6""             6 !