From: Ruediger Pluem Date: Tue, 26 Jan 2016 12:57:18 +0000 (+0000) Subject: * Transform the buckets to the correct lifetime of the brigade, connection and filter... X-Git-Tag: 2.5.0-alpha~2274 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=90bd586745961d43c016500afc95ef8d7e132e2a;p=apache * Transform the buckets to the correct lifetime of the brigade, connection and filter stack that processes it. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1726787 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/proxy/mod_proxy_wstunnel.c b/modules/proxy/mod_proxy_wstunnel.c index 56a01e68d9..417eb6693f 100644 --- a/modules/proxy/mod_proxy_wstunnel.c +++ b/modules/proxy/mod_proxy_wstunnel.c @@ -31,14 +31,16 @@ typedef struct ws_baton_t { apr_socket_t *server_soc; apr_socket_t *client_soc; apr_pollset_t *pollset; - apr_bucket_brigade *bb; + apr_bucket_brigade *bb_i; + apr_bucket_brigade *bb_o; apr_pool_t *subpool; /* cleared before each suspend, destroyed when request ends */ char *scheme; /* required to release the proxy connection */ } ws_baton_t; static apr_status_t proxy_wstunnel_transfer(request_rec *r, conn_rec *c_i, conn_rec *c_o, - apr_bucket_brigade *bb, + apr_bucket_brigade *bb_i, + apr_bucket_brigade *bb_o, const char *name, int *sent); static void proxy_wstunnel_callback(void *b); @@ -54,7 +56,8 @@ static int proxy_wstunnel_pump(ws_baton_t *baton, apr_time_t timeout, int try_as apr_pollset_t *pollset = baton->pollset; apr_socket_t *client_socket = baton->client_soc; apr_status_t rv; - apr_bucket_brigade *bb = baton->bb; + apr_bucket_brigade *bb_i = baton->bb_i; + apr_bucket_brigade *bb_o = baton->bb_o; int done = 0, replied = 0; do { @@ -89,8 +92,9 @@ static int proxy_wstunnel_pump(ws_baton_t *baton, apr_time_t timeout, int try_as if (pollevent & (APR_POLLIN | APR_POLLHUP)) { ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r, APLOGNO(02446) "sock was readable"); - done |= proxy_wstunnel_transfer(r, backconn, c, bb, "sock", - NULL) != APR_SUCCESS; + done |= proxy_wstunnel_transfer(r, backconn, c, bb_i, bb_o, + "sock", NULL) + != APR_SUCCESS; } else if (pollevent & APR_POLLERR) { ap_log_rerror(APLOG_MARK, APLOG_NOTICE, 0, r, APLOGNO(02447) @@ -109,8 +113,9 @@ static int proxy_wstunnel_pump(ws_baton_t *baton, apr_time_t timeout, int try_as if (pollevent & (APR_POLLIN | APR_POLLHUP)) { ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r, APLOGNO(02448) "client was readable"); - done |= proxy_wstunnel_transfer(r, c, backconn, bb, "client", - &replied) != APR_SUCCESS; + done |= proxy_wstunnel_transfer(r, c, backconn, bb_i, bb_o, + "client", &replied) + != APR_SUCCESS; } else if (pollevent & APR_POLLERR) { ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r, APLOGNO(02607) @@ -270,7 +275,8 @@ static int proxy_wstunnel_canon(request_rec *r, char *url) static apr_status_t proxy_wstunnel_transfer(request_rec *r, conn_rec *c_i, conn_rec *c_o, - apr_bucket_brigade *bb, + apr_bucket_brigade *bb_i, + apr_bucket_brigade *bb_o, const char *name, int *sent) { apr_status_t rv; @@ -279,19 +285,19 @@ static apr_status_t proxy_wstunnel_transfer(request_rec *r, #endif do { - apr_brigade_cleanup(bb); - rv = ap_get_brigade(c_i->input_filters, bb, AP_MODE_READBYTES, + apr_brigade_cleanup(bb_i); + rv = ap_get_brigade(c_i->input_filters, bb_i, AP_MODE_READBYTES, APR_NONBLOCK_READ, AP_IOBUFSIZE); if (rv == APR_SUCCESS) { if (c_o->aborted) { return APR_EPIPE; } - if (APR_BRIGADE_EMPTY(bb)) { + if (APR_BRIGADE_EMPTY(bb_i)) { break; } #ifdef DEBUGGING len = -1; - apr_brigade_length(bb, 0, &len); + apr_brigade_length(bb_i, 0, &len); ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(02440) "read %" APR_OFF_T_FMT " bytes from %s", len, name); @@ -299,9 +305,10 @@ static apr_status_t proxy_wstunnel_transfer(request_rec *r, if (sent) { *sent = 1; } - rv = ap_pass_brigade(c_o->output_filters, bb); + ap_proxy_buckets_lifetime_transform(r, bb_i, bb_o); + rv = ap_pass_brigade(c_o->output_filters, bb_o); if (rv == APR_SUCCESS) { - ap_fflush(c_o->output_filters, bb); + ap_fflush(c_o->output_filters, bb_o); } else { ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(02441) @@ -372,6 +379,8 @@ static int proxy_wstunnel_request(apr_pool_t *p, request_rec *r, header_brigade, 1)) != OK) return rv; + apr_brigade_cleanup(header_brigade); + ap_log_rerror(APLOG_MARK, APLOG_TRACE2, 0, r, "setting up poll()"); if ((rv = apr_pollset_create(&pollset, 2, p, 0)) != APR_SUCCESS) { @@ -413,7 +422,8 @@ static int proxy_wstunnel_request(apr_pool_t *p, request_rec *r, baton->client_soc = client_socket; baton->server_soc = sock; baton->proxy_connrec = conn; - baton->bb = bb; + baton->bb_i = bb; + baton->bb_o = header_brigade; baton->scheme = scheme; apr_pool_create(&baton->subpool, r->pool);