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 params += '¶m=%s' % urllib.quote(self.encodeParam(p), "'/")
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 getInputFormat(self):
60 return self.getFormat()
62 def handleResponse(self, response):
63 handler = XMLGatewayParser()
64 parser = make_parser()
65 parser.setContentHandler(handler)
66 parser.parse(response)
67 return handler.getResult()
69 def encodeParam(self, param):
70 return osrfObjectToXML(param);
72 class XMLGatewayParser(handler.ContentHandler):
78 self.posStack = [] # for tracking array-based hinted object indices
83 def __getAttr(self, attrs, name):
84 for (k, v) in attrs.items():
89 def startElement(self, name, attrs):
91 # XXX add support for serializable objects!
94 self.appendChild(None)
97 if name == 'element': # this is an object item wrapper
98 self.keyStack.append(self.__getAttr(attrs, 'key'))
101 hint = self.__getAttr(attrs, 'class_hint')
103 obj = osrfNewObjectFromHint(hint)
104 self.appendChild(obj)
105 self.objStack.append(obj)
107 self.posStack.append(0)
112 self.appendChild(obj)
113 self.objStack.append(obj)
118 self.appendChild(obj)
119 self.objStack.append(obj)
122 if name == 'boolean':
123 self.appendChild((self.__getAttr(attrs, 'value') == 'true'))
127 def appendChild(self, child):
129 if self.result == None:
132 if not self.objStack: return;
134 parent = self.objStack[len(self.objStack)-1]
136 if isinstance(parent, list):
139 if isinstance(parent, dict):
140 parent[self.keyStack.pop()] = child
142 if isinstance(parent, osrfNetworkObject):
144 if parent.getRegistry().wireProtocol == 'array':
145 keys = parent.getRegistry().keys
146 i = self.posStack.pop()
149 self.posStack.append(i+1)
151 key = self.keyStack.pop()
153 parent.setField(key, child)
155 def endElement(self, name):
156 if name == 'array' or name == 'object':
159 def characters(self, chars):
160 self.appendChild(urllib.unquote_plus(chars))