hessian的python客户端.docx
- 文档编号:5724524
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:4
- 大小:17.54KB
hessian的python客户端.docx
《hessian的python客户端.docx》由会员分享,可在线阅读,更多相关《hessian的python客户端.docx(4页珍藏版)》请在冰豆网上搜索。
hessian的python客户端
hessian的python客户端
hessian的python客户端
博客分类:
python
今天简单看了一下hessian的客户端,全部代码就480行,非常简单啊,完全可以模仿此代码写各种http客户端。
最核心的代码:
Python代码request=HessianWriter().write_call(method,params)importhttplibh=httplib.HTTP(self._host)h.putrequest("POST",self._uri)#requiredbyHTTP/1.1h.putheader("Host",self._host)h.putheader("User-Agent","hessianlib.py/%s"%__version__)h.putheader("Content-Length",str(len(request)))h.endheaders()h.send(request)errcode,errmsg,headers=h.getreply()iferrcode!
=200:
raiseProtocolError(self._url,errcode,errmsg,headers)returnself.parse_response(h.getfile())
全部:
Python代码##AHessianclientinterfaceforPython.Thedateandlongtypesrequire#Python2.2orlater.##TheHessianproxyisusedasfollows:
##proxy=Hessian("##printproxy.hello()##--------------------------------------------------------------------##TheApacheSoftwareLicense,Version1.1##Copyright(c)2001-2002CauchoTechnology,Inc.Allrightsreserved.##Redistributionanduseinsourceandbinaryforms,withorwithout#modification,arepermittedprovidedthatthefollowingconditions#aremet:
##1.Redistributionsofsourcecodemustretaintheabovecopyright#notice,thislistofconditionsandthefollowingdisclaimer.##2.Redistributionsinbinaryformmustreproducetheabovecopyright#notice,thislistofconditionsandthefollowingdisclaimerin#thedocumentationand/orothermaterialsprovidedwiththe#distribution.##3.Theend-userdocumentationincludedwiththeredistribution,if#any,mustincludethefollowingacknowlegement:
#"Thisproductincludessoftwaredevelopedbythe#CauchoTechnology(#Alternately,thisacknowlegementmayappearinthesoftwareitself,#ifandwhereversuchthird-partyacknowlegementsnormallyappear.##4.Thenames"Hessian","Resin",and"Caucho"mustnotbeusedto#endorseorpromoteproductsderivedfromthissoftwarewithoutprior#writtenpermission.Forwrittenpermission,pleasecontact#info@.##5.Productsderivedfromthissoftwaremaynotbecalled"Resin"#normay"Resin"appearintheirnameswithoutpriorwritten#permissionofCauchoTechnology.##THISSOFTWAREISPROVIDED``ASIS''ANDANYEXPRESSEDORIMPLIED#WARRANTIES,INCLUDING,BUTNOTLIMITEDTO,THEIMPLIEDWARRANTIES#OFMERCHANTABILITYANDFITNESSFORAPARTICULARPURPOSEARE#DISCLAIMED.INNOEVENTSHALLCAUCHOTECHNOLOGYORITSCONTRIBUTORS#BELIABLEFORANYDIRECT,INDIRECT,INCIDENTAL,SPECIAL,EXEMPLARY,#ORCONSEQUENTIALDAMAGES(INCLUDING,BUTNOTLIMITEDTO,PROCUREMENT#OFSUBSTITUTEGOODSORSERVICES;LOSSOFUSE,DATA,ORPROFITS;OR#BUSINESSINTERRUPTION)HOWEVERCAUSEDANDONANYTHEORYOFLIABILITY,#WHETHERINCONTRACT,STRICTLIABILITY,ORTORT(INCLUDINGNEGLIGENCE#OROTHERWISE)ARISINGINANYWAYOUTOFTHEUSEOFTHISSOFTWARE,EVEN#IFADVISEDOFTHEPOSSIBILITYOFSUCHDAMAGE.#--------------------------------------------------------------------##Credits:
hessianlib.pywasinspiredandpartiallybasedon#xmlrpclib.pycreatedbyFredrikLundhatwww.pythonware.org#importstring,timeimporturllibfromtypesimport*fromstructimportunpackfromstructimportpack__version__="0.1"#--------------------------------------------------------------------#ExceptionsclassError:
#baseclassforclienterrorspassclassProtocolError(Error):
#RepresentsanHTTPprotocolerrordef__init__(self,url,code,message,headers):
self.url=urlself.code=codeself.message=messageself.headers=headersdef__repr__(self):
return("<ProtocolErrorfor%s:
%s%s>"%(self.url,self.code,self.message))classFault(Error):
#RepresentsafaultfromHessiandef__init__(self,code,message,**detail):
self.code=codeself.message=messagedef__repr__(self):
return"<HessianFault%s:
%s>"%(self.code,self.message)#--------------------------------------------------------------------#WrappersforHessiandatatypesnon-standardinPython###Boolean--usetheTrueorFalseconstants#classBoolean:
def__init__(self,value=0):
self.value=(value!
=0)def_hessian_write(self,out):
ifself.value:
out.write('T')else:
out.write('F')def__repr__(self):
ifself.value:
return"<Trueat%x>"%id(self)else:
return"<Falseat%x>"%id(self)def__int__(self):
returnself.valuedef__nonzero__(self):
returnself.valueTrue,False=Boolean
(1),Boolean(0)##Date-wrapsatimevalueinseconds#classDate:
def__init__(self,value=0):
self.value=valuedef__repr__(self):
return("<Date%sat%x>"%(time.asctime(time.localtime(self.value)),id(self)))def_hessian_write(self,out):
out.write("d")out.write(pack(">q",self.value*1000.0))##Binary-binarydata#classBinary:
def__init__(self,data=None):
self.data=datadef_hessian_write(self,out):
out.write('B')out.write(pack('>H',len(self.data)))out.write(self.data)#--------------------------------------------------------------------#Marshallingandunmarshallingcode##HessianWriter-writesHessiandatafromPythonobjects#classHessianWriter:
dispatch={}defwrite_call(self,method,params):
self.refs={}self.ref=0self.__out=[]self.write=write=self.__out.appendwrite("c\x01\x00m");write(pack(">H",len(method)));write(method);forvinparams:
self.write_object(v)write("z");result=string.join(self.__out,"")delself.__out,self.write,self.refsreturnresultdefwrite_object(self,value):
try:
f=self.dispatch[type(value)]exceptKeyError:
raiseTypeError,"cannotwrite%sobjects"%type(value)else:
f(self,value)defwrite_int(self,value):
self.write('I')self.write(pack(">l",value))dispatch[IntType]=write_intdefwrite_long(self,value):
self.write('L')self.write(pack(">q",value))dispatch[LongType]=write_longdefwrite_double(self,value):
self.write('D')self.write(pack(">d",value))dispatch[FloatType]=write_doubledefwrite_string(self,value):
self.write('S')self.write(pack('>H',len(value)))self.write(value)dispatch[StringType]=write_stringdefwrite_reference(self,value):
#checkforandwritecircularreferences#returns1iftheobjectshouldbewritten,i.e.notareferencei=id(value)ifself.refs.has_key(i):
self.write('R')self.write(pack(">L",self.refs[i]))return0else:
self.refs[i]=self.refself.ref=self.ref+1return1defwrite_list(self,value):
ifself.write_reference(value):
self.write("Vt\x00\x00I");self.write(pack('>l',len(value)))forvinvalue:
self.__write(v)self.write('z')dispatch[TupleType]=write_listdispatch[ListType]=write_listdefwrite_map(self,value):
ifself.write_reference(value):
self.write("Mt\x00\x00")fork,vinvalue.items():
self.__write(k)self.__write(v)self.write("z")dispatch[DictType]=write_mapdefwrite_instance(self,value):
#checkforspecialwrappersifhasattr(value,"_hessian_write"):
value._hessian_write(self)else:
fields=value.__dict__ifself.write_reference(fields):
self.write("Mt\x00\x00")fork,vinfields.items():
self.__write(k)self.__write(v)self.write("z")dispatch[InstanceType]=write_instance##Parsestheresultsfromtheserver#classHessianParser:
def__init__(self,f):
self._f=fself._peek=-1#self.read=f.readself._refs=[]defread(self,len):
ifself._peek>=0:
value=self._peekself._peek=-1returnvalueelse:
returnself._f.read(len)defparse_reply(self):
#parseheader'c'x01x00'v'...'z'read=self.readifread
(1)!
='r':
self.error()major=read
(1)minor=read
(1)value=self.parse_object()ifread
(1)=='z':
returnvalueself.error()#actuallyafaultdefparse_object(self):
#parseanarbitraryobjectbasedonthetypeinthedatareturnself.parse_object_code(self.read
(1))defparse_object_code(self,code):
#parseanobjectwhenthecodeisknownread=self.readifcode=='N':
returnNoneelifcode=='T':
returnTrueelifcode=='F':
returnFalseelifcode=='I':
returnunpack('>l',read(4))[0]elifcode=='L':
returnunpack('>q',read(8))[0]elifcode=='D':
returnunpack('>d',read(8))[0]elifcode=='d':
ms=unpack('>q',read(8))[0]returnDate(int(ms/1000.0))elifcode=='S'orcode=='X':
returnself.parse_string()elifcode=='B':
returnBinary(self.parse_string())elifcode=='V':
self.parse_type()#skiptypeself.parse_length()#skiplengthlist=[]self._refs.append(list)ch=read
(1)whilech!
='z':
list.append(self.parse_object_code(ch))ch=read
(1)returnlistelifcode=='M':
self.parse_type()#skiptypemap={}self._refs.append(map)ch=read
(1)whilech!
='z':
key=self.parse_object_code(ch)value=self.parse_object()map[key]=valuech=read
(1)returnmapelifcode=='R':
returnself._refs[unpack('>l',read(4))[0]]elifcode=='r':
self.parse_type()#skiptypeurl=self.parse_type()#readstheurlreturnHessian(url)else:
raise"UnknownObjectCode%d"%codedefparse_string(self):
f=self._flen=unpack('>H',f.read
(2))[0]returnf.read(len)defparse_type(self):
f=self._fcode=self.read
(1)ifcode!
='t':
self._peek=codereturn""len=unpack('>H',f.read
(2))[0]returnf.read(len)defparse_length(self):
f=self._fcode=self.read
(1);ifcode!
='l':
self._peek=codereturn-1;len=unpack('>l',f.read(4))returnlendeferror(self):
raise"FOO"##Encapsulatesthemethodtobecalled#class_Method:
def__init__(self,invoker,method):
self._invoker=invokerself._method=methoddef__call__(self,*args):
returnself._invoker(self._method,args)#--------------------------------------------------------------------#Hessianisthemainclass.AHessianproxyiscreatedwiththeURL#andthencalledjustasforalocalmethod##proxy=Hessian("http:
//www.caucho.c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- hessian python 客户端
![提示](https://static.bdocx.com/images/bang_tan.gif)