From a6d7dea21561037f15ed8528fcee2072709cf237 Mon Sep 17 00:00:00 2001 From: Yann Ylavic Date: Wed, 13 Feb 2019 16:53:50 +0000 Subject: [PATCH] mod_proxy_http: follow up to r1853409. Don't send two final 0-size chunks when the last read brigade is a single EOS. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1853518 13f79535-47bb-0310-9956-ffa450edef68 --- modules/proxy/mod_proxy_http.c | 38 ++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/modules/proxy/mod_proxy_http.c b/modules/proxy/mod_proxy_http.c index 88058640c0..9eb2754ae7 100644 --- a/modules/proxy/mod_proxy_http.c +++ b/modules/proxy/mod_proxy_http.c @@ -336,20 +336,32 @@ static int stream_reqbody_chunked(proxy_http_req_t *req) } apr_brigade_length(input_brigade, 1, &bytes); - hdr_len = apr_snprintf(chunk_hdr, sizeof(chunk_hdr), - "%" APR_UINT64_T_HEX_FMT CRLF, - (apr_uint64_t)bytes); + if (bytes) { + hdr_len = apr_snprintf(chunk_hdr, sizeof(chunk_hdr), + "%" APR_UINT64_T_HEX_FMT CRLF, + (apr_uint64_t)bytes); + ap_xlate_proto_to_ascii(chunk_hdr, hdr_len); + e = apr_bucket_transient_create(chunk_hdr, hdr_len, + bucket_alloc); + APR_BRIGADE_INSERT_HEAD(input_brigade, e); - ap_xlate_proto_to_ascii(chunk_hdr, hdr_len); - e = apr_bucket_transient_create(chunk_hdr, hdr_len, - bucket_alloc); - APR_BRIGADE_INSERT_HEAD(input_brigade, e); - - /* - * Append the end-of-chunk CRLF - */ - e = apr_bucket_immortal_create(CRLF_ASCII, 2, bucket_alloc); - APR_BRIGADE_INSERT_TAIL(input_brigade, e); + /* + * Append the end-of-chunk CRLF + */ + e = apr_bucket_immortal_create(CRLF_ASCII, 2, bucket_alloc); + APR_BRIGADE_INSERT_TAIL(input_brigade, e); + } + else if (APR_BRIGADE_EMPTY(header_brigade)) { + if (!seen_eos) { + /* Metadata only (shouldn't happen), read more */ + apr_brigade_cleanup(input_brigade); + continue; + } + /* At EOS, we are done since the trailing 0-size is handled + * outside this loop. + */ + break; + } } /* If we never sent the header brigade, so go ahead and