You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
3.9 KiB
92 lines
3.9 KiB
diff --git a/modules/proxy/mod_proxy_wstunnel.c b/modules/proxy/mod_proxy_wstunnel.c |
|
index 525109a..eb34eee 100644 |
|
--- a/modules/proxy/mod_proxy_wstunnel.c |
|
+++ b/modules/proxy/mod_proxy_wstunnel.c |
|
@@ -103,10 +103,12 @@ static int proxy_wstunnel_transfer(request_rec *r, conn_rec *c_i, conn_rec *c_o, |
|
rv = ap_get_brigade(c_i->input_filters, bb, AP_MODE_READBYTES, |
|
APR_NONBLOCK_READ, AP_IOBUFSIZE); |
|
if (rv == APR_SUCCESS) { |
|
- if (c_o->aborted) |
|
+ if (c_o->aborted) { |
|
return APR_EPIPE; |
|
- if (APR_BRIGADE_EMPTY(bb)) |
|
+ } |
|
+ if (APR_BRIGADE_EMPTY(bb)){ |
|
break; |
|
+ } |
|
#ifdef DEBUGGING |
|
len = -1; |
|
apr_brigade_length(bb, 0, &len); |
|
@@ -178,7 +180,6 @@ static int ap_proxy_wstunnel_request(apr_pool_t *p, request_rec *r, |
|
conn_rec *c = r->connection; |
|
apr_socket_t *sock = conn->sock; |
|
conn_rec *backconn = conn->connection; |
|
- int client_error = 0; |
|
char *buf; |
|
apr_bucket_brigade *header_brigade; |
|
apr_bucket *e; |
|
@@ -224,7 +225,7 @@ static int ap_proxy_wstunnel_request(apr_pool_t *p, request_rec *r, |
|
|
|
pollfd.p = p; |
|
pollfd.desc_type = APR_POLL_SOCKET; |
|
- pollfd.reqevents = APR_POLLIN; |
|
+ pollfd.reqevents = APR_POLLIN | APR_POLLHUP; |
|
pollfd.desc.s = sock; |
|
pollfd.client_data = NULL; |
|
apr_pollset_add(pollset, &pollfd); |
|
@@ -237,6 +238,9 @@ static int ap_proxy_wstunnel_request(apr_pool_t *p, request_rec *r, |
|
r->proto_output_filters = c->output_filters; |
|
r->input_filters = c->input_filters; |
|
r->proto_input_filters = c->input_filters; |
|
+ /* This handler should take care of the entire connection; make it so that |
|
+ * nothing else is attempted on the connection after returning. */ |
|
+ c->keepalive = AP_CONN_CLOSE; |
|
|
|
remove_reqtimeout(r->input_filters); |
|
|
|
@@ -257,26 +261,28 @@ static int ap_proxy_wstunnel_request(apr_pool_t *p, request_rec *r, |
|
|
|
if (cur->desc.s == sock) { |
|
pollevent = cur->rtnevents; |
|
- if (pollevent & APR_POLLIN) { |
|
+ if (pollevent & (APR_POLLIN | APR_POLLHUP)) { |
|
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(02446) |
|
"sock was readable"); |
|
rv = proxy_wstunnel_transfer(r, backconn, c, bb, "sock"); |
|
} |
|
- else if ((pollevent & APR_POLLERR) |
|
- || (pollevent & APR_POLLHUP)) { |
|
+ else if (pollevent & APR_POLLERR) { |
|
rv = APR_EPIPE; |
|
ap_log_rerror(APLOG_MARK, APLOG_NOTICE, 0, r, APLOGNO(02447) |
|
- "err/hup on backconn"); |
|
+ "err on backconn"); |
|
} |
|
- if (rv != APR_SUCCESS) |
|
- client_error = 1; |
|
} |
|
else if (cur->desc.s == client_socket) { |
|
pollevent = cur->rtnevents; |
|
- if (pollevent & APR_POLLIN) { |
|
+ if (pollevent & (APR_POLLIN | APR_POLLHUP)) { |
|
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(02448) |
|
"client was readable"); |
|
rv = proxy_wstunnel_transfer(r, c, backconn, bb, "client"); |
|
+ } else if (pollevent & APR_POLLERR) { |
|
+ rv = APR_EPIPE; |
|
+ c->aborted = 1; |
|
+ ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r, APLOGNO(02607) |
|
+ "error on client conn"); |
|
} |
|
} |
|
else { |
|
@@ -294,9 +300,6 @@ static int ap_proxy_wstunnel_request(apr_pool_t *p, request_rec *r, |
|
ap_log_rerror(APLOG_MARK, APLOG_TRACE2, 0, r, |
|
"finished with poll() - cleaning up"); |
|
|
|
- if (client_error) { |
|
- return HTTP_INTERNAL_SERVER_ERROR; |
|
- } |
|
return OK; |
|
} |
|
|
|
|