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('%s => %s?%s\n' % (str(e), self.buildURL(), params))
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
80 # true if we are parsing an element that may have character data
86 def __getAttr(self, attrs, name):
87 for (k, v) in attrs.items():
92 def startElement(self, name, attrs):
95 # we just read a 'string' or 'number' element that resulted
96 # in no text data. Appaned a None object
97 self.appendChild(None)
100 self.appendChild(None)
103 if name == 'string' or name == 'number':
104 self.charsPending = True
107 if name == 'element': # this is an object item wrapper
108 self.keyStack.append(self.__getAttr(attrs, 'key'))
111 hint = self.__getAttr(attrs, 'class_hint')
113 obj = osrfNewObjectFromHint(hint)
114 self.appendChild(obj)
115 self.objStack.append(obj)
117 self.posStack.append(0)
122 self.appendChild(obj)
123 self.objStack.append(obj)
128 self.appendChild(obj)
129 self.objStack.append(obj)
132 if name == 'boolean':
133 self.appendChild((self.__getAttr(attrs, 'value') == 'true'))
137 def appendChild(self, child):
139 if self.result == None:
142 if not self.objStack: return;
144 parent = self.objStack[len(self.objStack)-1]
146 if isinstance(parent, list):
149 if isinstance(parent, dict):
150 parent[self.keyStack.pop()] = child
152 if isinstance(parent, osrfNetworkObject):
154 if parent.getRegistry().wireProtocol == 'array':
155 keys = parent.getRegistry().keys
156 i = self.posStack.pop()
159 self.posStack.append(i+1)
161 key = self.keyStack.pop()
163 parent.setField(key, child)
165 def endElement(self, name):
166 if name == 'array' or name == 'object':
169 def characters(self, chars):
170 self.charsPending = False
171 self.appendChild(urllib.unquote_plus(chars))