def setResult(self, result): """Sets the result of the response Sets the return body equal to the (string) argument "body". Also updates the "content-length" return header. If the body is a 2-element tuple, then it will be treated as (title,body) If is_error is true then the HTML will be formatted as a Zope error message instead of a generic HTML page. """ body = premarshal(result) if isinstance(body, xmlrpclib.Fault): # Convert Fault object to XML-RPC response. body = xmlrpclib.dumps(body, methodresponse=True) else: # Marshall our body as an XML-RPC response. Strings will be sent # as strings, integers as integers, etc. We do *not* convert # everything to a string first. try: body = xmlrpclib.dumps((body,), methodresponse=True, allow_none=True) except: # We really want to catch all exceptions at this point! self.handleException(sys.exc_info()) return headers = [('content-type', 'text/xml;charset=utf-8'), ('content-length', str(len(body)))] self._headers.update(dict((k, [v]) for (k, v) in headers)) super(XMLRPCResponse, self).setResult(DirectResult((body,)))
def testWrite_noContentLength(self): response = self._createResponse() # We have to set all the headers ourself, we choose not to provide a # content-length header response.setHeader('Content-Type', 'text/plain;charset=us-ascii') # Output the data data = b'a' * 10 response.setResult(DirectResult(data)) headers, body = self._parseResult(response) # Check that the data have been written, and that the header # has been preserved self.assertEqual(headers['Content-Type'], 'text/plain;charset=us-ascii') self.assertEqual(body, data) # Make sure that no Content-Length header was added self.assertTrue('Content-Length' not in headers)