1 from xml.dom import minidom
2 from xml.sax import handler, make_parser, saxutils
5 import urllib, urllib2, sys
10 def __init__(self, service, method, params=[]):
11 self.service = service
16 params = self.buildPOSTParams()
17 request = urllib2.Request(self.buildURL(), data=params)
20 response =urllib2.urlopen(request)
21 except urllib2.HTTPError, e:
23 sys.stderr.write('HTTPError: code=%d : %s' % (e.code, str(e)))
26 return self.handleResponse(response)
28 def buildPOSTParams(self):
30 params = urllib.urlencode({
31 'service': self.service,
32 'method': self.method,
33 'format': self.getFormat()
37 param = {'param': osrfObjectToJSON(p)}
38 params += '&%s' % urllib.urlencode(param)
42 def setDefaultHost(host):
45 setDefaultHost = staticmethod(setDefaultHost)
48 return 'http://%s/gateway' % defaultHost
51 class XMLGatewayRequest(GatewayRequest):
53 def __init__(self, service, method, *params):
54 GatewayRequest.__init__(self, service, method, list(params))
59 def handleResponse(self, response):
60 handler = XMLGatewayParser()
61 parser = make_parser()
62 parser.setContentHandler(handler)
63 parser.parse(response)
64 return handler.getResult()
66 class XMLGatewayParser(handler.ContentHandler):
76 def __getAttr(self, attrs, name):
77 for (k, v) in attrs.items():
82 def startElement(self, name, attrs):
84 # XXX add support for serializable objects!
86 if name == 'element': # this is an object item wrapper
87 self.keyStack.append(self.__getAttr(attrs, 'key'))
93 self.objStack.append(obj)
99 self.objStack.append(obj)
103 self.appendChild(None)
106 if name == 'boolean':
107 self.appendChild((self.__getAttr(attrs, 'value') == 'true'))
111 def appendChild(self, child):
113 if self.result == None:
116 if not self.objStack: return;
118 parent = self.objStack[len(self.objStack)-1]
120 if( isinstance(parent, list) ):
123 parent[self.keyStack.pop()] = child
125 def endElement(self, name):
126 if name == 'array' or name == 'object':
129 def characters(self, chars):
130 #self.appendChild(''.join(chars[start:leng+start]))
131 self.appendChild(urllib.unquote_plus(chars))