def _send_multipart_request(self, operation, params, files): """ Send multipart HTTP-request to the server using http_poster. Request can contain file attachments. Return decoded response data and a HTTPResponse object. """ params['operation'] = operation param_list = [] # convert all params keys and values to utf-8, # post_multipart expects a list of tuples for key in params.keys(): params[key] = csetconv.to_utf8(params[key]) headers = self._get_default_headers() # error handling is missing here try: data, response = http_poster.post_multipart(self.host, self.script, params, files, headers) if response.status == 200: data = self._decode_content(data, response) else: reason = csetconv.to_unicode(response.reason) data = {"status" : "error:server", "message" : u"Server responded: %s %s" % ( response.status, reason)} except socket.gaierror, error: message = u"Server not found. '%s'" % csetconv.to_unicode(error[1]) data = {"status" : "error:communication:gaierror", "message" : message} response = None
def _send_request(self, operation, params, filename = None): """ Send HTTP POST request to the server using httplib, return decoded data and a HTTPResponse object. """ params['operation'] = operation # convert all params-values to utf-8, keys should be ASCII for key in params.keys(): params[key] = csetconv.to_utf8(params[key]) params = urllib.urlencode(params) headers = self._get_default_headers() headers["Content-Type"] = "application/x-www-form-urlencoded" # Send session id in headers as a cookie if self.sessionid != None: headers["Cookie"] = "sessionid=%s;" % self.sessionid conn = httplib.HTTPConnection(self.host) # This is nested because Python 2.2 doesn't support try/except/finally try: try: conn.request("POST", self.script, params, headers) response = conn.getresponse() reason = csetconv.to_unicode(response.reason) if response.status == 200: data = response.read() # Decode content if it's type was "application/json" if response.getheader("content-type") == "application/json": data = self._decode_content(data, response) elif filename is not None: datafile = open(filename, "wb") datafile.write(data) datafile.close() else: data = {"status" : "error:server", "message" : u"Server responded: %s %s" % ( response.status, reason)} except socket.gaierror, error: message = u"Server not found. '%s'" % csetconv.to_unicode(error[1]) data = {"status" : "error:communication:gaierror", "message" : message} response = None except socket.error, error: message = u"Service not available. '%s'" % csetconv.to_unicode(error[1]) data = {"status" : "error:communication:error", "message" : message} response = None
def parse_json_response(json_data, response): """Decode JSON response and return the data in a dictionary.""" try: data = simplejson.loads(json_data) except ValueError, error: # Server gave a valid HTTP response, but it is not JSON message = csetconv.to_unicode(str(error)) if len(message) > 50: message = u"%s[...]" % message[:50] data = {"status" : "error:decode:json", "message" : message}
def _decode_content(self, data, response): """" Pass data first to decompression function, then to JSON decoder. Return content in decoded format. """ try: data = self._decompress_content(data, response) data = parse_json_response(data, response) except zlib.error, error: message = csetconv.to_unicode(str(error)) data = {"status" : "error:decode:zlib", "message" : message}
else: data = {"status" : "error:server", "message" : u"Server responded: %s %s" % ( response.status, reason)} except socket.gaierror, error: message = u"Server not found. '%s'" % csetconv.to_unicode(error[1]) data = {"status" : "error:communication:gaierror", "message" : message} response = None except socket.error, error: message = u"Service not available. '%s'" % csetconv.to_unicode(error[1]) data = {"status" : "error:communication:error", "message" : message} response = None except RuntimeError, error: message = u"Network not available. '%s'" % csetconv.to_unicode(str(error)) data = {"status" : "error:communication:network", "message" : message} response = None # These are raised if server is connected but it does return # a single byte (e.g in Segmentation fault -case) except httplib.BadStatusLine: # Python 2.5 message = u"Service not available. (BadStatusLine)" data = {"status" : "error:server", "message" : message} response = None except AssertionError, error: # Python 2.2 (pys60) message = u"Service not available. (Empty response)" data = {"status" : "error:server", "message" : message} response = None