Ë  Ü¢«)LÖüãóP—dZddlZddlZddlZddlZddlZddlmZddlm Z ddl m Z ddl mZm Z mZddlmZej"Zej$Zej&ZdaGd „d «ZGd „d «ZGd „deej.«ZGd„dej2«Zd„Zd„ZGd„dej8«Zd„Zd„Zdd„Zd„Z dd„Z!e"dk(r3ddl#Z# e$ejJd«Z&ejJdZ'e!e'e&«yy#e(e)f$re*dejJdz«YywxYw)aKAn HTTP handler for urllib2 that supports HTTP 1.1 and keepalive. >>> import urllib2 >>> from keepalive import HTTPHandler >>> keepalive_handler = HTTPHandler() >>> opener = urlreq.buildopener(keepalive_handler) >>> urlreq.installopener(opener) >>> >>> fo = urlreq.urlopen('http://www.python.org') If a connection to a given host is requested, and all of the existing connections are still in use, another connection will be opened. If the handler tries to use an existing connection but it fails in some way, it will be closed and removed from the pool. To remove the handler, simply re-run build_opener with no arguments, and install that opener. You can explicitly close connections by using the close_connection() method of the returned file-like object (described below) or you can use the handler methods: close_connection(host) close_all() open_connections() NOTE: using the close_connection and close_all methods of the handler should be done with care when using multiple threads. * there is nothing that prevents another thread from creating new connections immediately after connections are closed * no checks are done to prevent in-use connections from being closed >>> keepalive_handler.close_all() EXTRA ATTRIBUTES AND METHODS Upon a status of 200, the object returned has a few additional attributes and methods, which should not be used if you want to remain consistent with the normal urllib2-returned objects: close_connection() - close the connection to the host readlines() - you know, readlines() status - the return status (i.e. 404) reason - english translation of status (i.e. 'File not found') If you want the best of both worlds, use this inside an AttributeError-catching try: >>> try: status = fo.status >>> except AttributeError: status = None Unfortunately, these are ONLY there if status == 200, so it's not easy to distinguish between non-200 responses. The reason is that urllib2 tries to do clever things with error codes 301, 302, 401, and 407, and it wraps the object upon return. éNé)Ú_)Úgetattr)Úhex)ÚpycompatÚ urllibcompatÚutil)Úprocutilcó6—eZdZdZd„Zd„Zd„Zd„Zd„Zd d„Z y) ÚConnectionManagerzT The connection manager must be able to: * keep track of all existing cóŽ—tj«|_tjt «|_i|_i|_y©N) Ú threadingÚLockÚ_lockÚ collectionsÚ defaultdictÚlistÚ_hostmapÚ_connmapÚ _readymap©Úselfs ú7usr/lib/python3.12/site-packages/mercurial/keepalive.pyÚ__init__zConnectionManager.__init__ss0€Ü—^‘^Ó%ˆŒ Ü#×/Ñ/´Ó5ˆŒ ؈Œ ؈�ócó$—|jj« |j|j|«||j|<||j |<|jj «y#|jj «wxYwr)rÚacquirerÚappendrrÚrelease)rÚhostÚ connectionÚreadys rÚaddzConnectionManager.addysk€Ø � ‰ ×ÑÔð !Ø �M‰M˜$Ñ × &Ñ & zÔ 2Ø(,ˆD�M‰M˜*Ñ %Ø).ˆD�N‰N˜:Ñ &à �J‰J× Ñ Õ øˆD�J‰J× Ñ Õ ús œ‘> !Ó$Ø(-�D—N‘N 1Ñ%Ø�DÙð )ð �J‰J× Ñ Ô Øˆ øð �J‰J× Ñ Õ úsž!A0ÁA0Á0B Nc ó—|rt|j|«St|jj«D��cic]\}}|t|«“Œc}}«Scc}}wr)rrÚdictÚitems)rr!ÚhÚconnss rÚget_allzConnectionManager.get_all¥sV€Ù ܘŸ ™  dÑ+Ó,Ð ,äØ26·-±-×2EÑ2EÔ2GÔHÑ2G¡J Q¨�”D˜“K‘Ð2GÒHóð ùÛHs½A r) Ú__name__Ú __module__Ú __qualname__Ú__doc__rr$r&r)r-r3©rrr r ms%„ñò ò !ò!ò ò ôrr cóL—eZdZd d„Zd„Zd„Zd„Zd„Zd d„Zd„Z d „Z d „Z d „Z y)ÚKeepAliveHandlerNcóL—t«|_||_d|_d|_y©Nr)r Ú_cmÚ_timeoutÚ requestscountÚsentbytescount)rÚtimeouts rrzKeepAliveHandler.__init__¯s#€Ü$Ó&ˆŒØˆŒ ØˆÔØˆÕrcóš—|jj«j«D��cgc]\}}|t|«f‘Œc}}Scc}}w)ztreturn a list of connected hosts and the number of connections to each. [('foo.com:80', 2), ('bar.org', 1)])r=r3r0Úlen)rr!Úlis rÚopen_connectionsz!KeepAliveHandler.open_connections¶s@€ð37·(±(×2BÑ2BÓ2D×2JÑ2JÔ2LÔMÑ2L¡J T¨2�”s˜2“w’Ð2LÒMÐMùÓMs¬Acóš—|jj|«D]-}|jj|«|j«Œ/y)z¨close connection(s) to host is the host:port spec, as in 'www.cnn.com:8080' as passed in. no error occurs if there is no connection to that host.N)r=r3r&Úclose)rr!r1s rÚclose_connectionz!KeepAliveHandler.close_connection»s6€ð—‘×!Ñ! $Ö'ˆAØ �H‰H�O‰O˜AÔ Ø �G‰G�Iñ(rcóÈ—|jj«j«D]7\}}|D]-}|jj|«|j «Œ/Œ9y)zclose all open connectionsN)r=r3r0r&rG)rr!r2r1s rÚ close_allzKeepAliveHandler.close_allÃsI€àŸ8™8×+Ñ+Ó-×3Ñ3Ö5‰KˆD�%Û�Ø—‘—‘ Ô"Ø—‘• ññ6rcó<—|jj|d«y)zetells us that this request is now closed and that the connection is ready for another requestTN)r=r))rÚrequestr!r"s rÚ_request_closedz KeepAliveHandler._request_closedÊs€ð �‰×ј: tÕ,rcó^—|r|j«|jj|«yr)rGr=r&)rr!r"rGs rÚ_remove_connectionz#KeepAliveHandler._remove_connectionÏs!€Ù Ø × Ñ Ô Ø �‰�‰˜ Õ#rcó.—|jt|«Sr)Údo_openÚHTTPConnection)rÚreqs rÚ http_openzKeepAliveHandler.http_openÕs€Ø�|‰|œN¨CÓ0Ð0rcóÞ—tj|«}|stjd«‚ |jj |«}|r_|j |||«}|rnÂ|j«|jj|«|jj |«}|rŒ_|||j¬«}tr tjd|t|««|jj||d«|j||«|j«}t3|dd«r|jj|«tr+tjd|j4|j6«||_||_|j=«|_||_ |j4|_!|jD|_#|j6|_"|S#t j"$rC}tjt%d«t'j(|j*«z«‚d}~wt,j.t j0f$r}tj|«‚d}~wwxYw) Ns no host given)rAs"creating new connection to %s (%d)Fsbad HTTP status line: %sÚ will_closeTsSTATUS: %s, %s)$rÚgethostÚurlerrÚurlerrorr=r-Ú_reuse_connectionrGr&r>ÚDEBUGÚinfoÚidr$Ú_start_transactionÚ getresponseÚhttplibÚ BadStatusLinerrÚsysbytesÚlineÚsocketÚerrorÚ HTTPExceptionrÚstatusÚreasonÚ_handlerÚ_hostÚ get_full_urlÚ_urlÚ _connectionÚcodeÚmsgÚheaders)rÚ http_classrSr!r1ÚrÚerrs rrQzKeepAliveHandler.do_openØsâ€Ü×#Ñ# CÓ(ˆÙÜ—/‘/Ð"2Ó3Ð 3ð 'Ø—‘×'Ñ'¨Ó-ˆAÙØ×*Ñ*¨1¨c°4Ó8�ñØð—‘” Ø—‘—‘ Ô"Ø—H‘H×+Ñ+¨DÓ1�òñ˜t¨T¯]©]Ô;�ÝÜ—J‘JØ=¸tÄRÈÃUôð—‘— ‘ ˜T 1 eÔ,Ø×'Ñ'¨¨3Ô/Ø—M‘M“O�ô �1�l DÔ )Ø �H‰H�O‰O˜AÔ å Ü �J‰JÐ(¨!¯(©(°A·H±HÔ =؈Œ ؈ŒØ×!Ñ!Ó#ˆŒØˆŒ Ø—‘ˆŒØ—E‘EˆŒ Ø—‘ˆŒàˆøô/×$Ñ$ò Ü—/‘/ÜÐ-Ó.´×1BÑ1BÀ3Ç8Á8Ó1LÑLóð ûô— ‘ œg×3Ñ3Ð4ò 'Ü—/‘/ #Ó&Ð &ûð 'ús+®A;GÂ*A9GÇI,Ç.>H,È,&I,ÉI'É'I,có— |j||«|j«}|�|jdk(r*t r t jd|t|««d}|St r t jd|t|««|S#tjtj f$rd}YŒŠt r t jd|t|««|jj|«|j«‚xYw)aGstart the transaction with a re-used connection return a response object (r) upon success or None on failure. This DOES not close or remove bad connections in cases where it returns. However, if an unexpected exception occurs, it will close and remove the connection before re-raising. Ns4unexpected exception - closing connection to %s (%d)é s&failed to re-use connection to %s (%d)sre-using connection to %s (%d)) r^r_rdrer`rfr[r]r=r&rGÚversionr\)rr1rSr!rrs rrZz"KeepAliveHandler._reuse_connectionsÞ€ð Ø × #Ñ # A sÔ +Ø— ‘ “ˆAð2 ˆ9˜Ÿ ™  Qšõ Ü— ‘ Ø=¸tÄRÈÃUôðˆAð ˆõÜ— ‘ Ð<¸dÄBÀqÃEÔJàˆøôI— ‘ œg×3Ñ3Ð4ò ØŠAð õÜ— ‘ ØKØÜ�q“Eôð �H‰H�O‰O˜AÔ Ø �G‰GŒIØ ús‚"BÂ%DÂ.ADcó¼—t|dd«}tj|jj«}|j t |jj«««|j t |jj«««tjd„|j«D««}i}dD]}||vsŒd|d|jdd«z<Œ! tj|«rƒtj|«}|j|j«tj |«fi|¤Žd |vr|j#d d «d |vrT|j#d dt%|«z«n5|j|j«tj |«fi|¤Ž|j«D]\} } |j#| | «Œ|j/«tj|«r|j1«|xj2dz c_|xj4t|dd«|z z c_ |jxj2dz c_|jxj4t|dd«|z z c_y#t&j($r}t*j-|«‚d}~wwxYw#t6$rYywxYw)Nr@rc3óFK—|]\}}|j«|f–—Œy­wr)Úlower)Ú.0ÚnÚvs rÚ z6KeepAliveHandler._start_transaction..Lsèø€ÐK¹?±4°1°a §¡£¨A¤¹?ùs‚!)r!zaccept-encodingrÚskip_Ú-rz content-typez Content-typez!application/x-www-form-urlencodedzcontent-lengthzContent-lengthz%d)rr ÚsortdictÚparentÚ addheadersÚupdateÚsortedrpr0Úunredirected_hdrsÚreplacerÚhasdataÚgetdataÚ putrequestÚ get_methodÚ getselectorÚ putheaderrCrdrerXrYÚ endheadersÚsendr?r@ÚAttributeError) rr1rSÚ oldbytescountrpÚ skipheadersr{ÚdatarsÚkr|s rr^z#KeepAliveHandler._start_transactionCsf€Ü Ð#3°QÓ7ˆ ô —-‘- § ¡ × 6Ñ 6Ó7ˆØ�‰”v˜cŸk™k×/Ñ/Ó1Ó2Ô3Ø�‰”v˜c×3Ñ3×9Ñ9Ó;Ó<Ô=Ü—-‘-ÑK¸7¿=¹=¼?ÓKÓKˆØˆ Û,ˆAØ�GŠ|Ø=>� ˜G a§i¡i°°SÓ&9Ñ9Ò:ð-ð 'Ü×#Ñ# CÔ(Ü#×+Ñ+¨CÓ0�Ø�— ‘ Ø—N‘NÓ$Ü ×,Ñ,¨SÓ1ñð"òð "¨Ñ0Ø—K‘KØ&Ð(Kôð$¨7Ñ2Ø—K‘KÐ 0°$¼¸T»Ñ2BÕCà�— ‘ Ø—N‘NÓ$Ü ×,Ñ,¨SÓ1ñð"òð—M‘M–O‰DˆAˆqØ �K‰K˜˜1Õ ð$à � ‰ ŒÜ × Ñ  Ô $Ø �F‰F�4ŒLð ×Ò˜aÑÕØ ×Òœw qÐ*:¸AÓ>ÀÑNÑNÕð Ø �K‰K× %Ò %¨Ñ *Õ %Ø �K‰K× &Ò &ܘÐ+¨QÓ/°-Ñ?ñ Ö &øô�|‰|ò 'Ü—/‘/ #Ó&Ð &ûð 'ûô"ò Ù ð ús,Ã,C JÉA KÊK Ê2KËK Ë KËKr©r) r4r5r6rrErHrJrMrOrTrQrZr^r8rrr:r:®s7„ó òNò òò-ó $ò 1ò7òr0ód4rr:có —eZdZy)Ú HTTPHandlerN)r4r5r6r8rrr–r–zs„Ørr–có¨—eZdZdd„Zej j Zeej dd«Z d„Z d„Z d„Z d„Z d„Zdd „Zd „Zd „Zdd „Zd „Zy)Ú HTTPResponseNcóÜ—tjj||||¬«|j|_d|_d|_d|_d|_d|_d|_ d|_ d|_ y)N)Ú debuglevelÚmethodrri ) r`r˜rÚfilenornÚreceivedbytescountÚ_rbufÚ _rbufsizerirjrlrm)rÚsockršÚstrictr›s rrzHTTPResponse.__init__‘sk€Ü×Ñ×%Ñ%Ø �$ :°fð &ô ð—k‘kˆŒ ؈Œ Ø"#ˆÔ؈Œ ؈ŒØˆŒ ؈Œ ؈Œ ؈ÕrÚreadintocóÜ—|jr`|jj«d|_|jr2|jj||j|j «yyyr)ÚfprGrirMrjrmrs rrGzHTTPResponse.close§sQ€Ø �7Š7Ø �G‰G�M‰MŒO؈DŒGØ�}Š}Ø— ‘ ×-Ñ-ؘ$Ÿ*™* d×&6Ñ&6õðð rcó$—|j«yr©rGrs rÚ _close_connzHTTPResponse._close_conn°s €Ø � ‰ � rcóˆ—|jj|j|jd¬«|j «y)Nrr¦)rirOrjrmrGrs rrHzHTTPResponse.close_connection³s.€Ø � ‰ ×(Ñ(¨¯©°T×5EÑ5EÈQÐ(ÔOØ � ‰ � rcó—|jSr)rprs rr\zHTTPResponse.info·s €Ø�|‰|Ðrcó—|jSr)rlrs rÚgeturlzHTTPResponse.geturlºs €Ø�y‰yÐrcó.—|jrG|�Et|j«}||kDr||z}n%|jd|}|j|d|_|S|j}d|_|j|«}|xjt|«z c_ |jxjt|«z c_ |j jxjt|«z c_||z }|S#t $rYŒEwxYw#t $rYŒ!wxYw)Nr)ržrCÚ _raw_readr�rmr�rir�)rÚamtÚLÚsr’s rÚreadzHTTPResponse.read½s€ð �:Š:˜#˜/Ü�D—J‘J“ˆAØ�QŠwØ�q‘‘à—J‘J˜t Ð$�Ø!ŸZ™Z¨¨Ð-�” Ø�ð �J‰JˆØˆŒ Ø�~‰~˜cÓ"ˆà ×Ò¤3 t£9Ñ,Õð Ø × Ñ × /Ò /´3°t³9Ñ <Õ /ð Ø �M‰M× Ñ × 3Ò 3´s¸4³yÑ @Õ 3ð ˆT‰ ˆØˆøôò Ù ð ûôò Ù ð ús$Â(C9Ã2DÃ9 DÄDÄ DÄDcó˜—|j}g} |€H|jj«}|jd«}|dk\r|d|} t |d«}|dk(rnë|€!|j|j|««n³||kr;|j|j|««||z |_dj|«S||k(rI|j|j|««|jd«d|_dj|«S|j|j|««||z}|jd«d}�Œ5 |jj«}|sn|dk(rnŒ$|j «dj|«S#t $r5|j «tjdj|««‚wxYw)Nó;rérés ) Ú chunk_leftr¤ÚreadlineÚfindÚintÚ ValueErrorrGr`ÚIncompleteReadÚjoinrÚ _safe_read)rr®r¶ÚpartsrcÚis rÚ _read_chunkedzHTTPResponse._read_chunkedÝs®€Ø—_‘_ˆ ؈àØÐ!Ø—w‘w×'Ñ'Ó)�Ø—I‘I˜d“O�ؘ’6Ø  ˜8�DðBÜ!$ T¨2£�Jð  ’?ØØˆ{Ø— ‘ ˜TŸ_™_¨ZÓ8Õ9Ø�zÒ!Ø— ‘ ˜TŸ_™_¨SÓ1Ô2Ø",¨sÑ"2�”Ø—x‘x “Ð&ؘ Ò"Ø— ‘ ˜TŸ_™_¨SÓ1Ô2Ø—‘ Ô"Ø"&�”Ø—x‘x “Ð&à— ‘ ˜TŸ_™_¨ZÓ8Ô9Ø�zÑ!�ð �O‰O˜AÔ ØˆJñAðHØ—7‘7×#Ñ#Ó%ˆDÙðØ�wŠØðð � ‰ Œ à�x‰x˜‹ÐøôQ"òBð—J‘J”LÜ!×0Ñ0°·±¸%³ÓAÐAð Bús Á F Æ >G có —|jjd«}|dk\r*|dz }|jd|}|j|d|_|S|j€|jg}ng}d}|j} |j |«}|sn¢|xj t |«z c_|jxj t |«z c_ |jjxj t |«z c_|j|«|jd«}|dk\rnŒ¶|dk(rd|_dj|«S|dz }|d|d|_|dd||d<dj|«S#t$rYŒwxYw)Nó rréÿÿÿÿr) ržr¸Ú _raw_readintorŸr­r�rCrmrir�r�rr¼)rr¿rcÚchunksÚreadsizeÚnews rr·zHTTPResponse.readlinesy€à �J‰J�O‰O˜EÓ "ˆØ �Š6Ø �‰FˆAØ—:‘:˜b˜q�>ˆDØŸ™ A B˜ˆDŒJ؈Kð × Ñ Ð %Ø—j‘j�\‰FàˆFØ ˆØ—>‘>ˆØØ—.‘. Ó*ˆCÙØà × #Ò #¤s¨3£xÑ /Õ #Ø × Ñ × /Ò /´3°s³8Ñ ;Õ /ð Ø— ‘ ×$Ñ$×7Ò7¼3¸s»8ÑCÕ7ð �M‰M˜#Ô Ø—‘˜“ˆAØ�AŠvØðð( �Š7؈DŒJØ—8‘8˜FÓ#Ð #à ˆQ‰ˆØ˜B‘Z  �^ˆŒ ؘB‘Z  �^ˆˆr‰ Ø�x‰x˜ÓÐøô%"ò Ùð úsÃ2E7Å7 FÆFcóŠ—d}g} |j«}|s |S|j|«|t|«z }|r||k\r |SŒ?r<)r·rrC)rÚsizehintÚtotalrrcs rÚ readlineszHTTPResponse.readlinesAsZ€ØˆØˆØØ—=‘=“?ˆDÙØð ˆ ð �K‰K˜Ô Ø ”S˜“YÑ ˆEÙ˜E XÒ-ØØˆ ðrcó„—|j€6|jt|««}|sy||dt|«t|«St|«}t|j«}||k\r(|jd||d||j|d|_|St |«}|j|||«}|xj |z c_|j xj |z c_ |jxj |z c_|j|d||t|j«z }d|_|S#t$rYŒ;wxYw)Nrr) rÄr±rCržÚ memoryviewr�rmrir�)rÚdestÚresrÊÚhaveÚmvÚgots rr¢zHTTPResponse.readintoNs.€Ø × Ñ Ð %Ø—)‘)œC ›IÓ&ˆCÙØØ!$ˆD�”S˜“XÐ Ü�s“8ˆOÜ�D“ ˆÜ�4—:‘:‹ˆØ �5Š=Ø ŸJ™J v¨Ð.ˆD��5ˆMØŸ™ E FÐ+ˆDŒJ؈LÜ ˜Ó ˆØ× Ñ   D¨ Ó0ˆà ×Ò 3Ñ&ÕØ ×Ñ×+Ò+¨sÑ2Õ+ð Ø �M‰M× ,Ò ,°Ñ 3Õ ,ð—z‘zˆˆQˆtˆ Ø Œs�4—:‘:‹ÑˆØˆŒ ؈ øô ò Ù ð úsÃ$D3Ä3 D?Ä>D?)rrNrr”)r4r5r6rr`r˜r±r­rrÄrGr§rHr\r«rÀr·rËr¢r8rrr˜r˜~sc„ó&  ð×$Ñ$×)Ñ)€IÙ˜G×0Ñ0°*¸dÓC€Mòòòòòóò@4òl, ó\ órr˜có—t|dd«�y|j€-|jr|j«ntj ‚|j dkDrtdt|«« d}t|dd«}|�i|j dkDr td«||«}|r|jj|«|xjt|«z c_ ||«}|rŒDy|jj|«|xjt|«z c_ yy#t$rT|jtjk(rd|_|j!«|_d}nd }|j#«|r‚YywxYw) z`Send `str' to the server. Shamelessly ripped off from httplib to patch a bad behavior. Ú_broken_pipe_respNrssend:i r±ssending a read()ableFT)rr Ú auto_openÚconnectr`Ú NotConnectedršÚprintÚreprÚsendallr@rCÚBrokenPipeErrorÚ_HTTPConnection__stateÚ _CS_REQ_SENTrÔr_rG)rÚstrÚ blocksizer±r’Úreraises rÚsafesendráksW€ôˆtÐ(¨$Ó/Ð;Øà ‡y�yÐØ �>Š>Ø �L‰L�Nä×&Ñ&Ð &ð ‡�˜ÒÜ ˆhœ˜S› Ô"ðØˆ Ü�s˜F DÓ)ˆØ Ð Ø�‰ Ò"ÜÐ-Ô.Ù˜ “?ˆDÙØ— ‘ ×!Ñ! $Ô'Ø×#Ò#¤s¨4£yÑ0Õ#Ù˜I“�óð �I‰I× Ñ ˜cÔ "Ø × Ò ¤3 s£8Ñ +Ö ð øô ò Ø × &Ñ &¬'×*>Ñ*>Ò >Ø%)ˆDÔ "Ø%)×%5Ñ%5Ó%7ˆDÔ "؉GàˆGØ � ‰ Œ Ù Ø ñ ð úsÁ-A8D"Ã'9D"Ä"AE?Å>E?cóH‡—ˆfd„}‰jj|_|S)z9Wraps getresponse in cls with a broken-pipe sane version.cóH•—t|dd«}|�|S‰j|«S)NrÔ)rr_)rrrÚclss €rÚsafegetresponsez(wrapgetresponse..safegetresponse¤s-ø€ô �DÐ-¨tÓ 4ˆØ ˆ=؈HØ�‰˜tÓ$Ð$r)r_r7)rärås` rÚwrapgetresponseræ¡s"ø€ô%ð"Ÿo™o×5Ñ5€OÔØ ÐrcóP‡—eZdZeZeZeej«Z d„Z ˆfd„Z ˆxZ S)rRcóf—tjj|g|¢­i|¤Žd|_d|_yr<)r`rRrr@r�)rÚargsÚkwargss rrzHTTPConnection.__init__¼s0€Ü×Ñ×'Ñ'¨Ð>¨tÒ>°vÒ>ØˆÔØ"#ˆÕrcóÈ•—tt|� «}d}|j}|r d|j «z}d|||j |jfzS#t $rYŒ(wxYw)Nz (unconnected)z%s:%dz<%s: %s <--> %s:%d>)ÚsuperrRÚ__repr__r Ú getsocknameÚOSErrorr!Úport)rÚbaseÚlocalr°Ú __class__s €rrízHTTPConnection.__repr__Ásjø€Ü”^ TÑ3Ó5ˆØˆØ �I‰IˆÙ ð Ø !§-¡-£/Ñ1�ð%¨¨e°T·Y±YÀÇ Á Ð'JÑJÐJøôò Ùð ús¥AÁ A!Á A!)r4r5r6r˜Úresponse_classrárŽrær`rRr_rríÚ __classcell__)rós@rrRrR²s0ø„ð "€NØ €DÙ! '×"8Ñ"8Ó9€Kò$÷ Kð KrrRcóP—tj}d}tj«}tj |«tj |«}|j «}|j«||«}t|dt|j««fz«tjt««}tj |«tj |«}|j «}|j«||«}t|dt|j««fz«tj |«}d} |j«}|r||z}nnŒ|j«||«}t|dt|j««fz«y)Ns%25s: %ss normal urllibskeepalive readrskeepalive readline) ÚhashlibÚmd5ÚurlreqÚ buildopenerÚ installopenerÚurlopenr±rGrØrÚdigestr–r·)ÚurlrøÚformatÚopenerÚfoÚfooÚmÚfs rÚ continuityrÒsF€Ü �+‰+€CØ €Fô× Ñ Ó !€FÜ ×Ñ˜Ô Ü �‰˜Ó €BØ �'‰'‹)€C؇H�H„JÙ ˆC‹€AÜ ˆ&Ð$¤c¨!¯(©(«*£oÐ6Ñ 6Ô7ô× Ñ ¤ £ Ó .€FÜ ×Ñ˜Ô ä �‰˜Ó €BØ �'‰'‹)€C؇H�H„JÙ ˆC‹€AÜ ˆ&Ð%¤s¨1¯8©8«:£Ð7Ñ 7Ô8ä �‰˜Ó €BØ €CØ Ø �K‰K‹MˆÙ ؘ‘'‰Cà ð ð ‡H�H„JÙ ˆC‹€AÜ ˆ&Ð)¬3¨q¯x©x«z«?Ð;Ñ ;Õ.FakeLoggercó —t||z«yr)rØ)rrorés rÚdebugz&test_timeout..FakeLogger.debug%s€Ü �#˜‘*Õ rN)r4r5r6rr\Úwarningrer8rrÚ FakeLoggerr$s„ò ð"'Ð&ˆÐ&ˆw™rrs- fetching the file to establish a connectionés; waiting %i seconds for the server to close the connectionrs %2iró s! fetching the file a second times data are identicals ERROR: DATA DIFFER) r[rØrùrür±rGr rrÚflushrrÚstderr)rþÚdbbackuprrÚdata1r¿Údata2s rÚ test_timeoutr% s€ä€H÷'ñ'ñ ‹L€EÜ Ð :Ô;Ü �‰˜Ó €BØ �G‰G‹I€E؇H�H„Jà €AÜ Ð HÈ1Ñ LÔMØ ˆaŠ%Ü�‰×јj¨1™nÔ-Ü�‰×ÑÔÜ � ‰ �1Œ Ø ˆQ‰ˆð ˆa‹%ô  ‡O�O×ј%Ô ä Ð .Ô/Ü �‰˜Ó €BØ �G‰G‹I€E؇H�H„Jà �‚~Ü Ð%Ô&ð �Eô Ð%Ô&à �Ercó¶—td«t|«td«td«t||«td«td«t|«y)Ns>performing continuity test (making sure stuff isn't corrupted)rsperforming speed comparisons#performing dropped-connection check)rØrr r%)rþr s rÚtestr'FsC€Ü Ð KÔL܈s„OÜ ˆ#„JÜ Ð (Ô)܈ˆC„LÜ ˆ#„JÜ Ð 0Ô1Ü�ÕrÚ__main__rµs%s r”)é )+r7rr÷rdÚsysrÚi18nrrrÚnoderÚrr Úutilsr r`rXrùr[r r:Ú httphandlerr–r˜rárærRrr r r%r'r4rr¹Úargvr rþÚ IndexErrorrºrØr8rrÚr2s>ðñ47óxÛÛ Û ÛåÝÝ÷ñõ à �,‰,€Ø �‰€Ø �‰€à €÷>ñ>÷BIñIôX Ð" F×$6Ñ$6ô ôj�7×'Ñ'ôjòZ3òlô"K�W×+Ñ+ôKò@!=òH5ó&ò.#óLð ˆzÒÛðÙ �—‘˜‘ Ó ˆØ�h‰h�q‰kˆñ ˆS�!� ðøð ˜ Ð #ò3Ù Ð# c§h¡h¨q¡kÑ1Ö2ð3úsÃ$DÄD%Ä$D%