def response(self, response): # Send the xml-rpc response back log_debug(3, type(response)) needs_xmlrpc_encoding = not rhnFlags.test("XMLRPC-Encoded-Response") compress_response = rhnFlags.test("compress_response") # Init an output object; we'll use it for sending data in various # formats if isinstance(response, transports.File): if not hasattr(response.file_obj, 'fileno') and compress_response: # This is a StringIO that has to be compressed, so read it in # memory; mark that we don't have to do any xmlrpc encoding response = response.file_obj.read() needs_xmlrpc_encoding = 0 else: # Just treat is as a file return self.response_file(response) output = transports.Output() # First, use the same encoding/transfer that the client used output.set_transport_flags( transfer=transports.lookupTransfer(self.input.transfer), encoding=transports.lookupEncoding(self.input.encoding)) if isinstance(response, xmlrpclib.Fault): log_debug(4, "Return FAULT", response.faultCode, response.faultString) # No compression for faults because we'd like them to pop # up in clear text on the other side just in case output.set_transport_flags(output.TRANSFER_NONE, output.ENCODE_NONE) elif compress_response: # check if we have to compress this result log_debug(4, "Compression on for client version", self.client) if self.client > 0: output.set_transport_flags(output.TRANSFER_BINARY, output.ENCODE_ZLIB) else: # original clients had the binary transport support broken output.set_transport_flags(output.TRANSFER_BASE64, output.ENCODE_ZLIB) # We simply add the transport options to the output headers output.headers.update(rhnFlags.get('outputTransportOptions').dict()) if needs_xmlrpc_encoding: # Normalize the response response = self.normalize(response) try: response = xmlrpclib.dumps(response, methodresponse=1) except TypeError, e: log_debug( 4, "Error \"%s\" encoding response = %s" % (e, response)) Traceback("apacheHandler.response", self.req, extra="Error \"%s\" encoding response = %s" % (e, response), severity="notification") return apache.HTTP_INTERNAL_SERVER_ERROR except:
def response(self, response): # Send the xml-rpc response back log_debug(3, type(response)) needs_xmlrpc_encoding = not rhnFlags.test("XMLRPC-Encoded-Response") compress_response = rhnFlags.test("compress_response") # Init an output object; we'll use it for sending data in various # formats if isinstance(response, transports.File): if not hasattr(response.file_obj, "fileno") and compress_response: # This is a StringIO that has to be compressed, so read it in # memory; mark that we don't have to do any xmlrpc encoding response = response.file_obj.read() needs_xmlrpc_encoding = 0 else: # Just treat is as a file return self.response_file(response) output = transports.Output() # First, use the same encoding/transfer that the client used output.set_transport_flags( transfer=transports.lookupTransfer(self.input.transfer), encoding=transports.lookupEncoding(self.input.encoding), ) if isinstance(response, xmlrpclib.Fault): log_debug(4, "Return FAULT", response.faultCode, response.faultString) # No compression for faults because we'd like them to pop # up in clear text on the other side just in case output.set_transport_flags(output.TRANSFER_NONE, output.ENCODE_NONE) elif compress_response: # check if we have to compress this result log_debug(4, "Compression on for client version", self.client) if self.client > 0: output.set_transport_flags(output.TRANSFER_BINARY, output.ENCODE_ZLIB) else: # original clients had the binary transport support broken output.set_transport_flags(output.TRANSFER_BASE64, output.ENCODE_ZLIB) # We simply add the transport options to the output headers output.headers.update(rhnFlags.get("outputTransportOptions").dict()) if needs_xmlrpc_encoding: # Normalize the response response = self.normalize(response) try: response = xmlrpclib.dumps(response, methodresponse=1) except TypeError, e: log_debug(4, 'Error "%s" encoding response = %s' % (e, response)) Traceback( "apacheHandler.response", self.req, extra='Error "%s" encoding response = %s' % (e, response), severity="notification", ) return apache.HTTP_INTERNAL_SERVER_ERROR except:
def response(self, response): # Send the xml-rpc response back log_debug(3, type(response)) needs_xmlrpc_encoding = not rhnFlags.test("XMLRPC-Encoded-Response") compress_response = rhnFlags.test("compress_response") # Init an output object; we'll use it for sending data in various # formats if isinstance(response, transports.File): if not hasattr(response.file_obj, 'fileno') and compress_response: # This is a StringIO that has to be compressed, so read it in # memory; mark that we don't have to do any xmlrpc encoding response = response.file_obj.read() needs_xmlrpc_encoding = 0 else: # Just treat is as a file return self.response_file(response) output = transports.Output() # First, use the same encoding/transfer that the client used output.set_transport_flags( transfer=transports.lookupTransfer(self.input.transfer), encoding=transports.lookupEncoding(self.input.encoding)) if isinstance(response, xmlrpclib.Fault): log_debug(4, "Return FAULT", response.faultCode, response.faultString) # No compression for faults because we'd like them to pop # up in clear text on the other side just in case output.set_transport_flags(output.TRANSFER_NONE, output.ENCODE_NONE) elif compress_response: # check if we have to compress this result log_debug(4, "Compression on for client version", self.client) if self.client > 0: output.set_transport_flags(output.TRANSFER_BINARY, output.ENCODE_ZLIB) else: # original clients had the binary transport support broken output.set_transport_flags(output.TRANSFER_BASE64, output.ENCODE_ZLIB) # We simply add the transport options to the output headers output.headers.update(rhnFlags.get('outputTransportOptions').dict()) if needs_xmlrpc_encoding: # Normalize the response response = self.normalize(response) try: response = xmlrpclib.dumps(response, methodresponse=1) except TypeError: e = sys.exc_info()[1] log_debug(4, "Error \"%s\" encoding response = %s" % (e, response)) Traceback("apacheHandler.response", self.req, extra="Error \"%s\" encoding response = %s" % (e, response), severity="notification") return apache.HTTP_INTERNAL_SERVER_ERROR except: # Uncaught exception; signal the error Traceback("apacheHandler.response", self.req, severity="unhandled") return apache.HTTP_INTERNAL_SERVER_ERROR # we're about done here, patch up the headers output.process(response) # Copy the rest of the fields for k, v in output.headers.items(): if string.lower(k) == 'content-type': # Content-type self.req.content_type = v else: setHeaderValue(self.req.headers_out, k, v) if 5 <= CFG.DEBUG < 10: log_debug(5, "The response: %s[...SNIP (for sanity) SNIP...]%s" % (response[:100], response[-100:])) elif CFG.DEBUG >= 10: # if you absolutely must have that whole response in the log file log_debug(10, "The response: %s" % response) # send the headers self.req.send_http_header() try: # XXX: in case data is really large maybe we should split # it in smaller chunks instead of blasting everything at # once. Not yet a problem... self.req.write(output.data) except IOError: # send_http_header is already sent, so it doesn't make a lot of # sense to return a non-200 error; but there is no better solution return apache.HTTP_BAD_REQUEST del output return apache.OK