summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYann Ylavic <ylavic@apache.org>2020-05-13 17:00:06 +0200
committerYann Ylavic <ylavic@apache.org>2020-05-13 17:00:06 +0200
commitb5b8daa7654b209d1950a6978f7aae9fecec8213 (patch)
tree4f54943c29f2405d9945a641a07bad9e596d3703
parentmod_proxy_http: axe ap_proxy_should_override() duplicate checks. (diff)
downloadapache2-b5b8daa7654b209d1950a6978f7aae9fecec8213.tar.xz
apache2-b5b8daa7654b209d1950a6978f7aae9fecec8213.zip
mod_proxy_http: follow up to r1877696: reindent.
No functional changes. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1877697 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--modules/proxy/mod_proxy_http.c288
1 files changed, 143 insertions, 145 deletions
diff --git a/modules/proxy/mod_proxy_http.c b/modules/proxy/mod_proxy_http.c
index 417515e9b9..739050d2e3 100644
--- a/modules/proxy/mod_proxy_http.c
+++ b/modules/proxy/mod_proxy_http.c
@@ -1813,6 +1813,9 @@ int ap_proxy_http_process_response(proxy_http_req_t *req)
/* send body - but only if a body is expected */
if (!r->header_only && !AP_STATUS_IS_HEADER_ONLY(proxy_status)) {
+ apr_read_type_e mode;
+ int finish;
+
/* We need to copy the output headers and treat them as input
* headers as well. BUT, we need to do this before we remove
* TE, so that they are preserved accordingly for
@@ -1832,168 +1835,163 @@ int ap_proxy_http_process_response(proxy_http_req_t *req)
ap_log_rerror(APLOG_MARK, APLOG_TRACE3, 0, r, "start body send");
- /*
- * if we are overriding the errors, we can't put the content
- * of the page into the brigade
+ /* read the body, pass it to the output filters */
+
+ /* Handle the case where the error document is itself reverse
+ * proxied and was successful. We must maintain any previous
+ * error status so that an underlying error (eg HTTP_NOT_FOUND)
+ * doesn't become an HTTP_OK.
*/
- {
- /* read the body, pass it to the output filters */
- apr_read_type_e mode = APR_NONBLOCK_READ;
- int finish = FALSE;
-
- /* Handle the case where the error document is itself reverse
- * proxied and was successful. We must maintain any previous
- * error status so that an underlying error (eg HTTP_NOT_FOUND)
- * doesn't become an HTTP_OK.
- */
- if (ap_proxy_should_override(dconf, original_status)) {
- r->status = original_status;
- r->status_line = original_status_line;
- }
+ if (ap_proxy_should_override(dconf, original_status)) {
+ r->status = original_status;
+ r->status_line = original_status_line;
+ }
- do {
- apr_off_t readbytes;
- apr_status_t rv;
-
- rv = ap_get_brigade(backend->r->input_filters, bb,
- AP_MODE_READBYTES, mode,
- req->sconf->io_buffer_size);
-
- /* ap_get_brigade will return success with an empty brigade
- * for a non-blocking read which would block: */
- if (mode == APR_NONBLOCK_READ
- && (APR_STATUS_IS_EAGAIN(rv)
- || (rv == APR_SUCCESS && APR_BRIGADE_EMPTY(bb)))) {
- /* flush to the client and switch to blocking mode */
- e = apr_bucket_flush_create(c->bucket_alloc);
- APR_BRIGADE_INSERT_TAIL(bb, e);
- if (ap_pass_brigade(r->output_filters, bb)
- || c->aborted) {
- backend->close = 1;
- break;
- }
- apr_brigade_cleanup(bb);
- mode = APR_BLOCK_READ;
- continue;
- }
- else if (rv == APR_EOF) {
+ mode = APR_NONBLOCK_READ;
+ finish = FALSE;
+ do {
+ apr_off_t readbytes;
+ apr_status_t rv;
+
+ rv = ap_get_brigade(backend->r->input_filters, bb,
+ AP_MODE_READBYTES, mode,
+ req->sconf->io_buffer_size);
+
+ /* ap_get_brigade will return success with an empty brigade
+ * for a non-blocking read which would block: */
+ if (mode == APR_NONBLOCK_READ
+ && (APR_STATUS_IS_EAGAIN(rv)
+ || (rv == APR_SUCCESS && APR_BRIGADE_EMPTY(bb)))) {
+ /* flush to the client and switch to blocking mode */
+ e = apr_bucket_flush_create(c->bucket_alloc);
+ APR_BRIGADE_INSERT_TAIL(bb, e);
+ if (ap_pass_brigade(r->output_filters, bb)
+ || c->aborted) {
backend->close = 1;
break;
}
- else if (rv != APR_SUCCESS) {
- if (rv == APR_ENOSPC) {
- ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(02475)
- "Response chunk/line was too large to parse");
- }
- else if (rv == APR_ENOTIMPL) {
- ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(02476)
- "Response Transfer-Encoding was not recognised");
- }
- else {
- ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(01110)
- "Network error reading response");
- }
-
- /* In this case, we are in real trouble because
- * our backend bailed on us. Given we're half way
- * through a response, our only option is to
- * disconnect the client too.
- */
- apr_brigade_cleanup(bb);
- e = ap_bucket_error_create(HTTP_GATEWAY_TIME_OUT, NULL,
- r->pool, c->bucket_alloc);
- APR_BRIGADE_INSERT_TAIL(bb, e);
- e = ap_bucket_eoc_create(c->bucket_alloc);
- APR_BRIGADE_INSERT_TAIL(bb, e);
- ap_pass_brigade(r->output_filters, bb);
-
- backend_broke = 1;
- backend->close = 1;
- break;
+ apr_brigade_cleanup(bb);
+ mode = APR_BLOCK_READ;
+ continue;
+ }
+ else if (rv == APR_EOF) {
+ backend->close = 1;
+ break;
+ }
+ else if (rv != APR_SUCCESS) {
+ if (rv == APR_ENOSPC) {
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(02475)
+ "Response chunk/line was too large to parse");
}
- /* next time try a non-blocking read */
- mode = APR_NONBLOCK_READ;
-
- if (!apr_is_empty_table(backend->r->trailers_in)) {
- apr_table_do(add_trailers, r->trailers_out,
- backend->r->trailers_in, NULL);
- apr_table_clear(backend->r->trailers_in);
+ else if (rv == APR_ENOTIMPL) {
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(02476)
+ "Response Transfer-Encoding was not recognised");
}
+ else {
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(01110)
+ "Network error reading response");
+ }
+
+ /* In this case, we are in real trouble because
+ * our backend bailed on us. Given we're half way
+ * through a response, our only option is to
+ * disconnect the client too.
+ */
+ apr_brigade_cleanup(bb);
+ e = ap_bucket_error_create(HTTP_GATEWAY_TIME_OUT, NULL,
+ r->pool, c->bucket_alloc);
+ APR_BRIGADE_INSERT_TAIL(bb, e);
+ e = ap_bucket_eoc_create(c->bucket_alloc);
+ APR_BRIGADE_INSERT_TAIL(bb, e);
+ ap_pass_brigade(r->output_filters, bb);
+
+ backend_broke = 1;
+ backend->close = 1;
+ break;
+ }
+ /* next time try a non-blocking read */
+ mode = APR_NONBLOCK_READ;
+
+ if (!apr_is_empty_table(backend->r->trailers_in)) {
+ apr_table_do(add_trailers, r->trailers_out,
+ backend->r->trailers_in, NULL);
+ apr_table_clear(backend->r->trailers_in);
+ }
- apr_brigade_length(bb, 0, &readbytes);
- backend->worker->s->read += readbytes;
+ apr_brigade_length(bb, 0, &readbytes);
+ backend->worker->s->read += readbytes;
#if DEBUGGING
- {
- ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01111)
- "readbytes: %#x", readbytes);
- }
+ {
+ ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01111)
+ "readbytes: %#x", readbytes);
+ }
#endif
- /* sanity check */
- if (APR_BRIGADE_EMPTY(bb)) {
- break;
- }
+ /* sanity check */
+ if (APR_BRIGADE_EMPTY(bb)) {
+ break;
+ }
- /* Switch the allocator lifetime of the buckets */
- ap_proxy_buckets_lifetime_transform(r, bb, pass_bb);
-
- /* found the last brigade? */
- if (APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(pass_bb))) {
-
- /* signal that we must leave */
- finish = TRUE;
-
- /* the brigade may contain transient buckets that contain
- * data that lives only as long as the backend connection.
- * Force a setaside so these transient buckets become heap
- * buckets that live as long as the request.
- */
- for (e = APR_BRIGADE_FIRST(pass_bb); e
- != APR_BRIGADE_SENTINEL(pass_bb); e
- = APR_BUCKET_NEXT(e)) {
- apr_bucket_setaside(e, r->pool);
- }
-
- /* finally it is safe to clean up the brigade from the
- * connection pool, as we have forced a setaside on all
- * buckets.
- */
- apr_brigade_cleanup(bb);
-
- /* make sure we release the backend connection as soon
- * as we know we are done, so that the backend isn't
- * left waiting for a slow client to eventually
- * acknowledge the data.
- */
- proxy_run_detach_backend(r, backend);
- ap_proxy_release_connection(backend->worker->s->scheme,
- backend, r->server);
- /* Ensure that the backend is not reused */
- req->backend = NULL;
+ /* Switch the allocator lifetime of the buckets */
+ ap_proxy_buckets_lifetime_transform(r, bb, pass_bb);
- }
+ /* found the last brigade? */
+ if (APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(pass_bb))) {
- /* try send what we read */
- if (ap_pass_brigade(r->output_filters, pass_bb) != APR_SUCCESS
- || c->aborted) {
- /* Ack! Phbtt! Die! User aborted! */
- /* Only close backend if we haven't got all from the
- * backend. Furthermore if req->backend is NULL it is no
- * longer safe to fiddle around with backend as it might
- * be already in use by another thread.
- */
- if (req->backend) {
- /* this causes socket close below */
- req->backend->close = 1;
- }
- finish = TRUE;
+ /* signal that we must leave */
+ finish = TRUE;
+
+ /* the brigade may contain transient buckets that contain
+ * data that lives only as long as the backend connection.
+ * Force a setaside so these transient buckets become heap
+ * buckets that live as long as the request.
+ */
+ for (e = APR_BRIGADE_FIRST(pass_bb); e
+ != APR_BRIGADE_SENTINEL(pass_bb); e
+ = APR_BUCKET_NEXT(e)) {
+ apr_bucket_setaside(e, r->pool);
}
- /* make sure we always clean up after ourselves */
- apr_brigade_cleanup(pass_bb);
+ /* finally it is safe to clean up the brigade from the
+ * connection pool, as we have forced a setaside on all
+ * buckets.
+ */
apr_brigade_cleanup(bb);
- } while (!finish);
- }
+ /* make sure we release the backend connection as soon
+ * as we know we are done, so that the backend isn't
+ * left waiting for a slow client to eventually
+ * acknowledge the data.
+ */
+ proxy_run_detach_backend(r, backend);
+ ap_proxy_release_connection(backend->worker->s->scheme,
+ backend, r->server);
+ /* Ensure that the backend is not reused */
+ req->backend = NULL;
+
+ }
+
+ /* try send what we read */
+ if (ap_pass_brigade(r->output_filters, pass_bb) != APR_SUCCESS
+ || c->aborted) {
+ /* Ack! Phbtt! Die! User aborted! */
+ /* Only close backend if we haven't got all from the
+ * backend. Furthermore if req->backend is NULL it is no
+ * longer safe to fiddle around with backend as it might
+ * be already in use by another thread.
+ */
+ if (req->backend) {
+ /* this causes socket close below */
+ req->backend->close = 1;
+ }
+ finish = TRUE;
+ }
+
+ /* make sure we always clean up after ourselves */
+ apr_brigade_cleanup(pass_bb);
+ apr_brigade_cleanup(bb);
+
+ } while (!finish);
+
ap_log_rerror(APLOG_MARK, APLOG_TRACE2, 0, r, "end body send");
}
else {