Corresponding patch attached...
On Wed, Mar 18, 2015 at 10:57 AM, Yann Ylavic <[email protected]> wrote:
> On Wed, Mar 18, 2015 at 10:44 AM, Yann Ylavic <[email protected]> wrote:
>>
> []
>> Index: modules/proxy/mod_proxy_wstunnel.c
>> ===================================================================
>> --- modules/proxy/mod_proxy_wstunnel.c (revision 1665828)
>> +++ modules/proxy/mod_proxy_wstunnel.c (working copy)
> []
>> @@ -292,7 +299,15 @@ static int proxy_wstunnel_request(apr_pool_t *p, r
>> ap_log_rerror(APLOG_MARK, APLOG_TRACE2, 0, r,
>> "finished with poll() - cleaning up");
>>
>> - return OK;
>> + if (!response_sent) {
>> + return HTTP_BAD_GATEWAY;
>> + }
>> + else if (!request_sent) {
>> + return HTTP_BAD_REQUEST;
>
> This case is probably not a good idea, so we'd better not handle
> request_sent at all (only response_sent), and use NULL instead for
> proxy_wstunnel_transfer().
>
>> + }
>> + else {
>> + return OK;
>> + }
>> }
>>
>> /*
>> --
Index: modules/proxy/mod_proxy_wstunnel.c
===================================================================
--- modules/proxy/mod_proxy_wstunnel.c (revision 1665828)
+++ modules/proxy/mod_proxy_wstunnel.c (working copy)
@@ -91,7 +91,8 @@ static int proxy_wstunnel_canon(request_rec *r, ch
static int proxy_wstunnel_transfer(request_rec *r, conn_rec *c_i, conn_rec *c_o,
- apr_bucket_brigade *bb, char *name)
+ apr_bucket_brigade *bb, char *name,
+ int *sent)
{
int rv;
#ifdef DEBUGGING
@@ -125,6 +126,9 @@ static int proxy_wstunnel_transfer(request_rec *r,
"error on %s - ap_pass_brigade",
name);
}
+ if (sent) {
+ *sent = 1;
+ }
} else if (!APR_STATUS_IS_EAGAIN(rv) && !APR_STATUS_IS_EOF(rv)) {
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, rv, r, APLOGNO(02442)
"error on %s - ap_get_brigade",
@@ -167,6 +171,7 @@ static int proxy_wstunnel_request(apr_pool_t *p, r
char *old_te_val = NULL;
apr_bucket_brigade *bb = apr_brigade_create(p, c->bucket_alloc);
apr_socket_t *client_socket = ap_get_conn_socket(c);
+ int response_sent = 0;
header_brigade = apr_brigade_create(p, backconn->bucket_alloc);
@@ -244,7 +249,8 @@ static int proxy_wstunnel_request(apr_pool_t *p, r
if (pollevent & (APR_POLLIN | APR_POLLHUP)) {
ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r, APLOGNO(02446)
"sock was readable");
- rv = proxy_wstunnel_transfer(r, backconn, c, bb, "sock");
+ rv = proxy_wstunnel_transfer(r, backconn, c, bb, "sock",
+ &response_sent);
}
else if (pollevent & APR_POLLERR) {
rv = APR_EPIPE;
@@ -263,7 +269,8 @@ static int proxy_wstunnel_request(apr_pool_t *p, r
if (pollevent & (APR_POLLIN | APR_POLLHUP)) {
ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r, APLOGNO(02448)
"client was readable");
- rv = proxy_wstunnel_transfer(r, c, backconn, bb, "client");
+ rv = proxy_wstunnel_transfer(r, c, backconn, bb, "client",
+ NULL);
}
else if (pollevent & APR_POLLERR) {
rv = APR_EPIPE;
@@ -292,7 +299,12 @@ static int proxy_wstunnel_request(apr_pool_t *p, r
ap_log_rerror(APLOG_MARK, APLOG_TRACE2, 0, r,
"finished with poll() - cleaning up");
- return OK;
+ if (!response_sent) {
+ return HTTP_BAD_GATEWAY;
+ }
+ else {
+ return OK;
+ }
}
/*