1 from xml.dom import minidom
2 from xml.sax import handler, make_parser, saxutils
5 import urllib, urllib2, sys, re
10 paramRegex = re.compile('\%27')
13 def __init__(self, service, method, params=[]):
14 self.service = service
19 params = self.buildPOSTParams()
20 request = urllib2.Request(self.buildURL(), data=params)
23 response =urllib2.urlopen(request)
24 except urllib2.HTTPError, e:
26 sys.stderr.write('HTTPError: code=%d : %s' % (e.code, str(e)))
29 return self.handleResponse(response)
31 def buildPOSTParams(self):
33 params = urllib.urlencode({
34 'service': self.service,
35 'method': self.method,
36 'format': self.getFormat(),
37 'input_format': self.getInputFormat()
41 # XXX for some reason, the gateway does not like escaped single-quotes ?
42 param = paramRegex.sub("'", urllib.quote(self.encodeParam(p)))
43 params += '¶m=%s' % urllib.quote(self.encodeParam(param))
47 def setDefaultHost(host):
50 setDefaultHost = staticmethod(setDefaultHost)
53 return 'http://%s/gateway' % defaultHost
56 class XMLGatewayRequest(GatewayRequest):
58 def __init__(self, service, method, *params):
59 GatewayRequest.__init__(self, service, method, list(params))
64 def getInputFormat(self):
65 return self.getFormat()
67 def handleResponse(self, response):
68 handler = XMLGatewayParser()
69 parser = make_parser()
70 parser.setContentHandler(handler)
71 parser.parse(response)
72 return handler.getResult()
74 def encodeParam(self, param):
75 return osrfObjectToXML(param);
77 class XMLGatewayParser(handler.ContentHandler):
87 def __getAttr(self, attrs, name):
88 for (k, v) in attrs.items():
93 def startElement(self, name, attrs):
95 # XXX add support for serializable objects!
98 self.appendChild(None)
101 if name == 'element': # this is an object item wrapper
102 self.keyStack.append(self.__getAttr(attrs, 'key'))
105 hint = self.__getAttr(attrs, 'class_hint')
107 obj = osrfNetworkObject.newFromHint(hint)
111 self.appendChild(obj)
112 self.objStack.append(obj)
117 self.appendChild(obj)
118 self.objStack.append(obj)
121 if name == 'boolean':
122 self.appendChild((self.__getAttr(attrs, 'value') == 'true'))
126 def appendChild(self, child):
128 if self.result == None:
131 if not self.objStack: return;
133 parent = self.objStack[len(self.objStack)-1]
135 if( isinstance(parent, list) ):
138 parent[self.keyStack.pop()] = child
140 def endElement(self, name):
141 if name == 'array' or name == 'object':
144 def characters(self, chars):
145 #self.appendChild(''.join(chars[start:leng+start]))
146 self.appendChild(urllib.unquote_plus(chars))