From: William A. Rowe Jr Date: Tue, 25 Feb 2003 16:52:55 +0000 (+0000) Subject: Confirmed by Milan Kosina that this code was still broken - I realized X-Git-Tag: pre_ajp_proxy~2077 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=eb7fb37232d2fa09b8fbcb7422e622d63619ecbc;p=apache Confirmed by Milan Kosina that this code was still broken - I realized we weren't updating stat correctly, and shouldn't have been trying to pass the status, but the headers instead, from WriteClient(). This way we can actually count the bytes consumed and begin treating the rest as body contents. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@98793 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/arch/win32/mod_isapi.c b/modules/arch/win32/mod_isapi.c index 9b823c0fd5..73f86c2f25 100644 --- a/modules/arch/win32/mod_isapi.c +++ b/modules/arch/win32/mod_isapi.c @@ -653,6 +653,13 @@ int APR_THREAD_FUNC ReadClient(isapi_cid *cid, /* Common code invoked for both HSE_REQ_SEND_RESPONSE_HEADER and * the newer HSE_REQ_SEND_RESPONSE_HEADER_EX ServerSupportFunction(s) + * as well as other functions that write responses and presume that + * the support functions above are optional. + * + * Other callers trying to split headers and body bytes should pass + * head/headlen alone (leaving stat/statlen NULL/0), so that they + * get a proper count of bytes consumed. The argument passed to stat + * isn't counted as the head bytes are. */ static apr_ssize_t send_response_header(isapi_cid *cid, const char *stat, @@ -698,18 +705,29 @@ static apr_ssize_t send_response_header(isapi_cid *cid, } if (stat && (statlen > 0) && *stat) { - char *newstat = apr_palloc(cid->r->pool, statlen + 9); - char *stattok = (char*)memchr(stat, ' ', statlen - 1) + 1; - strcpy(newstat, "Status: "); - /* Now decide if we follow the xxx message - * or the http/x.x xxx message format - */ - if (!apr_isdigit(*stat) && stattok && apr_isdigit(*stattok)) { - statlen -= stattok - (char*)stat; - stat = stattok; + char *newstat; + if (!apr_isdigit(*stat)) { + const char *stattok = stat; + int toklen = statlen; + while (toklen && *stattok && !apr_isspace(*stattok)) { + ++stattok; --toklen; + } + while (toklen && apr_isspace(*stattok)) { + ++stattok; --toklen; + } + /* Now decide if we follow the xxx message + * or the http/x.x xxx message format + */ + if (toklen && apr_isdigit(*stattok)) { + statlen -= toklen; + stat = stattok; + } } - apr_cpystrn(newstat + 8, stat, statlen + 1); + newstat = apr_palloc(cid->r->pool, statlen + 9); + strcpy(newstat, "Status: "); + apr_cpystrn(newstat + 8, stat, statlen); stat = newstat; + statlen += 8; } if (!head || headlen == 0 || !*head) { @@ -799,8 +817,8 @@ int APR_THREAD_FUNC WriteClient(isapi_cid *cid, * Parse them out, or die trying. */ apr_ssize_t ate; - ate = send_response_header(cid, (char*)buf_data, - NULL, buf_size, 0); + ate = send_response_header(cid, NULL, (char*)buf_data, + 0, buf_size); if (ate < 0) { SetLastError(ERROR_INVALID_PARAMETER); return 0;