ó ‡1ÕUc@s£dZddlZddlZddlmZddlmZddlmZ ddlm Z ddl Z ddl Z ddlZddlZddlmZddlmZdadZyddlaWnEek ryddlZWqek r ed d ƒ‚qXnXe je jZd efd „ƒYZd d„Zd„Zdefd„ƒYZdefd„ƒYZ defd„ƒYZ!defd„ƒYZ"de efd„ƒYZde efd„ƒYZddl#m$Z$m%Z%ddl&m&Z&e'Z(y ddl&m)Z)m*Z*e+Z(Wnek r6nXe(r…de%fd „ƒYZ,d!e$fd"„ƒYZ-d#e efd$„ƒYZ.nd%e fd&„ƒYZd'e fd(„ƒYZ d)efd*„ƒYZ/d+efd,„ƒYZ0d-efd.„ƒYZ1d/efd0„ƒYZ2d1efd2„ƒYZ3eZ4d3efd4„ƒYZ5d5d6„Z6d7e7fd8„ƒYZ8gddddddd9„Z9d:„Z:d;„Z;d<„Z<d=„Z=dS(>sç Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ============================ JSONRPC Library (jsonrpclib) ============================ This library is a JSON-RPC v.2 (proposed) implementation which follows the xmlrpclib API for portability between clients. It uses the same Server / ServerProxy, loads, dumps, etc. syntax, while providing features not present in XML-RPC like: * Keyword arguments * Notifications * Versioning * Batches and batch notifications Eventually, I'll add a SimpleXMLRPCServer compatible library, and other things to tie the thing off nicely. :) For a quick-start, just open a console and type the following, replacing the server address, method, and parameters appropriately. >>> import jsonrpclib >>> server = jsonrpclib.Server('http://localhost:8181') >>> server.add(5, 6) 11 >>> server._notify.add(5, 6) >>> batch = jsonrpclib.MultiCall(server) >>> batch.add(3, 50) >>> batch.add(2, 3) >>> batch._notify.add(3, 5) >>> batch() [53, 5] See http://code.google.com/p/jsonrpclib/ for more info. iÿÿÿÿN(t Transport(t SafeTransport(t ServerProxy(t_Method(tconfig(thistorys&You must have the cjson or simplejson smodule(s) available.tUnixSocketMissingcBseZdZRS(s„ Just a properly named Exception if Unix Sockets usage is attempted on a platform that doesn't support them (Windows) (t__name__t __module__t__doc__(((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyRSssutf-8cCs*trtj|ƒStj|d|ƒSdS(Ntencoding(tcjsontencodetjsontdumps(tobjR ((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pytjdumps\s cCs$trtj|ƒStj|ƒSdS(N(R tdecodeR tloads(t json_string((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pytjloadsds t ProtocolErrorcBseZRS((RR(((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyRnstTransportMixIncBs/eZdZejZdZd„Zd„ZRS(s4 Just extends the XMLRPC transport where necessary. cCsP|jddƒ|jdtt|ƒƒƒ|jƒ|rL|j|ƒndS(Ns Content-Typesapplication/json-rpcsContent-Length(t putheadertstrtlent endheaderstsend(tselft connectiont request_body((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyt send_contentws  cCstƒ}t|ƒ|fS(N(t JSONTargett JSONParser(Rttarget((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyt getparser~s N( RRR Rt user_agenttNonet _connectionRR#(((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyRqs   R!cBs#eZd„Zd„Zd„ZRS(cCs ||_dS(N(R"(RR"((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyt__init__ƒscCs|jj|ƒdS(N(R"tfeed(Rtdata((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR(†scCsdS(N((R((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pytclose‰s(RRR'R(R*(((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR!‚s  R cBs#eZd„Zd„Zd„ZRS(cCs g|_dS(N(R)(R((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR'scCs|jj|ƒdS(N(R)tappend(RR)((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR(scCsdj|jƒS(Nt(tjoinR)(R((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR*“s(RRR'R(R*(((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR Œs  RcBseZRS((RR(((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR–sRcBseZRS((RR(((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR™s(tHTTPtHTTPConnection(tsocket(tAF_UNIXt SOCK_STREAMtUnixHTTPConnectioncBseZd„ZRS(cCs)tttƒ|_|jj|jƒdS(N(R0R1R2tsocktconnectthost(R((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR5©s(RRR5(((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR3¨stUnixHTTPcBseZeZRS((RRR3t_connection_class(((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR7­st UnixTransportcBseZd„ZRS(cCs.ddl}|j|ƒ\}}}t|ƒS(Niÿÿÿÿ(thttplibt get_host_infoR7(RR6R:t extra_headerstx509((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pytmake_connection±s (RRR>(((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR9°sRcBs_eZdZddddd„Zdd„Zdd„Zdd„Zd„Ze d„ƒZ RS( sq Unfortunately, much more of this class has to be copied since so much of it does the serialization. icCs(ddl}|stj}n||_|j|ƒ\}}|dkrWtdƒ‚n|dkrtsxtdƒ‚n||_d|_ n4|j |ƒ\|_|_ |j sÁ|j dkn|dkr |dkråt ƒ}q |dkrýt ƒ}q tƒ}n||_||_||_dS( NiÿÿÿÿthttpthttpstunixsUnsupported JSON-RPC protocol.sUnix sockets not available.t/(R?R@sunix(turllibRtversiont_ServerProxy__versiont splittypetIOErrortUSE_UNIX_SOCKETSRt_ServerProxy__hostt_ServerProxy__handlert splithostR%R9RRt_ServerProxy__transportt_ServerProxy__encodingt_ServerProxy__verbose(Rturit transportR tverboseRDRCtschema((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR'½s0                c CsHt||d|jd|d|jƒ}|j|ƒ}t|ƒ|dS(NR trpcidRDtresult(RRMREt _run_requesttcheck_for_errors(Rt methodnametparamsRStrequesttresponse((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyt_requestÝs  c CsPt||d|jd|d|jdtƒ}|j|dtƒ}t|ƒdS(NR RSRDtnotify(RRMREtTrueRURV(RRWRXRSRYRZ((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyt_request_notifyäs  cCs[tj|ƒ|jj|j|j|d|jƒ}tj|ƒ|sKdSt |ƒ}|S(NRQ( Rt add_requestRLRYRIRJRNt add_responseR%R(RRYR\RZt return_obj((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyRUës    cCst|j|ƒS(N(RR[(Rtname((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyt __getattr__scCs t|jƒS(N(t_NotifyR^(R((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyt_notifysN( RRR R%R'R[R^RURctpropertyRe(((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR·s    RcBseZd„Zd„ZRS(cOsst|ƒdkr7t|ƒdkr7tddƒ‚nt|ƒdkr\|j|j|ƒS|j|j|ƒSdS(NisCannot use both positional s3and keyword arguments (according to JSON-RPC spec.)(RRt _Method__sendt _Method__name(Rtargstkwargs((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyt__call__ s $ cCsd|j|f|_|S(Ns%s.%s(Rh(RRb((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyRcs(RRRkRc(((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR s RdcBseZd„Zd„ZRS(cCs ||_dS(N(R[(RRY((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR'scCst|j|ƒS(N(RR[(RRb((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyRc!s(RRR'Rc(((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyRds tMultiCallMethodcBs>eZed„Zd„Zddd„Zd„Zd„ZRS(cCs||_g|_||_dS(N(tmethodRXR\(RRmR\((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR'(s  cOsbt|ƒdkr7t|ƒdkr7tddƒ‚nt|ƒdkrU||_n ||_dS(NisJSON-RPC does not support both s!positional and keyword arguments.(RRRX(RRiRj((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyRk-s $  c Cs.t|j|jddd|d|d|jƒS(NRDg@R RSR\(RRXRmR\(RR RS((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyRY6scCsd|jƒS(Ns%s(RY(R((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyt__repr__:scCs d|j|f}||_|S(Ns%s.%s(Rm(RRmt new_method((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyRc=s N( RRtFalseR'RkR%RYRnRc(((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyRl&s    tMultiCallNotifycBseZd„Zd„ZRS(cCs ||_dS(N(t multicall(RRr((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR'DscCs)t|dtƒ}|jjj|ƒ|S(NR\(RlR]Rrt _job_listR+(RRbtnew_job((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyRcGs(RRR'Rc(((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyRqBs tMultiCallIteratorcBs,eZd„Zd„Zd„Zd„ZRS(cCs ||_dS(N(tresults(RRv((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR'Nsccs6x)tdt|jƒƒD]}||VqWt‚dS(Ni(trangeRRvt StopIteration(Rti((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyt__iter__Qs cCs|j|}t|ƒ|dS(NRT(RvRV(RRytitem((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyt __getitem__Vs  cCs t|jƒS(N(RRv(R((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyt__len__[s(RRR'RzR|R}(((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyRuLs   t MultiCallcBs8eZd„Zd„Zed„ƒZd„ZeZRS(cCs||_g|_dS(N(t_serverRs(Rtserver((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR'`s cCszt|jƒdkrdSddjg|jD]}|jƒ^q,ƒ}|jj|ƒ}|j2|spg}nt|ƒS(Nis[ %s ]t,(RRsR-RYRRURu(RtjobRt responses((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR[ds # cCs t|ƒS(N(Rq(R((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyRepscCs t|ƒ}|jj|ƒ|S(N(RlRsR+(RRbRt((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyRcts (RRR'R[RfReRcRk(((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR~^s    tFaultcBs;eZdddd„Zd„Zddd„Zd„ZRS(iƒÿÿs Server errorcCs||_||_||_dS(N(t faultCodet faultStringRS(RtcodetmessageRS((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR's  cCsi|jd6|jd6S(NR‡Rˆ(R…R†(R((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyterror†scCsC|stj}n|r$||_nt|dtd|jd|ƒS(NtmethodresponseRSRD(RRDRSRR](RRSRD((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyRZ‰s   cCsd|j|jfS(Ns(R…R†(R((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyRn’sN(RRR%R'R‰RZRn(((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR„s  icCs4d}x't|ƒD]}|tjtƒ7}qW|S(NR,(RwtrandomtchoicetIDCHARS(tlengtht return_idRy((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyt random_id•stPayloadcBsJeZddd„Zgd„Zgd„Zdd„Zddd„ZRS(cCs.|stj}n||_t|ƒ|_dS(N(RRDtidtfloat(RRSRD((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyR'œs  cCst|ƒtjkr$tdƒ‚n|js<tƒ|_ni|jd6|d6}|rf||dR R–tsyst xmlrpclibRt XMLTransportRtXMLSafeTransportRtXMLServerProxyRt XML_MethodttimetstringR‹R RRR%R R t ImportErrort simplejsontascii_lowercasetdigitsRt ExceptionRRRRtobjectRR!R R:R.R/R0RpRHR1R2R]R3R7R9RdRlRqRuR~tServerR„RtdictR‘RRRVR§R¨(((s8/usr/lib/python2.7/vendor-packages/jsonrpclib/jsonrpc.pyt/s|              T   , *