U e5dü¿ã @sfdZddlZddlZddlZddlmZddlmZddlZddl Z ddl m Z ddl Z ddlmZz ddlZWnek rˆdZYnXdd„Zd ejdd …Zd Zd Zd ZdZdZdZdZd ZdZdZdZdZ dZ!dZ"Gdd„de#ƒZ$Gdd„de$ƒZ%Gdd„de$ƒZ&Gdd„de$ƒZ'e(Z)Z*edddƒZ+e+ ,d ¡d!k�rJd"d#„Z-n"e+ ,d$¡d!k�rdd%d#„Z-nd&d#„Z-[+d'd(„Z.Gd)d*„d*ƒZ/d+d,„Z0d-d.„Z1Gd/d0„d0ƒZ2d1d2„Z3e/e2fZ4Gd3d4„d4ƒZ5Gd5d6„d6ƒZ6Gd7d8„d8ƒZ7Gd9d:„d:ƒZ8Gd;d<„d<ƒZ9Gd=d>„d>ƒZ:dZ;ZdZdBdC„Z?d[dDdE„Z@dFdG„ZAd\dIdJ„ZBGdKdL„dLe�rXejCneDƒZEGdMdN„dNƒZFGdOdP„dPƒZGGdQdR„dReGƒZHGdSdT„dTƒZIeIZJeKdUk�rbeIdVƒZLzeMeLjN O¡ƒWn.e$k �rîZPzeMdWePƒW5dZP[PXYnXe:eLƒZQeQ R¡eQ Sd dX¡eQ Tdd ¡zeQƒD]ZUeMeUƒ�q Wn.e$k �r`ZPzeMdWePƒW5dZP[PXYnXdS)]a° An XML-RPC client interface for Python. The marshalling and response parser code can also be used to implement XML-RPC servers. Exported exceptions: Error Base class for client errors ProtocolError Indicates an HTTP protocol error ResponseError Indicates a broken response package Fault Indicates an XML-RPC fault package Exported classes: ServerProxy Represents a logical connection to an XML-RPC server MultiCall Executor of boxcared xmlrpc requests DateTime dateTime wrapper for an ISO 8601 string or time tuple or localtime integer value to generate a "dateTime.iso8601" XML-RPC value Binary binary data wrapper Marshaller Generate an XML-RPC params chunk from a Python data structure Unmarshaller Unmarshal an XML-RPC response from incoming XML event message Transport Handles an HTTP transaction to an XML-RPC server SafeTransport Handles an HTTPS transaction to an XML-RPC server Exported constants: (none) Exported functions: getparser Create instance of the fastest available parser & attach to an unmarshalling object dumps Convert an argument tuple or a Fault instance to an XML-RPC request (or response, if the methodresponse option is used). loads Convert an XML-RPC packet to unmarshalled data plus a method name (None if not present). éN)Údatetime)ÚDecimal)Úexpat)ÚBytesIOcCs$| dd¡}| dd¡}| dd¡S)Nú&z&úz>)Úreplace)Ús©r ú%/usr/lib64/python3.8/xmlrpc/client.pyÚescape•s  r z%d.%déiÿÿÿi€iD€ÿÿi¨€ÿÿi �ÿÿip�ÿÿiÔ�ÿÿiC€ÿÿiB€ÿÿi§€ÿÿi¦€ÿÿi¥€ÿÿc@seZdZdZejZdS)ÚErrorzBase class for client errors.N)Ú__name__Ú __module__Ú __qualname__Ú__doc__ÚobjectÚ__str__r r r r r»src@s eZdZdZdd„Zdd„ZdS)Ú ProtocolErrorz!Indicates an HTTP protocol error.cCs&t |¡||_||_||_||_dS©N)rÚ__init__ÚurlÚerrcodeÚerrmsgÚheaders)Úselfrrrrr r r rËs  zProtocolError.__init__cCsd|jj|j|j|jfS)Nz<%s for %s: %s %s>)Ú __class__rrrr©rr r r Ú__repr__ÑsÿÿzProtocolError.__repr__N©rrrrrr r r r r rÉsrc@seZdZdZdS)Ú ResponseErrorz$Indicates a broken response package.N)rrrrr r r r r"Üsr"c@s eZdZdZdd„Zdd„ZdS)ÚFaultz#Indicates an XML-RPC fault package.cKst |¡||_||_dSr)rrÚ faultCodeÚ faultString)rr$r%Zextrar r r rës zFault.__init__cCsd|jj|j|jfS)Nz <%s %s: %r>)rrr$r%rr r r r ïsÿzFault.__repr__Nr!r r r r r#ésr#éz%YZ0001cCs | d¡S©Nú%Y%m%dT%H:%M:%S©Ústrftime©Úvaluer r r Ú_iso8601_format sr-z%4YcCs | d¡S)Nz%4Y%m%dT%H:%M:%Sr)r+r r r r-scCs| d¡ d¡S)Nr(é)r*Úzfillr+r r r r-scCsLt|tƒrt|ƒSt|ttjfƒs<|dkr2t ¡}t |¡}d|dd…S)Nrz%04d%02d%02dT%02d:%02d:%02dé)Ú isinstancerr-ÚtupleÚtimeÚ struct_timeÚ localtimer+r r r Ú _strftimes  r6c@sreZdZdZddd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„ZdS)ÚDateTimez‹DateTime wrapper for an ISO 8601 string or time tuple or localtime integer value to generate 'dateTime.iso8601' XML-RPC value. rcCs t|tƒr||_n t|ƒ|_dSr)r1Ústrr,r6)rr,r r r r(s zDateTime.__init__cCsšt|tƒr|j}|j}nzt|tƒr2|j}t|ƒ}n`t|tƒrH|j}|}nJt|dƒrd| ¡}| ¡}n.t|dƒrv|jj p|t |ƒ}t d|jj |fƒ‚||fS)NÚ timetuplerzCan't compare %s and %s) r1r7r,rr-r8Úhasattrr9rrÚtypeÚ TypeError)rÚotherr ÚoZotyper r r Úmake_comparable.s*       ÿþ ÿzDateTime.make_comparablecCs| |¡\}}||kSr©r?©rr=r r>r r r Ú__lt__CszDateTime.__lt__cCs| |¡\}}||kSrr@rAr r r Ú__le__GszDateTime.__le__cCs| |¡\}}||kSrr@rAr r r Ú__gt__KszDateTime.__gt__cCs| |¡\}}||kSrr@rAr r r Ú__ge__OszDateTime.__ge__cCs| |¡\}}||kSrr@rAr r r Ú__eq__SszDateTime.__eq__cCst |jd¡Sr')r3Ústrptimer,rr r r r9WszDateTime.timetuplecCs|jSrr+rr r r r_szDateTime.__str__cCsd|jj|jt|ƒfS)Nz<%s %r at %#x>)rrr,Úidrr r r r bszDateTime.__repr__cCst|ƒ ¡|_dSr)r8Ústripr,©rÚdatar r r ÚdecodeeszDateTime.decodecCs$| d¡| |j¡| d¡dS©Nzz )Úwriter,)rÚoutr r r Úencodehs  zDateTime.encodeN)r)rrrrrr?rBrCrDrErFr9rr rLrPr r r r r7"s r7cCstƒ}| |¡|Sr)r7rL©rKr,r r r Ú _datetimems rRcCs t |d¡Sr')rrG)rKr r r Ú_datetime_typessrSc@s:eZdZdZd dd„Zdd„Zdd„Zd d „Zd d „ZdS)ÚBinaryzWrapper for binary data.NcCs>|dkrd}n&t|ttfƒs,td|jjƒ‚t|ƒ}||_dS)Nóz#expected bytes or bytearray, not %s)r1ÚbytesÚ bytearrayr<rrrKrJr r r rsÿzBinary.__init__cCs t|jdƒS)Nzlatin-1)r8rKrr r r rŽszBinary.__str__cCst|tƒr|j}|j|kSr)r1rTrK)rr=r r r rF‘s z Binary.__eq__cCst |¡|_dSr)Úbase64Ú decodebytesrKrJr r r rL–sz Binary.decodecCs4| d¡t |j¡}| | d¡¡| d¡dS©Nz Úasciiz )rNrXÚ encodebytesrKrL)rrOÚencodedr r r rP™s  z Binary.encode)N) rrrrrrrFrLrPr r r r rT|s  rTcCstƒ}| |¡|Sr)rTrLrQr r r Ú_binaryŸs r^c@s$eZdZdd„Zdd„Zdd„ZdS)Ú ExpatParsercCsDt dd¡|_}||_|j|_|j|_|j|_ d}|  |d¡dSr) rZ ParserCreateÚ_parserÚ_targetÚstartZStartElementHandlerÚendZEndElementHandlerrKZCharacterDataHandlerÚxml)rÚtargetÚparserÚencodingr r r r¬szExpatParser.__init__cCs|j |d¡dS©Nr)r`ÚParserJr r r ÚfeedµszExpatParser.feedcCs8z |j}Wntk rYnX|`|`| dd¡dS)NrUT)r`ÚAttributeErrorrari)rrfr r r Úclose¸s  zExpatParser.closeN)rrrrrjrlr r r r r_ªs r_c@sþeZdZdZddd„ZiZdd„Zdd „Zd d „Zeee dƒ<d d „Z e ee <dd„Z e ee <e Zdd„Zeee<efdd„Zeee<dd„Zeee<eee<dd„Zeee<eee<efdd„Zeee<dd„Zeee<dd„Zeee<eee <eed<dS) Ú MarshalleravGenerate an XML-RPC params chunk from a Python data structure. Create a Marshaller instance for each set of parameters, and use the "dumps" method to convert your data (represented as a tuple) to an XML-RPC params chunk. To write a fault response, pass a Fault instance instead. You may prefer to use the "dumps" module function for this purpose. NFcCsi|_d|_||_||_dSr)ÚmemorKrgÚ allow_none)rrgror r r rØszMarshaller.__init__cCs‚g}|j}|j}t|tƒr@|dƒ||j|jdœ|ƒ|dƒn4|dƒ|D]}|dƒ|||ƒ|dƒqL|dƒd |¡}|S) Nz )r$r%z z z z z Ú)ÚappendÚ_Marshaller__dumpr1r#r$r%Újoin)rÚvaluesrOrNÚdumpÚvÚresultr r r Údumpsàs& ÿþ    zMarshaller.dumpscCsŠz|jt|ƒ}Wnftk rxt|dƒs)ror<©rr,rNr r r Údump_nil szMarshaller.dump_nilcCs$|dƒ||rdpdƒ|dƒdS)NzÚ1Ú0z r r€r r r Ú dump_boolszMarshaller.dump_boolcCs<|tks|tkrtdƒ‚|dƒ|tt|ƒƒƒ|dƒdS)Nzint exceeds XML-RPC limitsz z )ÚMAXINTÚMININTÚ OverflowErrorr8Úintr€r r r Ú dump_longs zMarshaller.dump_longcCs |dƒ|t|ƒƒ|dƒdS)Nzz )Úreprr€r r r Ú dump_double$s zMarshaller.dump_doublecCs |dƒ|||ƒƒ|dƒdS)Nzz r )rr,rNr r r r Ú dump_unicode*s zMarshaller.dump_unicodecCs,|dƒt |¡}|| d¡ƒ|dƒdSrZ)rXr\rL)rr,rNr]r r r Ú dump_bytes0s zMarshaller.dump_bytescCsZt|ƒ}||jkrtdƒ‚d|j|<|j}|dƒ|D]}|||ƒq6|dƒ|j|=dS)Nz"cannot marshal recursive sequencesz z )rHrnr<rr)rr,rNÚirurvr r r Ú dump_array8s   zMarshaller.dump_arraycCs”t|ƒ}||jkrtdƒ‚d|j|<|j}|dƒ| ¡D]D\}}|dƒt|tƒs\tdƒ‚|d||ƒƒ|||ƒ|dƒq:|dƒ|j|=dS)Nz%cannot marshal recursive dictionariesz z zdictionary key must be stringz%s z z )rHrnr<rrÚitemsr1r8)rr,rNr rŽruÚkrvr r r Ú dump_structFs     zMarshaller.dump_structcCs |dƒ|t|ƒƒ|dƒdSrM)r6r€r r r Ú dump_datetimeXs zMarshaller.dump_datetimecCs2|jtkr ||_| |¡|`n| |j|¡dSr)rÚWRAPPERSrNrPr’ryr€r r r Ú dump_instance^s   zMarshaller.dump_instancerz)NF)!rrrrrr{rxrrr�r;r„Úboolr‰rˆZdump_intr‹Úfloatr rŒr8r�rVrWr�r2Úlistr’Údictr“rr•r7rTr r r r rmËs<      rmc@sneZdZdZdEdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z iZ dd„Z e e d<dd„Zee d<dd„Zee d<ee d<ee d<ee d<ee d<ee d <d!d"„Zee d#<ee d$<d%d&„Zee d'<d(d)„Zee d*<ee d+<d,d-„Zee d.<d/d0„Zee d1<d2d3„Zee d4<d5d6„Zee d7<d8d9„Zee d:<d;d<„Zee d=<d>d?„Zee d@<dAdB„Zee dC<dDS)FÚ UnmarshalleraUnmarshal an XML-RPC response, based on incoming XML event messages (start, data, end). Call close() to get the resulting data structure. Note that this reader is fairly tolerant, and gladly accepts bogus XML-RPC data without complaining (but not bogus XML). FcCsHd|_g|_g|_g|_d|_d|_d|_|jj|_|p:||_||_ dS)NFúutf-8) Ú_typeÚ_stackÚ_marksÚ_dataÚ_valueÚ _methodnameÚ _encodingrqÚ _use_datetimeÚ _use_bytes)rÚ use_datetimeÚuse_builtin_typesr r r r~s  zUnmarshaller.__init__cCs:|jdks|jrtƒ‚|jdkr0tf|jdŽ‚t|jƒS)NÚfaultr)rœržr"r#r�r2rr r r rlŠs  zUnmarshaller.closecCs|jSr)r¡rr r r Ú getmethodname’szUnmarshaller.getmethodnamecCs ||_dSr)r¢)rrgZ standaloner r r rd˜szUnmarshaller.xmlcCshd|kr| d¡d}|dks&|dkr8|j t|jƒ¡g|_|jrZ||jkrZtd|ƒ‚|dk|_dS)Nú:éÿÿÿÿÚarrayÚstructzunknown tag %rr,) ÚsplitržrqÚlenr�rŸr r{r")rÚtagÚattrsr r r rbœs zUnmarshaller.startcCs|j |¡dSr)rŸrq)rÚtextr r r rK§szUnmarshaller.datac Csvz|j|}WnTtk rbd|kr,YdSz|j| d¡d}Wntk r\YYdSXYnX||d |j¡ƒS)Nr©rªrp)r{r|r­rsrŸ)rr¯rr r r rcªszUnmarshaller.endc Csnz|j|}WnTtk rbd|kr,YdSz|j| d¡d}Wntk r\YYdSXYnX|||ƒS)Nr©rª)r{r|r­)rr¯rKrr r r Ú end_dispatchºszUnmarshaller.end_dispatchcCs| d¡d|_dSrh)rqr rJr r r Úend_nilÌs zUnmarshaller.end_nilZnilcCs:|dkr| d¡n|dkr(| d¡ntdƒ‚d|_dS)NrƒFr‚Tzbad boolean valuer)rqr<r rJr r r Ú end_booleanÑs   zUnmarshaller.end_booleanÚbooleancCs| t|ƒ¡d|_dSrh)rqrˆr rJr r r Úend_intÛszUnmarshaller.end_intZi1Zi2Zi4Zi8rˆZ bigintegercCs| t|ƒ¡d|_dSrh)rqr—r rJr r r Ú end_doubleåszUnmarshaller.end_doubleZdoubler—cCs| t|ƒ¡d|_dSrh)rqrr rJr r r Úend_bigdecimalëszUnmarshaller.end_bigdecimalZ bigdecimalcCs&|jr| |j¡}| |¡d|_dSrh)r¢rLrqr rJr r r Ú end_stringðs  zUnmarshaller.end_stringÚstringÚnamecCs.|j ¡}|j|d…g|j|d…<d|_dSrh)ržÚpopr�r )rrKÚmarkr r r Ú end_arrayøs zUnmarshaller.end_arrayr«cCs`|j ¡}i}|j|d…}tdt|ƒdƒD]}||d|||<q,|g|j|d…<d|_dS)Nrrr&)ržr¼r�Úranger®r )rrKr½r™r�rŽr r r Ú end_structÿs zUnmarshaller.end_structr¬cCs6tƒ}| | d¡¡|jr"|j}| |¡d|_dS)Nr[r)rTrLrPr¤rKrqr ©rrKr,r r r Ú end_base64 s  zUnmarshaller.end_base64rXcCs,tƒ}| |¡|jrt|ƒ}| |¡dSr)r7rLr£rSrqrÁr r r Ú end_dateTimes  zUnmarshaller.end_dateTimezdateTime.iso8601cCs|jr| |¡dSr)r r¹rJr r r Ú end_valueszUnmarshaller.end_valuer,cCs d|_dS)NÚparams©rœrJr r r Ú end_params"szUnmarshaller.end_paramsrÅcCs d|_dS)Nr§rÆrJr r r Ú end_fault&szUnmarshaller.end_faultr§cCs"|jr| |j¡}||_d|_dS)NÚ methodName)r¢rLr¡rœrJr r r Úend_methodName*s zUnmarshaller.end_methodNamerÉN)FF)rrrrrrlr¨rdrbrKrcr²r{r³r´r¶r·r¸r¹r¾rÀrÂrÃrÄrÇrÈrÊr r r r ršrsZ   ršc@s$eZdZdd„Zdd„Zdd„ZdS)Ú_MultiCallMethodcCs||_||_dSr)Ú_MultiCallMethod__call_listÚ_MultiCallMethod__name)rZ call_listr»r r r r7sz_MultiCallMethod.__init__cCst|jd|j|fƒS©Nz%s.%s)rËrÌrÍ©rr»r r r Ú __getattr__:sz_MultiCallMethod.__getattr__cGs|j |j|f¡dSr)rÌrqrÍ©rÚargsr r r Ú__call__<sz_MultiCallMethod.__call__N©rrrrrÐrÓr r r r rË4srËc@s eZdZdZdd„Zdd„ZdS)ÚMultiCallIteratorzaIterates over the results of a multicall. Exceptions are raised in response to xmlrpc faults.cCs ||_dSr)Úresults)rrÖr r r rCszMultiCallIterator.__init__cCsR|j|}t|ƒtiƒkr.t|d|dƒ‚n t|ƒtgƒkrF|dStdƒ‚dS)Nr$r%rz#unexpected type in multicall result)rÖr;r#Ú ValueError)rrŽÚitemr r r Ú __getitem__Fs  zMultiCallIterator.__getitem__N)rrrrrrÙr r r r rÕ?srÕc@s0eZdZdZdd„Zdd„Zdd„Zdd „Zd S) Ú MultiCalla~server -> an object used to boxcar method calls server should be a ServerProxy object. Methods can be added to the MultiCall using normal method call syntax e.g.: multicall = MultiCall(server_proxy) multicall.add(2,3) multicall.get_address("Guido") To execute the multicall, call the MultiCall object e.g.: add_result, address = multicall() cCs||_g|_dSr)Ú_MultiCall__serverÚ_MultiCall__call_list)rÚserverr r r r`szMultiCall.__init__cCsd|jjt|ƒfS)Nz <%s at %#x>)rrrHrr r r r dszMultiCall.__repr__cCs t|j|ƒSr)rËrÜrÏr r r rÐgszMultiCall.__getattr__cCs6g}|jD]\}}| ||dœ¡q t|jj |¡ƒS)N)rÉrÅ)rÜrqrÕrÛÚsystemZ multicall)rZmarshalled_listr»rÒr r r rÓjszMultiCall.__call__N)rrrrrr rÐrÓr r r r rÚOs rÚFcCsrtrHtrH|rt}tj}n|r&t}t}nt}t}tdd||tƒ}t|ƒ}n"t||d�}trbt|ƒ}nt |ƒ}||fS)z¥getparser() -> parser, unmarshaller Create an instance of the fastest available parser, and attach it to an unmarshalling object. Return both objects. TF©r¥r¦) Ú FastParserÚFastUnmarshallerrSrXrYr^rRr#ršr_)r¥r¦Z mkdatetimeZmkbytesrerfr r r Ú getparser|s    râcCsÂt|ttfƒstdƒ‚t|tƒr&d}n"|rHt|tƒrHt|ƒdksHtdƒ‚|sPd}tr^t|ƒ}n t||ƒ}| |¡}|dkrˆdt|ƒ}nd}|r¢|d|d|d f}n|r´|d |d f}n|Sd   |¡S) aÙdata [,options] -> marshalled data Convert an argument tuple or a Fault instance to an XML-RPC request (or response, if the methodresponse option is used). In addition to the data object, the following options can be given as keyword arguments: methodname: the method name for a methodCall packet methodresponse: true to create a methodResponse packet. If this option is used with a tuple, the tuple must be a singleton (i.e. it can contain only one element). encoding: the packet encoding (default is UTF-8) All byte strings in the data structure are assumed to use the packet encoding. Unicode strings are automatically converted, where necessary. z(argument must be tuple or Fault instancer&z"response tuple must be a singletonr›z$ z z z z z z rp) r1r2r#ÚAssertionErrorr®ÚFastMarshallerrmrxr8rs)rÅÚ methodnameZmethodresponsergroÚmrKZ xmlheaderr r r rx£s<    ûürxcCs2t||d�\}}| |¡| ¡| ¡| ¡fS)zòdata -> unmarshalled data, method name Convert an XML-RPC packet to unmarshalled data plus a method name (None if not present). If the XML-RPC packet represents a fault condition, this function raises a Fault exception. rß)rârjrlr¨)rKr¥r¦ÚpÚur r r Úloadsîs  réc Cs<tst‚tƒ}tjd|dd��}| |¡W5QRX| ¡S)zhdata -> gzip encoded data Encode data using the gzip content encoding as described in RFC 1952 Úwbr&)ÚmodeÚfileobjZ compresslevel)ÚgzipÚNotImplementedErrorrÚGzipFilerNÚgetvalue)rKrÚgzfr r r Ú gzip_encodes ròé@c Csˆtst‚tjdt|ƒd��H}z$|dkr0| ¡}n| |d¡}Wntk r\tdƒ‚YnXW5QRX|dkr„t|ƒ|kr„tdƒ‚|S)zrgzip encoded data -> unencoded data Decode data using the gzip content encoding as described in RFC 1952 Úrb©rërìrr&z invalid dataz#max gzipped payload length exceeded)rírîrïrÚreadÚOSErrorr×r®)rKZ max_decoderñZdecodedr r r Ú gzip_decodes røc@s eZdZdZdd„Zdd„ZdS)ÚGzipDecodedResponsezha file-like object to decode a response encoded with the gzip method, as described in RFC 1952. cCs.tst‚t| ¡ƒ|_tjj|d|jd�dS)Nrôrõ)rírîrröÚiorïr)rÚresponser r r r:szGzipDecodedResponse.__init__cCs"ztj |¡W5|j ¡XdSr)rúrlrírïrr r r rlBszGzipDecodedResponse.closeN)rrrrrrlr r r r rù6srùc@s$eZdZdd„Zdd„Zdd„ZdS)Ú_MethodcCs||_||_dSr©Ú _Method__sendÚ _Method__name)rÚsendr»r r r rOsz_Method.__init__cCst|jd|j|fƒSrÎ)rürþrÿrÏr r r rÐRsz_Method.__getattr__cGs| |j|¡SrrýrÑr r r rÓTsz_Method.__call__NrÔr r r r rüLsrüc@s„eZdZdZdeZdZdZdddœdd „Zdd d „Z d d d „Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„ZdS)!Ú Transportz1Handles an HTTP transaction to an XML-RPC server.zPython-xmlrpc/%sTNFr )rcCs&||_||_d|_t|ƒ|_g|_dS©N)NN)r£Ú_use_builtin_typesÚ _connectionr˜Ú_headersÚ_extra_headers)rr¥r¦rr r r rks  zTransport.__init__c Cs€dD]v}z| ||||¡WStjjk r<|r8‚Yqtk rx}z |sf|jtjtjtjfkrh‚W5d}~XYqXqdS)N)rr&) Úsingle_requestÚhttpÚclientZRemoteDisconnectedr÷ÚerrnoZ ECONNRESETZ ECONNABORTEDZEPIPE)rÚhostÚhandlerÚ request_bodyÚverboserŽÚer r r Úrequest}sÿzTransport.requestcCs¢z8| ||||¡}| ¡}|jdkr6||_| |¡WSWn2tk rN‚Yntk rj| ¡‚YnX| dd¡r€|  ¡t |||j|j t |  ¡ƒƒ‚dS)NéÈzcontent-lengthrp)Ú send_requestZ getresponseZstatusrÚparse_responser#Ú ExceptionrlÚ getheaderrörÚreasonr™Z getheaders)rr r r rZ http_connZrespr r r rŠs&   ýzTransport.single_requestcCst|j|jd�S)Nrß)râr£rrr r r râ«sÿzTransport.getparsercCsri}t|tƒr|\}}tj |¡\}}|rdtj |¡}t |¡ d¡}d  |  ¡¡}dd|fg}ng}|||fS)Nr›rpZ AuthorizationzBasic ) r1r2ÚurllibÚparseZ _splituserZunquote_to_bytesrXr\rLrsr­)rr Úx509ZauthZ extra_headersr r r Ú get_host_infoºs   ÿzTransport.get_host_infocCsL|jr||jdkr|jdS| |¡\}|_}|tj |¡f|_|jdS)Nrr&)rrrrr ZHTTPConnection©rr Zchostrr r r Úmake_connectionÔs  zTransport.make_connectioncCs |j\}}|rd|_| ¡dSr)rrl)rr Ú connectionr r r rlâs zTransport.closecCsŒ| |¡}|j|j}|r$| d¡|jrJtrJ|jd|dd�| d¡n | d|¡| d¡| d|jf¡|  ||¡|  ||¡|S)Nr&ZPOSTT)Zskip_accept_encoding)zAccept-Encodingrí)z Content-Typeztext/xmlz User-Agent) rrrZset_debuglevelÚaccept_gzip_encodingríZ putrequestrqÚ user_agentÚ send_headersÚ send_content)rr r r Údebugrrr r r rñs         zTransport.send_requestcCs|D]\}}| ||¡qdSr)Ú putheader)rrrÚkeyÚvalr r r r s zTransport.send_headerscCsR|jdk r0|jt|ƒkr0tr0| dd¡t|ƒ}| dtt|ƒƒ¡| |¡dS)NúContent-EncodingrízContent-Length)Úencode_thresholdr®rír#ròr8Z endheaders)rrr r r r r!s  ÿþ zTransport.send_contentcCsŠt|dƒr*| dd¡dkr$t|ƒ}q.|}n|}| ¡\}}| d¡}|sJqj|jr^tdt|ƒƒ| |¡q:||k rz|  ¡|  ¡|  ¡S)Nrr&rpríizbody:) r:rrùrârörÚprintrŠrjrl)rrûÚstreamrçrèrKr r r r$s      zTransport.parse_response)FF)F)F)rrrrÚ __version__rrr'rrrrârrrlrr r!rr r r r r]s"ÿ  ! rcs2eZdZdZd dddœ‡fdd„ Zdd „Z‡ZS) Ú SafeTransportz2Handles an HTTPS transaction to an XML-RPC server.Fr N©rÚcontextcstƒj|||d�||_dS)N©r¥r¦r)Úsuperrr-)rr¥r¦rr-©rr r rEs þzSafeTransport.__init__cCst|jr||jdkr|jdSttjdƒs2tdƒ‚| |¡\}|_}|tjj|dfd|ji|p`i—Žf|_|jdS)Nrr&ÚHTTPSConnectionz1your version of http.client doesn't support HTTPSr-) rr:rr rîrrr1r-rr r r rNs  ÿ ÿÿÿ zSafeTransport.make_connection)FF)rrrrrrÚ __classcell__r r r0r r+Bs ÿ r+c@sZeZdZdZddddœdd„Zdd „Zd d „Zd d „Zdd„Zdd„Z dd„Z dd„Z dS)Ú ServerProxya…uri [,options] -> a logical connection to an XML-RPC server uri is the connection point on the server, given as scheme://host/target. The standard implementation always supports the "http" scheme. If SSL socket support is available (Python 2.0), it also supports "https". If the target part and the slash preceding it are both omitted, "/RPC2" is assumed. The following options can be given as keyword arguments: transport: a transport factory encoding: the request encoding (default is UTF-8) All 8-bit strings passed to the server proxy are assumed to use the given encoding. NFr r,c Csœtj |¡\} }| dkr tdƒ‚tj |¡\|_|_|js@d|_|dkr|| dkr^t} d| i} nt} i} | f|||dœ| —Ž}||_ |pˆd|_ ||_ ||_ dS)N)rÚhttpszunsupported XML-RPC protocolz/RPC2r4r-r.r›) rrZ _splittyper÷Z _splithostÚ_ServerProxy__hostÚ_ServerProxy__handlerr+rÚ_ServerProxy__transportÚ_ServerProxy__encodingÚ_ServerProxy__verboseÚ_ServerProxy__allow_none) rZuriÚ transportrgrror¥r¦rr-r;r Z extra_kwargsr r r rƒs, þý zServerProxy.__init__cCs|j ¡dSr)r7rlrr r r Z__close¡szServerProxy.__closecCsPt|||j|jd� |jd¡}|jj|j|j||jd�}t |ƒdkrL|d}|S)N)rgroÚxmlcharrefreplace)rr&r) rxr8r:rPr7rr5r6r9r®)rrårÅrrûr r r Z __request¤s ÿÿü zServerProxy.__requestcCsd|jj|j|jfS)Nz <%s for %s%s>)rrr5r6rr r r r ¶sÿÿzServerProxy.__repr__cCs t|j|ƒSr)rüÚ_ServerProxy__requestrÏr r r rмszServerProxy.__getattr__cCs.|dkr|jS|dkr|jStd|fƒ‚dS)z|A workaround to get special attributes on the ServerProxy without interfering with the magic __getattr__ rlr;zAttribute %r not foundN)Ú_ServerProxy__closer7rk)rÚattrr r r rÓÃs zServerProxy.__call__cCs|Srr rr r r Ú __enter__ÍszServerProxy.__enter__cGs | ¡dSr)r>rÑr r r Ú__exit__ÐszServerProxy.__exit__)NNFFFF) rrrrrr>r=r rÐrÓr@rAr r r r r3ms ÿþ  r3Ú__main__zhttp://localhost:8000ZERRORé )FF)NNNF)FF)ró)VrrXÚsysr3rÚdecimalrZ http.clientrZ urllib.parserZ xml.parsersrr rúrríÚ ImportErrorr Ú version_infor*r…r†Z PARSE_ERRORZ SERVER_ERRORZAPPLICATION_ERRORZ SYSTEM_ERRORZTRANSPORT_ERRORZNOT_WELLFORMED_ERRORZUNSUPPORTED_ENCODINGZINVALID_ENCODING_CHARZINVALID_XMLRPCZMETHOD_NOT_FOUNDZINVALID_METHOD_PARAMSZINTERNAL_ERRORrrrr"r#r–rµZBooleanZ_day0r*r-r6r7rRrSrTr^r”r_rmršrËrÕrÚräràrárârxréròrørïrrùrürr+r3ZServerrrÝr(Z currentTimeZgetCurrentTimervZmultiZgetDataÚpowÚaddrûr r r r ÚYs®*           K #!(C %  'ÿ K  f+h