apr_socket_t *sock;
conn_rec *c = r->connection;
conn_rec *backconn;
+ int done = 0;
apr_bucket_brigade *bb = apr_brigade_create(p, c->bucket_alloc);
apr_status_t rv;
r->proto_input_filters = c->input_filters;
/* r->sent_bodyct = 1;*/
- while (1) { /* Infinite loop until error (one side closes the connection) */
- if ((rv = apr_pollset_poll(pollset, -1, &pollcnt, &signalled))
- != APR_SUCCESS) {
+ do { /* Loop until done (one side closes the connection, or an error) */
+ rv = apr_pollset_poll(pollset, -1, &pollcnt, &signalled);
+ if (rv != APR_SUCCESS) {
if (APR_STATUS_IS_EINTR(rv)) {
continue;
}
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01025)
"sock was readable");
#endif
- rv = proxy_connect_transfer(r, backconn, c, bb, "sock");
+ done |= proxy_connect_transfer(r, backconn, c, bb,
+ "sock") != APR_SUCCESS;
}
else if (pollevent & APR_POLLERR) {
- rv = APR_EPIPE;
- backconn->aborted = 1;
ap_log_rerror(APLOG_MARK, APLOG_NOTICE, 0, r, APLOGNO(01026)
"err on backconn");
+ backconn->aborted = 1;
+ done = 1;
}
}
else if (cur->desc.s == client_socket) {
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01027)
"client was readable");
#endif
- rv = proxy_connect_transfer(r, c, backconn, bb, "client");
+ done |= proxy_connect_transfer(r, c, backconn, bb,
+ "client") != APR_SUCCESS;
}
else if (pollevent & APR_POLLERR) {
- rv = APR_EPIPE;
- c->aborted = 1;
ap_log_rerror(APLOG_MARK, APLOG_NOTICE, 0, r, APLOGNO(02827)
"err on client");
+ c->aborted = 1;
+ done = 1;
}
}
else {
- rv = APR_EBADF;
ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, APLOGNO(01028)
"unknown socket in pollset");
+ done = 1;
}
}
- if (rv != APR_SUCCESS) {
- break;
- }
- }
+ } while (!done);
ap_log_rerror(APLOG_MARK, APLOG_TRACE2, 0, r,
"finished with poll() - cleaning up");
}
-static int proxy_wstunnel_transfer(request_rec *r, conn_rec *c_i, conn_rec *c_o,
+static apr_status_t proxy_wstunnel_transfer(request_rec *r, conn_rec *c_i, conn_rec *c_o,
apr_bucket_brigade *bb, char *name)
{
- int rv;
+ apr_status_t rv;
#ifdef DEBUGGING
apr_off_t len;
#endif
if (APR_STATUS_IS_EAGAIN(rv)) {
rv = APR_SUCCESS;
}
-
+
return rv;
}
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 done = 0;
header_brigade = apr_brigade_create(p, backconn->bucket_alloc);
* nothing else is attempted on the connection after returning. */
c->keepalive = AP_CONN_CLOSE;
- while (1) { /* Infinite loop until error (one side closes the connection) */
- if ((rv = apr_pollset_poll(pollset, -1, &pollcnt, &signalled))
- != APR_SUCCESS) {
+ do { /* Loop until done (one side closes the connection, or an error) */
+ rv = apr_pollset_poll(pollset, -1, &pollcnt, &signalled);
+ if (rv != APR_SUCCESS) {
if (APR_STATUS_IS_EINTR(rv)) {
continue;
}
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");
+ done |= proxy_wstunnel_transfer(r, backconn, c, bb,
+ "sock") != APR_SUCCESS;
}
else if (pollevent & APR_POLLERR) {
- rv = APR_EPIPE;
- backconn->aborted = 1;
ap_log_rerror(APLOG_MARK, APLOG_NOTICE, 0, r, APLOGNO(02447)
"error on backconn");
+ backconn->aborted = 1;
+ done = 1;
}
else {
- rv = APR_EGENERAL;
ap_log_rerror(APLOG_MARK, APLOG_NOTICE, 0, r, APLOGNO(02605)
"unknown event on backconn %d", pollevent);
+ done = 1;
}
}
else if (cur->desc.s == client_socket) {
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");
+ done |= proxy_wstunnel_transfer(r, c, backconn, bb,
+ "client") != APR_SUCCESS;
}
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");
+ c->aborted = 1;
+ done = 1;
}
else {
- rv = APR_EGENERAL;
ap_log_rerror(APLOG_MARK, APLOG_NOTICE, 0, r, APLOGNO(02606)
"unknown event on client conn %d", pollevent);
+ done = 1;
}
}
else {
- rv = APR_EBADF;
ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, APLOGNO(02449)
"unknown socket in pollset");
+ done = 1;
}
}
- if (rv != APR_SUCCESS) {
- break;
- }
- }
+ } while (!done);
ap_log_rerror(APLOG_MARK, APLOG_TRACE2, 0, r,
"finished with poll() - cleaning up");