1 from xml.dom import minidom
2 from xml.sax import handler, make_parser, saxutils
5 import urllib, urllib2, sys, re
8 paramRegex = re.compile('\%27')
11 def __init__(self, service, method, params=[]):
12 self.service = service
17 params = self.buildPOSTParams()
18 request = urllib2.Request(self.buildURL(), data=params)
21 response =urllib2.urlopen(request)
22 except urllib2.HTTPError, e:
24 sys.stderr.write('HTTPError: code=%d : %s' % (e.code, str(e)))
27 return self.handleResponse(response)
29 def buildPOSTParams(self):
31 params = urllib.urlencode({
32 'service': self.service,
33 'method': self.method,
34 'format': self.getFormat(),
35 'input_format': self.getInputFormat()
39 # XXX for some reason, the gateway does not like escaped single-quotes ?
40 param = paramRegex.sub("'", urllib.quote(self.encodeParam(p)))
41 params += '¶m=%s' % urllib.quote(self.encodeParam(param))
45 def setDefaultHost(host):
48 setDefaultHost = staticmethod(setDefaultHost)
51 return 'http://%s/gateway' % defaultHost
54 class XMLGatewayRequest(GatewayRequest):
56 def __init__(self, service, method, *params):
57 GatewayRequest.__init__(self, service, method, list(params))
62 def getInputFormat(self):
63 return self.getFormat()
65 def handleResponse(self, response):
66 handler = XMLGatewayParser()
67 parser = make_parser()
68 parser.setContentHandler(handler)
69 parser.parse(response)
70 return handler.getResult()
72 def encodeParam(self, param):
73 return osrfObjectToXML(param);
75 class XMLGatewayParser(handler.ContentHandler):
85 def __getAttr(self, attrs, name):
86 for (k, v) in attrs.items():
91 def startElement(self, name, attrs):
93 # XXX add support for serializable objects!
96 self.appendChild(None)
99 if name == 'element': # this is an object item wrapper
100 self.keyStack.append(self.__getAttr(attrs, 'key'))
103 hint = self.__getAttr(attrs, 'class_hint')
105 obj = osrfNetworkObject.newFromHint(hint)
109 self.appendChild(obj)
110 self.objStack.append(obj)
115 self.appendChild(obj)
116 self.objStack.append(obj)
119 if name == 'boolean':
120 self.appendChild((self.__getAttr(attrs, 'value') == 'true'))
124 def appendChild(self, child):
126 if self.result == None:
129 if not self.objStack: return;
131 parent = self.objStack[len(self.objStack)-1]
133 if( isinstance(parent, list) ):
136 parent[self.keyStack.pop()] = child
138 def endElement(self, name):
139 if name == 'array' or name == 'object':
142 def characters(self, chars):
143 #self.appendChild(''.join(chars[start:leng+start]))
144 self.appendChild(urllib.unquote_plus(chars))