You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by "Conti, Chris" <Ch...@xcellenet.com> on 2003/05/06 16:07:13 UTC
[PATCH] Enable HTTP tunneling for streaming data where data is le
ss than the buffering size
Synopsis: Optionally disable buffering in mod_proxy
We ran into a situation where a command-response protocol was being tunneled
through HTTP (2 sockets 1 is an HTTP GET, the other an HTTP POST) that
failed when passed through an Apache reverse proxy. The HTTP requests are
marked with keep-alive, but when the data passing from the server <
AP_MIN_BYTES_TO_WRITE (8000 decimal) then the bucket brigade buffers the
data instead of passing it on.
The guts of the patch are basically appending a flush bucket after every
read(unless there is already an EOS) if the ProxyWriteThrough directive is
set to On
---------------------------------------------------------
Chris Conti
cmconti@mindspring.com
chris.conti@xcellenet.com
diff -u \ApacheSrc\httpd-2.0.45\modules\proxy\proxy_http.c
\ApacheSrc-orig\httpd-2.0.45\modules\proxy\proxy_http.c
--- \ApacheSrc\httpd-2.0.45\modules\proxy\proxy_http.c 2003-05-02
16:22:53.000000000 -0400
+++ \ApacheSrc-orig\httpd-2.0.45\modules\proxy\proxy_http.c 2003-02-03
10:31:50.000000000 -0500
@@ -956,18 +956,6 @@
/* signal that we must leave */
finish = TRUE;
}
-
- /* do we need to always send the data? */
- if (conf->write_through && !finish){
- apr_off_t readbytes;
- apr_brigade_length(bb, 0, &readbytes);
-
-
- if(0 != readbytes){
- apr_bucket *e =
apr_bucket_flush_create(c->bucket_alloc);
- APR_BRIGADE_INSERT_TAIL(bb, e);
- }
- }
/* try send what we read */
if (ap_pass_brigade(r->output_filters, bb) !=
APR_SUCCESS)
{
diff -u \ApacheSrc\httpd-2.0.45\modules\proxy\mod_proxy.h
\ApacheSrc-orig\httpd-2.0.45\modules\proxy\mod_proxy.h
--- \ApacheSrc\httpd-2.0.45\modules\proxy\mod_proxy.h 2003-04-29
09:20:12.000000000 -0400
+++ \ApacheSrc-orig\httpd-2.0.45\modules\proxy\mod_proxy.h 2003-02-03
10:31:50.000000000 -0500
@@ -201,8 +201,6 @@
bad_body
} badopt; /* how to deal with bad headers */
char badopt_set;
- int write_through;
- char write_through_set;
} proxy_server_conf;
diff -u \ApacheSrc\httpd-2.0.45\modules\proxy\mod_proxy.c
\ApacheSrc-orig\httpd-2.0.45\modules\proxy\mod_proxy.c
--- \ApacheSrc\httpd-2.0.45\modules\proxy\mod_proxy.c 2003-04-29
09:20:12.000000000 -0400
+++ \ApacheSrc-orig\httpd-2.0.45\modules\proxy\mod_proxy.c 2003-02-22
11:38:14.000000000 -0500
@@ -503,8 +503,6 @@
ps->timeout_set = 0;
ps->badopt = bad_error;
ps->badopt_set = 0;
- ps->write_through = 0;
- ps->write_through_set = 0;
return ps;
}
@@ -532,7 +530,6 @@
ps->preserve_host = (overrides->preserve_host_set == 0) ?
base->preserve_host : overrides->preserve_host;
ps->timeout= (overrides->timeout_set == 0) ? base->timeout :
overrides->timeout;
ps->badopt = (overrides->badopt_set == 0) ? base->badopt :
overrides->badopt;
- ps->write_through = (overrides->write_through_set == 0) ?
base->write_through : overrides->write_through;
return ps;
}
@@ -816,16 +813,6 @@
psf->req_set = 1;
return NULL;
}
-static const char*
- set_proxy_writethrough(cmd_parms *parms, void *dummy, int flag)
-{
- proxy_server_conf *psf =
- ap_get_module_config(parms->server->module_config, &proxy_module);
-
- psf->write_through = flag;
- psf->write_through_set = 1;
- return NULL;
-}
static const char *
set_proxy_error_override(cmd_parms *parms, void *dummy, int flag)
{
@@ -1079,8 +1066,6 @@
"This overrides the server timeout"),
AP_INIT_TAKE1("ProxyBadHeader", set_bad_opt, NULL, RSRC_CONF,
"How to handle bad header line in response: IsError | Ignore |
StartBody"),
- AP_INIT_FLAG("ProxyWriteThrough", set_proxy_writethrough, NULL,
RSRC_CONF,
- "on if the data should be not be buffered"),
{NULL}
};