From 378eb21fb1993d044433a7207c432b908f82728d Mon Sep 17 00:00:00 2001 From: Justin Erenkrantz Date: Thu, 30 May 2002 07:33:59 +0000 Subject: [PATCH] Switch mod_proxy to using the brigade/filter calls directly rather than the *_client_block calls. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@95394 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 4 +-- modules/proxy/mod_proxy.c | 3 --- modules/proxy/proxy_http.c | 51 ++++++++++++++++++++++++++------------ 3 files changed, 37 insertions(+), 21 deletions(-) diff --git a/CHANGES b/CHANGES index 59c6092ec3..83bab11435 100644 --- a/CHANGES +++ b/CHANGES @@ -9,8 +9,8 @@ Changes with Apache 2.0.37 Elimiates possible gpfault or garbage title without the -t option. [William Rowe] - *) Rewrite mod_cgi and mod_cgid's input handling to use brigades and input - filters. [Justin Erenkrantz] + *) Rewrite mod_cgi, mod_cgid, and mod_proxy input handling to use + brigades and input filters. [Justin Erenkrantz] *) Allow ap_http_filter (HTTP_IN) to return EOS when there is no request body. [Justin Erenkrantz] diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c index 587a1114df..513c82045c 100644 --- a/modules/proxy/mod_proxy.c +++ b/modules/proxy/mod_proxy.c @@ -394,9 +394,6 @@ static int proxy_handler(request_rec *r) apr_table_set(r->headers_in, "Max-Forwards", apr_psprintf(r->pool, "%ld", (maxfwd > 0) ? maxfwd : 0)); - if ((rc = ap_setup_client_block(r, REQUEST_CHUNKED_ERROR))) - return rc; - url = r->filename + 6; p = strchr(url, ':'); if (p == NULL) diff --git a/modules/proxy/proxy_http.c b/modules/proxy/proxy_http.c index 589d44d6bc..ee9c75da1b 100644 --- a/modules/proxy/proxy_http.c +++ b/modules/proxy/proxy_http.c @@ -419,12 +419,11 @@ apr_status_t ap_proxy_http_request(apr_pool_t *p, request_rec *r, char *url, apr_bucket_brigade *bb, char *server_portstr) { conn_rec *c = r->connection; - char buffer[HUGE_STRING_LEN]; char *buf; apr_bucket *e; const apr_array_header_t *headers_in_array; const apr_table_entry_t *headers_in; - int counter; + int counter, seen_eos; apr_status_t status; /* @@ -620,22 +619,42 @@ apr_status_t ap_proxy_http_request(apr_pool_t *p, request_rec *r, } /* send the request data, if any. */ - if (ap_should_client_block(r)) { - while ((counter = ap_get_client_block(r, buffer, sizeof(buffer))) > 0) { - e = apr_bucket_pool_create(buffer, counter, p, c->bucket_alloc); - APR_BRIGADE_INSERT_TAIL(bb, e); - e = apr_bucket_flush_create(c->bucket_alloc); - APR_BRIGADE_INSERT_TAIL(bb, e); - status = ap_pass_brigade(origin->output_filters, bb); - if (status != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, status, r->server, - "proxy: pass request data failed to %pI (%s)", - p_conn->addr, p_conn->name); - return status; + seen_eos = 0; + do { + status = ap_get_brigade(r->input_filters, bb, AP_MODE_READBYTES, + APR_BLOCK_READ, HUGE_STRING_LEN); + + if (status != APR_SUCCESS) { + return status; + } + + /* If this brigade contain EOS, either stop or remove it. */ + if (APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(bb))) { + /* As a shortcut, if this brigade is simply an EOS bucket, + * don't send anything down the filter chain. + */ + if (APR_BUCKET_IS_EOS(APR_BRIGADE_FIRST(bb))) { + break; } - apr_brigade_cleanup(bb); + + /* We can't pass this EOS to the output_filters. */ + APR_BUCKET_REMOVE(APR_BRIGADE_LAST(bb)); + seen_eos = 1; } - } + + e = apr_bucket_flush_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, e); + + status = ap_pass_brigade(origin->output_filters, bb); + if (status != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, status, r->server, + "proxy: pass request data failed to %pI (%s)", + p_conn->addr, p_conn->name); + return status; + } + apr_brigade_cleanup(bb); + } while (!seen_eos); + return APR_SUCCESS; } -- 2.50.1