static void sendResponse(xmlrpc_env * const envP, TSession * const abyssSessionP, const char * const body, size_t const len, bool const chunked, ResponseAccessCtl const accessControl) { /*---------------------------------------------------------------------------- Generate an HTTP response containing body 'body' of length 'len' characters. This is meant to run in the context of an Abyss URI handler for Abyss session 'abyssSessionP'. -----------------------------------------------------------------------------*/ const char * http_cookie = NULL; /* This used to set http_cookie to getenv("HTTP_COOKIE"), but that doesn't make any sense -- environment variables are not appropriate for this. So for now, cookie code is disabled. - Bryan 2004.10.03. */ /* Various bugs before Xmlrpc-c 1.05 caused the response to be not chunked in the most basic case, but chunked if the client explicitly requested keepalive. I think it's better not to chunk, because it's simpler, so I removed this in 1.05. I don't know what the purpose of chunking would be, and an original comment suggests the author wasn't sure chunking was a good idea. In 1.06 we added the user option to chunk. */ if (chunked) ResponseChunked(abyssSessionP); ResponseStatus(abyssSessionP, 200); if (http_cookie) /* There's an auth cookie, so pass it back in the response. */ addAuthCookie(envP, abyssSessionP, http_cookie); if ((size_t)(uint32_t)len != len) xmlrpc_faultf(envP, "XML-RPC method generated a response too " "large for Abyss to send"); else { uint32_t const abyssLen = (uint32_t)len; /* See discussion below of quotes around "utf-8" */ ResponseContentType(abyssSessionP, "text/xml; charset=utf-8"); ResponseContentLength(abyssSessionP, abyssLen); ResponseAccessControl(abyssSessionP, accessControl); ResponseWriteStart(abyssSessionP); ResponseWriteBody(abyssSessionP, body, abyssLen); ResponseWriteEnd(abyssSessionP); } }
void AbyssServer::Session::writeResponseBody(const unsigned char * const data, size_t const size) { /*----------------------------------------------------------------------------- Write some of the response body. If it's a chunked response, this constitutes one chunk. If not, it's just part of the monolithic response. Either way, you can call this multiple times for one response. -----------------------------------------------------------------------------*/ ResponseWriteBody(this->implP->cSessionP, reinterpret_cast<const char *>(data), size); }
/************************************** * SendResponse * Envia la respuesta de una peticion **************************************/ int XmlRpcServer::SendResponse(TSession *r, short code, const char *msg, int length) { //Chunked output ResponseChunked(r); //POnemos el codigo ResponseStatus(r,code); //El content length ResponseContentLength(r, length); //Escribimos la respuesta ResponseWriteStart(r); //La mandamos ResponseWriteBody(r,(char*)msg,length); //End it ResponseWriteEnd(r); return 1; }