--- /dev/null
+* Updated * (the first version I added here was incomplete, sorry)
+
+This patch works around a couple of problems in the stock 1.3.24 apache
+mod_proxy. The 1.3.24 version would fail to de-chunk a chunked http/1.1
+response for an http/1.0-client, resulting in mysterious hex digits
+spread all over the returned document. Especially in a chain of proxies,
+that would lead to serious problems in the interaction between upstream
+proxies and apache, and the connections would often hang.
+
+The patch is a snapshot of the current development version 1.3.25-dev
+(as of 18-Apr-2002), and contains a lot of whitespace reformatting.
+Sorry for that, but the layout was standardized using indent, so as
+to ease future maintenance.
+
+It has been tested in an intranet environment, both using direct
+connections and ProxyRemote connections, and with both http and
+https.
+
+The patch should apply cleanly against version apache-1.3.24
+
+If you have questions, please contact martin at apache dot org, who
+supplied this patch file. Thank you.
+
+ Martin
+
+
+How-to-apply:
+
+$ gzip -dc apache_1.3.24.tar.gz | tar xvf -
+$ cd apache_1.3.24/src
+$ patch -p0 </tmp/proxy_http1.1_chunking.patch
+
+
+Index: main/http_protocol.c
+===================================================================
+RCS file: /home/cvs/apache-1.3/src/main/http_protocol.c,v
+retrieving revision 1.312
+retrieving revision 1.314
+diff -u -b -u -r1.312 -r1.314
+--- main/http_protocol.c 21 Mar 2002 14:49:46 -0000 1.312
++++ main/http_protocol.c 6 Apr 2002 14:31:05 -0000 1.314
+@@ -857,13 +857,13 @@
+ * then the actual input line exceeded the buffer length,
+ * and it would be a good idea for the caller to puke 400 or 414.
+ */
+-static int getline(char *s, int n, BUFF *in, int fold)
++API_EXPORT(int) ap_getline(char *s, int n, BUFF *in, int fold)
+ {
+ char *pos, next;
+ int retval;
+ int total = 0;
+ #ifdef CHARSET_EBCDIC
+- /* When getline() is called, the HTTP protocol is in a state
++ /* When ap_getline() is called, the HTTP protocol is in a state
+ * where we MUST be reading "plain text" protocol stuff,
+ * (Request line, MIME headers, Chunk sizes) regardless of
+ * the MIME type and conversion setting of the document itself.
+@@ -978,7 +978,7 @@
+
+ static int read_request_line(request_rec *r)
+ {
+- char l[DEFAULT_LIMIT_REQUEST_LINE + 2]; /* getline's two extra for \n\0 */
++ char l[DEFAULT_LIMIT_REQUEST_LINE + 2]; /* ap_getline's two extra for \n\0 */
+ const char *ll = l;
+ const char *uri;
+ conn_rec *conn = r->connection;
+@@ -1000,7 +1000,7 @@
+ * have to block during a read.
+ */
+ ap_bsetflag(conn->client, B_SAFEREAD, 1);
+- while ((len = getline(l, sizeof(l), conn->client, 0)) <= 0) {
++ while ((len = ap_getline(l, sizeof(l), conn->client, 0)) <= 0) {
+ if ((len < 0) || ap_bgetflag(conn->client, B_EOF)) {
+ ap_bsetflag(conn->client, B_SAFEREAD, 0);
+ /* this is a hack to make sure that request time is set,
+@@ -1031,7 +1031,7 @@
+
+ ap_parse_uri(r, uri);
+
+- /* getline returns (size of max buffer - 1) if it fills up the
++ /* ap_getline returns (size of max buffer - 1) if it fills up the
+ * buffer before finding the end-of-line. This is only going to
+ * happen if it exceeds the configured limit for a request-line.
+ */
+@@ -1056,7 +1056,7 @@
+
+ static void get_mime_headers(request_rec *r)
+ {
+- char field[DEFAULT_LIMIT_REQUEST_FIELDSIZE + 2]; /* getline's two extra */
++ char field[DEFAULT_LIMIT_REQUEST_FIELDSIZE + 2]; /* ap_getline's two extra */
+ conn_rec *c = r->connection;
+ char *value;
+ char *copy;
+@@ -1071,7 +1071,7 @@
+ * Read header lines until we get the empty separator line, a read error,
+ * the connection closes (EOF), reach the server limit, or we timeout.
+ */
+- while ((len = getline(field, sizeof(field), c->client, 1)) > 0) {
++ while ((len = ap_getline(field, sizeof(field), c->client, 1)) > 0) {
+
+ if (r->server->limit_req_fields &&
+ (++fields_read > r->server->limit_req_fields)) {
+@@ -1081,7 +1081,7 @@
+ "this server's limit.<P>\n");
+ return;
+ }
+- /* getline returns (size of max buffer - 1) if it fills up the
++ /* ap_getline returns (size of max buffer - 1) if it fills up the
+ * buffer before finding the end-of-line. This is only going to
+ * happen if it exceeds the configured limit for a field size.
+ */
+@@ -1513,7 +1513,6 @@
+ API_EXPORT(void) ap_basic_http_header(request_rec *r)
+ {
+ char *protocol;
+- const char *server;
+
+ if (r->assbackwards)
+ return;
+@@ -1542,11 +1541,14 @@
+ /* output the date header */
+ ap_send_header_field(r, "Date", ap_gm_timestr_822(r->pool, r->request_time));
+
+- /* keep a previously set server header (possible from proxy), otherwise
++ /* keep the set-by-proxy server header, otherwise
+ * generate a new server header */
+- if (server = ap_table_get(r->headers_out, "Server")) {
++ if (r->proxyreq) {
++ const char *server = ap_table_get(r->headers_out, "Server");
++ if (server) {
+ ap_send_header_field(r, "Server", server);
+ }
++ }
+ else {
+ ap_send_header_field(r, "Server", ap_get_server_version());
+ }
+@@ -2016,7 +2018,7 @@
+ return 1;
+ }
+
+-static long get_chunk_size(char *b)
++API_EXPORT(long) ap_get_chunk_size(char *b)
+ {
+ long chunksize = 0;
+
+@@ -2098,14 +2100,14 @@
+
+ if (r->remaining == 0) { /* Start of new chunk */
+
+- chunk_start = getline(buffer, bufsiz, r->connection->client, 0);
++ chunk_start = ap_getline(buffer, bufsiz, r->connection->client, 0);
+ if ((chunk_start <= 0) || (chunk_start >= (bufsiz - 1))
+ || !ap_isxdigit(*buffer)) {
+ r->connection->keepalive = -1;
+ return -1;
+ }
+
+- len_to_read = get_chunk_size(buffer);
++ len_to_read = ap_get_chunk_size(buffer);
+
+ if (len_to_read == 0) { /* Last chunk indicated, get footers */
+ if (r->read_body == REQUEST_CHUNKED_DECHUNK) {
+@@ -2139,7 +2141,7 @@
+ len_read = chunk_start;
+
+ while ((bufsiz > 1) && ((len_read =
+- getline(buffer, bufsiz, r->connection->client, 1)) > 0)) {
++ ap_getline(buffer, bufsiz, r->connection->client, 1)) > 0)) {
+
+ if (len_read != (bufsiz - 1)) {
+ buffer[len_read++] = CR; /* Restore footer line end */
+Index: modules/proxy/mod_proxy.c
+===================================================================
+RCS file: /home/cvs/apache-1.3/src/modules/proxy/mod_proxy.c,v
+retrieving revision 1.80
+retrieving revision 1.81
+diff -u -b -u -r1.80 -r1.81
+--- modules/proxy/mod_proxy.c 13 Mar 2002 21:05:32 -0000 1.80
++++ modules/proxy/mod_proxy.c 25 Mar 2002 09:21:58 -0000 1.81
+@@ -99,8 +99,9 @@
+
+ while (aliasp < end_fakename) {
+ if (*aliasp == '/') {
+- /* any number of '/' in the alias matches any number in
+- * the supplied URI, but there must be at least one...
++ /*
++ * any number of '/' in the alias matches any number in the
++ * supplied URI, but there must be at least one...
+ */
+ if (*urip != '/')
+ return 0;
+@@ -122,9 +123,9 @@
+ if (aliasp[-1] != '/' && *urip != '\0' && *urip != '/')
+ return 0;
+
+- /* Return number of characters from URI which matched (may be
+- * greater than length of alias, since we may have matched
+- * doubled slashes)
++ /*
++ * Return number of characters from URI which matched (may be greater
++ * than length of alias, since we may have matched doubled slashes)
+ */
+
+ return urip - uri;
+@@ -146,7 +147,7 @@
+ void *sconf = r->server->module_config;
+ proxy_server_conf *conf;
+
+- conf = (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module);
++ conf = (proxy_server_conf *)ap_get_module_config(sconf, &proxy_module);
+
+ if (conf->req && r->parsed_uri.scheme) {
+ /* but it might be something vhosted */
+@@ -176,20 +177,22 @@
+ {
+ void *sconf = r->server->module_config;
+ proxy_server_conf *conf =
+- (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module);
++ (proxy_server_conf *)ap_get_module_config(sconf, &proxy_module);
+ int i, len;
+- struct proxy_alias *ent = (struct proxy_alias *) conf->aliases->elts;
++ struct proxy_alias *ent = (struct proxy_alias *)conf->aliases->elts;
+
+ if (r->proxyreq != NOT_PROXY) {
+- /* someone has already set up the proxy, it was possibly ourselves
+- * in proxy_detect
++ /*
++ * someone has already set up the proxy, it was possibly ourselves in
++ * proxy_detect
+ */
+ return OK;
+ }
+
+- /* XXX: since r->uri has been manipulated already we're not really
+- * compliant with RFC1945 at this point. But this probably isn't
+- * an issue because this is a hybrid proxy/origin server.
++ /*
++ * XXX: since r->uri has been manipulated already we're not really
++ * compliant with RFC1945 at this point. But this probably isn't an
++ * issue because this is a hybrid proxy/origin server.
+ */
+
+ for (i = 0; i < conf->aliases->nelts; i++) {
+@@ -272,7 +275,7 @@
+ UNP_REVEALPASSWORD);
+
+ ap_table_set(r->headers_out, "Location", nuri);
+- ap_log_rerror(APLOG_MARK, APLOG_INFO|APLOG_NOERRNO, r,
++ ap_log_rerror(APLOG_MARK, APLOG_INFO | APLOG_NOERRNO, r,
+ "Domain missing: %s sent to %s%s%s", r->uri,
+ ap_unparse_uri_components(r->pool, &r->parsed_uri,
+ UNP_OMITUSERINFO),
+@@ -289,7 +292,7 @@
+ char *url, *scheme, *p;
+ void *sconf = r->server->module_config;
+ proxy_server_conf *conf =
+- (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module);
++ (proxy_server_conf *)ap_get_module_config(sconf, &proxy_module);
+ array_header *proxies = conf->proxies;
+ struct proxy_remote *ents = (struct proxy_remote *) proxies->elts;
+ int i, rc;
+@@ -313,7 +316,7 @@
+ return OK;
+ }
+ ap_table_setn(r->headers_in, "Max-Forwards",
+- ap_psprintf(r->pool, "%ld", (maxfwd > 0) ? maxfwd-1 : 0));
++ ap_psprintf(r->pool, "%ld", (maxfwd > 0) ? maxfwd - 1 : 0));
+ }
+
+ if ((rc = ap_setup_client_block(r, REQUEST_CHUNKED_ERROR)))
+@@ -343,16 +346,16 @@
+ /* Check URI's destination host against NoProxy hosts */
+ /* Bypass ProxyRemote server lookup if configured as NoProxy */
+ /* we only know how to handle communication to a proxy via http */
+- /*if (strcasecmp(scheme, "http") == 0) */
++ /* if (strcasecmp(scheme, "http") == 0) */
+ {
+ int ii;
+- struct dirconn_entry *list = (struct dirconn_entry *) conf->dirconn->elts;
++ struct dirconn_entry *list = (struct dirconn_entry *)conf->dirconn->elts;
+
+ for (direct_connect = ii = 0; ii < conf->dirconn->nelts && !direct_connect; ii++) {
+ direct_connect = list[ii].matcher(&list[ii], r);
+ }
+ #if DEBUGGING
+- ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r,
++ ap_log_rerror(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r,
+ (direct_connect) ? "NoProxy for %s" : "UseProxy for %s",
+ r->uri);
+ #endif
+@@ -367,8 +370,9 @@
+ (p == NULL && strcasecmp(scheme, ents[i].scheme) == 0) ||
+ (p != NULL &&
+ strncasecmp(url, ents[i].scheme, strlen(ents[i].scheme)) == 0)) {
+- /* CONNECT is a special method that bypasses the normal
+- * proxy code.
++ /*
++ * CONNECT is a special method that bypasses the normal proxy
++ * code.
+ */
+ if (r->method_number == M_CONNECT)
+ rc = ap_proxy_connect_handler(r, cr, url, ents[i].hostname,
+@@ -422,7 +426,8 @@
+ ps->viaopt_set = 0; /* 0 means default */
+ ps->req = 0;
+ ps->req_set = 0;
+- ps->recv_buffer_size = 0; /* this default was left unset for some reason */
++ ps->recv_buffer_size = 0; /* this default was left unset for some
++ * reason */
+ ps->recv_buffer_size_set = 0;
+ ps->io_buffer_size = IOBUFSIZE;
+ ps->io_buffer_size_set = 0;
+@@ -454,8 +459,8 @@
+ void *overridesv)
+ {
+ proxy_server_conf *ps = ap_pcalloc(p, sizeof(proxy_server_conf));
+- proxy_server_conf *base = (proxy_server_conf *) basev;
+- proxy_server_conf *overrides = (proxy_server_conf *) overridesv;
++ proxy_server_conf *base = (proxy_server_conf *)basev;
++ proxy_server_conf *overrides = (proxy_server_conf *)overridesv;
+
+ ps->proxies = ap_append_arrays(p, base->proxies, overrides->proxies);
+ ps->aliases = ap_append_arrays(p, base->aliases, overrides->aliases);
+@@ -490,7 +495,7 @@
+ {
+ server_rec *s = cmd->server;
+ proxy_server_conf *conf =
+- (proxy_server_conf *) ap_get_module_config(s->module_config, &proxy_module);
++ (proxy_server_conf *)ap_get_module_config(s->module_config, &proxy_module);
+ struct proxy_remote *new;
+ char *p, *q;
+ int port;
+@@ -532,7 +537,7 @@
+ {
+ server_rec *s = cmd->server;
+ proxy_server_conf *conf =
+- (proxy_server_conf *) ap_get_module_config(s->module_config, &proxy_module);
++ (proxy_server_conf *)ap_get_module_config(s->module_config, &proxy_module);
+ struct proxy_alias *new;
+
+ new = ap_push_array(conf->aliases);
+@@ -579,7 +584,10 @@
+ new->name = arg;
+ /* Don't do name lookups on things that aren't dotted */
+ if (strchr(arg, '.') != NULL && ap_proxy_host2addr(new->name, &hp) == NULL)
+- /*@@@FIXME: This copies only the first of (possibly many) IP addrs */
++ /*
++ * @@@FIXME: This copies only the first of (possibly many) IP
++ * addrs
++ */
+ memcpy(&new->addr, hp.h_addr, sizeof(struct in_addr));
+ else
+ new->addr.s_addr = 0;
+@@ -616,7 +624,7 @@
+ proxy_server_conf *conf =
+ ap_get_module_config(s->module_config, &proxy_module);
+ struct dirconn_entry *New;
+- struct dirconn_entry *list = (struct dirconn_entry *) conf->dirconn->elts;
++ struct dirconn_entry *list = (struct dirconn_entry *)conf->dirconn->elts;
+ int found = 0;
+ int i;
+
+@@ -733,7 +741,7 @@
+
+ if (sscanf(arg, "%lg", &val) != 1)
+ return "CacheMaxExpire value must be a float";
+- psf->cache.maxexpire = (int) (val * (double) SEC_ONE_HR);
++ psf->cache.maxexpire = (int)(val * (double)SEC_ONE_HR);
+ psf->cache.maxexpire_set = 1;
+ return NULL;
+ }
+@@ -747,7 +755,7 @@
+
+ if (sscanf(arg, "%lg", &val) != 1)
+ return "CacheDefaultExpire value must be a float";
+- psf->cache.defaultexpire = (int) (val * (double) SEC_ONE_HR);
++ psf->cache.defaultexpire = (int)(val * (double)SEC_ONE_HR);
+ psf->cache.defaultexpire_set = 1;
+ return NULL;
+ }
+@@ -761,7 +769,7 @@
+
+ if (sscanf(arg, "%lg", &val) != 1)
+ return "CacheGcInterval value must be a float";
+- psf->cache.gcinterval = (int) (val * (double) SEC_ONE_HR);
++ psf->cache.gcinterval = (int)(val * (double)SEC_ONE_HR);
+ psf->cache.gcinterval_set = 1;
+ return NULL;
+ }
+@@ -823,7 +831,10 @@
+ new->name = arg;
+ /* Don't do name lookups on things that aren't dotted */
+ if (strchr(arg, '.') != NULL && ap_proxy_host2addr(new->name, &hp) == NULL)
+- /*@@@FIXME: This copies only the first of (possibly many) IP addrs */
++ /*
++ * @@@FIXME: This copies only the first of (possibly many) IP
++ * addrs
++ */
+ memcpy(&new->addr, hp.h_addr, sizeof(struct in_addr));
+ else
+ new->addr.s_addr = 0;
+@@ -858,7 +869,7 @@
+ return NULL;
+ }
+
+-static const char*
++static const char *
+ set_cache_completion(cmd_parms *parms, void *dummy, char *arg)
+ {
+ proxy_server_conf *psf =
+@@ -876,7 +887,7 @@
+ return NULL;
+ }
+
+-static const char*
++static const char *
+ set_via_opt(cmd_parms *parms, void *dummy, char *arg)
+ {
+ proxy_server_conf *psf =
+@@ -974,5 +985,3 @@
+ NULL, /* child_exit */
+ proxy_detect /* post read-request */
+ };
+-
+-
+Index: modules/proxy/mod_proxy.h
+===================================================================
+RCS file: /home/cvs/apache-1.3/src/modules/proxy/mod_proxy.h,v
+retrieving revision 1.57
+retrieving revision 1.58
+diff -u -b -u -r1.57 -r1.58
+--- modules/proxy/mod_proxy.h 13 Mar 2002 21:05:32 -0000 1.57
++++ modules/proxy/mod_proxy.h 7 Apr 2002 18:57:36 -0000 1.58
+@@ -297,7 +297,7 @@
+ char **passwordp, char **hostp, int *port);
+ const char *ap_proxy_date_canon(pool *p, const char *x);
+ table *ap_proxy_read_headers(request_rec *r, char *buffer, int size, BUFF *f);
+-long int ap_proxy_send_fb(BUFF *f, request_rec *r, cache_req *c, off_t len, int nowrite, size_t recv_buffer_size);
++long int ap_proxy_send_fb(BUFF *f, request_rec *r, cache_req *c, off_t len, int nowrite, int chunked, size_t recv_buffer_size);
+ void ap_proxy_write_headers(cache_req *c, const char *respline, table *t);
+ int ap_proxy_liststr(const char *list, const char *key, char **val);
+ void ap_proxy_hash(const char *it, char *val, int ndepth, int nlength);
+Index: modules/proxy/proxy_cache.c
+===================================================================
+RCS file: /home/cvs/apache-1.3/src/modules/proxy/proxy_cache.c,v
+retrieving revision 1.81
+retrieving revision 1.86
+diff -u -b -u -r1.81 -r1.86
+--- modules/proxy/proxy_cache.c 13 Mar 2002 21:05:32 -0000 1.81
++++ modules/proxy/proxy_cache.c 12 Apr 2002 12:34:46 -0000 1.86
+@@ -135,14 +135,14 @@
+ {
+ static int inside = 0;
+
+- (void) ap_acquire_mutex(garbage_mutex);
++ (void)ap_acquire_mutex(garbage_mutex);
+ if (inside == 1) {
+- (void) ap_release_mutex(garbage_mutex);
++ (void)ap_release_mutex(garbage_mutex);
+ return;
+ }
+ else
+ inside = 1;
+- (void) ap_release_mutex(garbage_mutex);
++ (void)ap_release_mutex(garbage_mutex);
+
+ ap_block_alarms(); /* avoid SIGALRM on big cache cleanup */
+ if (should_proxy_garbage_coll(r))
+@@ -153,14 +153,13 @@
+ #endif
+ ap_unblock_alarms();
+
+- (void) ap_acquire_mutex(garbage_mutex);
++ (void)ap_acquire_mutex(garbage_mutex);
+ inside = 0;
+- (void) ap_release_mutex(garbage_mutex);
++ (void)ap_release_mutex(garbage_mutex);
+ }
+
+
+-static void
+-add_long61 (long61_t *accu, long val)
++static void add_long61(long61_t *accu, long val)
+ {
+ /* Add in lower 30 bits */
+ accu->lower += (val & 0x3FFFFFFFL);
+@@ -170,8 +169,7 @@
+ accu->lower &= 0x3FFFFFFFL;
+ }
+
+-static void
+-sub_long61 (long61_t *accu, long val)
++static void sub_long61(long61_t *accu, long val)
+ {
+ int carry = (val & 0x3FFFFFFFL) > accu->lower;
+ /* Subtract lower 30 bits */
+@@ -185,8 +183,7 @@
+ * return 0 when left == right
+ * return >0 when left > right
+ */
+-static long
+-cmp_long61 (long61_t *left, long61_t *right)
++static long cmp_long61(long61_t *left, long61_t *right)
+ {
+ return (left->upper == right->upper) ? (left->lower - right->lower)
+ : (left->upper - right->upper);
+@@ -282,7 +279,7 @@
+ {
+ void *sconf = r->server->module_config;
+ proxy_server_conf *pconf =
+- (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module);
++ (proxy_server_conf *)ap_get_module_config(sconf, &proxy_module);
+ const struct cache_conf *conf = &pconf->cache;
+
+ const char *cachedir = conf->root;
+@@ -295,27 +292,29 @@
+ if (cachedir == NULL || every == -1)
+ return 0;
+
+- filename = ap_palloc(r->pool, strlen(cachedir) + strlen( DOT_TIME ) +1);
++ filename = ap_palloc(r->pool, strlen(cachedir) + strlen(DOT_TIME) + 1);
+
+ garbage_now = time(NULL);
+- /* Usually, the modification time of <cachedir>/.time can only increase.
++ /*
++ * Usually, the modification time of <cachedir>/.time can only increase.
+ * Thus, even with several child processes having their own copy of
+- * lastcheck, if time(NULL) still < lastcheck then it's not time
+- * for GC yet.
++ * lastcheck, if time(NULL) still < lastcheck then it's not time for GC
++ * yet.
+ */
+ if (garbage_now != -1 && lastcheck != BAD_DATE && garbage_now < lastcheck + every)
+ return 0;
+
+- strcpy(filename,cachedir);
+- strcat(filename,DOT_TIME);
++ strcpy(filename, cachedir);
++ strcat(filename, DOT_TIME);
+
+- /* At this point we have a bit of an engineering compromise. We could either
+- * create and/or mark the .time file (prior to the fork which might
+- * fail on a resource issue) or wait until we are safely forked. The
+- * advantage of doing it now in this process is that we get some
+- * usefull live out of the global last check variable. (XXX which
+- * should go scoreboard IMHO.) Note that the actual counting is
+- * at a later moment.
++ /*
++ * At this point we have a bit of an engineering compromise. We could
++ * either create and/or mark the .time file (prior to the fork which
++ * might fail on a resource issue) or wait until we are safely forked.
++ * The advantage of doing it now in this process is that we get some
++ * usefull live out of the global last check variable. (XXX which should
++ * go scoreboard IMHO.) Note that the actual counting is at a later
++ * moment.
+ */
+ if (stat(filename, &buf) == -1) { /* does not exist */
+ if (errno != ENOENT) {
+@@ -351,7 +350,7 @@
+ const char *cachedir;
+ void *sconf = r->server->module_config;
+ proxy_server_conf *pconf =
+- (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module);
++ (proxy_server_conf *)ap_get_module_config(sconf, &proxy_module);
+ const struct cache_conf *conf = &pconf->cache;
+ array_header *files;
+ struct gc_ent *fent;
+@@ -372,9 +371,9 @@
+ sub_garbage_coll(r, files, cachedir, "/");
+
+ if (cmp_long61(&curbytes, &cachesize) < 0L) {
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server,
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server,
+ "proxy GC: Cache is %ld%% full (nothing deleted)",
+- (long)(((curbytes.upper<<20)|(curbytes.lower>>10))*100/conf->space));
++ (long)(((curbytes.upper << 20) | (curbytes.lower >> 10)) * 100 / conf->space));
+ ap_unblock_alarms();
+ return;
+ }
+@@ -385,7 +384,7 @@
+ for (i = 0; i < files->nelts; i++) {
+ fent = &((struct gc_ent *) files->elts)[i];
+ sprintf(filename, "%s%s", cachedir, fent->file);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "GC Unlinking %s (expiry %ld, garbage_now %ld)", filename, (long)fent->expire, (long)garbage_now);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "GC Unlinking %s (expiry %ld, garbage_now %ld)", filename, (long)fent->expire, (long)garbage_now);
+ #if TESTING
+ fprintf(stderr, "Would unlink %s\n", filename);
+ #else
+@@ -403,16 +402,16 @@
+ }
+ }
+
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server,
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server,
+ "proxy GC: Cache is %ld%% full (%d deleted)",
+- (long)(((curbytes.upper<<20)|(curbytes.lower>>10))*100/conf->space), i);
++ (long)(((curbytes.upper << 20) | (curbytes.lower >> 10)) * 100 / conf->space), i);
+ ap_unblock_alarms();
+ }
+
+ static int sub_garbage_coll(request_rec *r, array_header *files,
+ const char *cachebasedir, const char *cachesubdir)
+ {
+- char line[17*(3)];
++ char line[17 * (3)];
+ char cachedir[HUGE_STRING_LEN];
+ struct stat buf;
+ int fd, i;
+@@ -428,7 +427,7 @@
+
+ ap_snprintf(cachedir, sizeof(cachedir), "%s%s", cachebasedir, cachesubdir);
+ filename = ap_palloc(r->pool, strlen(cachedir) + HASH_LEN + 2);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "GC Examining directory %s", cachedir);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "GC Examining directory %s", cachedir);
+ dir = opendir(cachedir);
+ if (dir == NULL) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+@@ -440,7 +439,7 @@
+ if (ent->d_name[0] == '.')
+ continue;
+ sprintf(filename, "%s%s", cachedir, ent->d_name);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "GC Examining file %s", filename);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "GC Examining file %s", filename);
+ /* is it a temporary file? */
+ if (strncmp(ent->d_name, "tmp", 3) == 0) {
+ /* then stat it to see how old it is; delete temporary files > 1 day old */
+@@ -451,8 +450,8 @@
+ }
+ else if (garbage_now != -1 && buf.st_atime < garbage_now - SEC_ONE_DAY &&
+ buf.st_mtime < garbage_now - SEC_ONE_DAY) {
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "GC unlink %s", filename);
+- ap_log_error(APLOG_MARK, APLOG_INFO|APLOG_NOERRNO, r->server,
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "GC unlink %s", filename);
++ ap_log_error(APLOG_MARK, APLOG_INFO | APLOG_NOERRNO, r->server,
+ "proxy gc: deleting orphaned cache file %s", filename);
+ #if TESTING
+ fprintf(stderr, "Would unlink %s\n", filename);
+@@ -472,15 +471,16 @@
+ #if defined(OS2) || defined(TPF)
+ /* is it a directory? */
+ #ifdef OS2
+- if (ent->d_attr & A_DIR) {
++ if (ent->d_attr & A_DIR)
+ #elif defined(TPF)
+ if (stat(filename, &buf) == -1) {
+ if (errno != ENOENT)
+ ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ "proxy gc: stat(%s)", filename);
+ }
+- if (S_ISDIR(buf.st_mode)) {
++ if (S_ISDIR(buf.st_mode))
+ #endif
++ {
+ char newcachedir[HUGE_STRING_LEN];
+ ap_snprintf(newcachedir, sizeof(newcachedir),
+ "%s%s/", cachesubdir, ent->d_name);
+@@ -500,9 +500,9 @@
+
+ /* read the file */
+ #if defined(WIN32)
+- /* On WIN32 open does not work for directories,
+- * so we us stat instead of fstat to determine
+- * if the file is a directory
++ /*
++ * On WIN32 open does not work for directories, so we us stat instead
++ * of fstat to determine if the file is a directory
+ */
+ if (stat(filename, &buf) == -1) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+@@ -545,7 +545,8 @@
+ rmdir(newcachedir);
+ #endif
+ --nfiles;
+- } else {
++ }
++ else {
+ /* Directory is not empty. Account for its size: */
+ add_long61(&curbytes, ROUNDUP2BLOCKS(buf.st_size));
+ }
+@@ -554,7 +555,8 @@
+ #endif
+
+ #if defined(WIN32)
+- /* Since we have determined above that the file is not a directory,
++ /*
++ * Since we have determined above that the file is not a directory,
+ * it should be safe to open it now
+ */
+ fd = open(filename, O_RDONLY | O_BINARY);
+@@ -566,7 +568,7 @@
+ }
+ #endif
+
+- i = read(fd, line, 17*(3)-1);
++ i = read(fd, line, 17 * (3) - 1);
+ close(fd);
+ if (i == -1) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+@@ -574,13 +576,13 @@
+ continue;
+ }
+ line[i] = '\0';
+- garbage_expire = ap_proxy_hex2sec(line + 17*(2));
++ garbage_expire = ap_proxy_hex2sec(line + 17 * (2));
+ if (!ap_checkmask(line, "&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&") ||
+ garbage_expire == BAD_DATE) {
+ /* bad file */
+ if (garbage_now != -1 && buf.st_atime > garbage_now + SEC_ONE_DAY &&
+ buf.st_mtime > garbage_now + SEC_ONE_DAY) {
+- ap_log_error(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, r->server,
++ ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_NOERRNO, r->server,
+ "proxy: deleting bad cache file with future date: %s", filename);
+ #if TESTING
+ fprintf(stderr, "Would unlink bad file %s\n", filename);
+@@ -632,29 +634,28 @@
+
+ /* read the data from the cache file */
+
+- /* Format:
++ /*
++ * Format:
+ *
+- * The cache needs to keep track of the following information:
+- * - Date, LastMod, Version, ReqTime, RespTime, ContentLength
+- * - The original request headers (for Vary)
+- * - The original response headers (for returning with a cached response)
+- * - The body of the message
+- *
+- * date SP lastmod SP expire SP count SP request-time SP response-time SP content-lengthCRLF
+- * (dates are stored as hex seconds since 1970)
+- * Original URLCRLF
+- * Original Request Headers
+- * CRLF
+- * Original Response Headers
+- * CRLF
+- * Body
++ * The cache needs to keep track of the following information: - Date,
++ * LastMod, Version, ReqTime, RespTime, ContentLength - The original
++ * request headers (for Vary) - The original response headers (for
++ * returning with a cached response) - The body of the message
++ *
++ * date SP lastmod SP expire SP count SP request-time SP response-time SP
++ * content-lengthCRLF (dates are stored as hex seconds since 1970)
++ * Original URLCRLF Original Request Headers CRLF Original Response
++ * Headers CRLF Body
+ *
+ */
+
+ /* retrieve cachefile information values */
+ len = ap_bgets(urlbuff, sizeof urlbuff, cachefp);
+- if (len == -1)
++ if (len == -1) {
++ /* Delete broken cache file */
++ unlink(c->filename);
+ return -1;
++ }
+ if (len == 0 || urlbuff[len - 1] != '\n')
+ return 0;
+ urlbuff[len - 1] = '\0';
+@@ -663,18 +664,21 @@
+ "&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&"))
+ return 0;
+
+- c->date = ap_proxy_hex2sec(urlbuff + 17*(0));
+- c->lmod = ap_proxy_hex2sec(urlbuff + 17*(1));
+- c->expire = ap_proxy_hex2sec(urlbuff + 17*(2));
+- c->version = ap_proxy_hex2sec(urlbuff + 17*(3));
+- c->req_time = ap_proxy_hex2sec(urlbuff + 17*(4));
+- c->resp_time = ap_proxy_hex2sec(urlbuff + 17*(5));
+- c->len = ap_proxy_hex2sec(urlbuff + 17*(6));
++ c->date = ap_proxy_hex2sec(urlbuff + 17 * (0));
++ c->lmod = ap_proxy_hex2sec(urlbuff + 17 * (1));
++ c->expire = ap_proxy_hex2sec(urlbuff + 17 * (2));
++ c->version = ap_proxy_hex2sec(urlbuff + 17 * (3));
++ c->req_time = ap_proxy_hex2sec(urlbuff + 17 * (4));
++ c->resp_time = ap_proxy_hex2sec(urlbuff + 17 * (5));
++ c->len = ap_proxy_hex2sec(urlbuff + 17 * (6));
+
+ /* check that we have the same URL */
+ len = ap_bgets(urlbuff, sizeof urlbuff, cachefp);
+- if (len == -1)
++ if (len == -1) {
++ /* Delete broken cache file */
++ unlink(c->filename);
+ return -1;
++ }
+ if (len == 0 || strncmp(urlbuff, "X-URL: ", 7) != 0 ||
+ urlbuff[len - 1] != '\n')
+ return 0;
+@@ -684,13 +688,19 @@
+
+ /* then the original request headers */
+ c->req_hdrs = ap_proxy_read_headers(r, urlbuff, sizeof urlbuff, cachefp);
+- if (c->req_hdrs == NULL)
++ if (c->req_hdrs == NULL) {
++ /* Delete broken cache file */
++ unlink(c->filename);
+ return -1;
++ }
+
+ /* then the original response headers */
+ len = ap_bgets(urlbuff, sizeof urlbuff, cachefp);
+- if (len == -1)
++ if (len == -1) {
++ /* Delete broken cache file */
++ unlink(c->filename);
+ return -1;
++ }
+ if (len == 0 || urlbuff[len - 1] != '\n')
+ return 0;
+ urlbuff[--len] = '\0';
+@@ -702,8 +712,11 @@
+
+ c->status = atoi(strp);
+ c->hdrs = ap_proxy_read_headers(r, urlbuff, sizeof urlbuff, cachefp);
+- if (c->hdrs == NULL)
++ if (c->hdrs == NULL) {
++ /* Delete broken cache file */
++ unlink(c->filename);
+ return -1;
++ }
+ if (c->len != -1) /* add a content-length header */
+ if (ap_table_get(c->hdrs, "Content-Length") == NULL) {
+ ap_table_set(c->hdrs, "Content-Length",
+@@ -735,52 +748,53 @@
+ /* check for If-Match, If-Unmodified-Since */
+ while (1) {
+
+- /* check If-Match and If-Unmodified-Since exist
++ /*
++ * check If-Match and If-Unmodified-Since exist
+ *
+- * If neither of these exist, the request is not conditional, and
+- * we serve it normally
++ * If neither of these exist, the request is not conditional, and we
++ * serve it normally
+ */
+ if (!c->im && BAD_DATE == c->ius) {
+ break;
+ }
+
+- /* check If-Match
++ /*
++ * check If-Match
+ *
+- * we check if the Etag on the cached file is in the list of Etags
+- * in the If-Match field. The comparison must be a strong comparison,
+- * so the Etag cannot be marked as weak. If the comparision fails
+- * we return 412 Precondition Failed.
+- *
+- * if If-Match is specified AND
+- * If-Match is not a "*" AND
+- * Etag is missing or weak or not in the list THEN
+- * return 412 Precondition Failed
++ * we check if the Etag on the cached file is in the list of Etags in
++ * the If-Match field. The comparison must be a strong comparison, so
++ * the Etag cannot be marked as weak. If the comparision fails we
++ * return 412 Precondition Failed.
++ *
++ * if If-Match is specified AND If-Match is not a "*" AND Etag is
++ * missing or weak or not in the list THEN return 412 Precondition
++ * Failed
+ */
+
+ if (c->im) {
+ if (strcmp(c->im, "*") &&
+ (!etag || (strlen(etag) > 1 && 'W' == etag[0] && '/' == etag[1]) || !ap_proxy_liststr(c->im, etag, NULL))) {
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "If-Match specified, and it didn't - return 412");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "If-Match specified, and it didn't - return 412");
+ }
+ else {
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "If-Match specified, and it matched");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "If-Match specified, and it matched");
+ break;
+ }
+ }
+
+- /* check If-Unmodified-Since
++ /*
++ * check If-Unmodified-Since
+ *
+- * if If-Unmodified-Since is specified AND
+- * Last-Modified is specified somewhere AND
+- * If-Unmodified-Since is in the past compared to Last-Modified THEN
+- * return 412 Precondition Failed
++ * if If-Unmodified-Since is specified AND Last-Modified is specified
++ * somewhere AND If-Unmodified-Since is in the past compared to
++ * Last-Modified THEN return 412 Precondition Failed
+ */
+ if (BAD_DATE != c->ius && BAD_DATE != c->lmod) {
+ if (c->ius < c->lmod) {
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "If-Unmodified-Since specified, but it wasn't - return 412");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "If-Unmodified-Since specified, but it wasn't - return 412");
+ }
+ else {
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "If-Unmodified-Since specified, and it was unmodified");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "If-Unmodified-Since specified, and it was unmodified");
+ break;
+ }
+ }
+@@ -788,13 +802,13 @@
+ /* if cache file is being updated */
+ if (c->origfp) {
+ ap_proxy_write_headers(c, c->resp_line, c->hdrs);
+- ap_proxy_send_fb(c->origfp, r, c, c->len, 1, IOBUFSIZE);
++ ap_proxy_send_fb(c->origfp, r, c, c->len, 1, 0, IOBUFSIZE);
+ ap_proxy_cache_tidy(c);
+ }
+ else
+ ap_pclosef(r->pool, ap_bfileno(cachefp, B_WR));
+
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Use your cached copy, conditional precondition failed.");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Use your cached copy, conditional precondition failed.");
+ return HTTP_PRECONDITION_FAILED;
+ }
+
+@@ -802,53 +816,54 @@
+ /* check for If-None-Match, If-Modified-Since */
+ while (1) {
+
+- /* check for existance of If-None-Match and If-Modified-Since
++ /*
++ * check for existance of If-None-Match and If-Modified-Since
+ *
+- * if neither of these headers have been set, then the request
+- * is not conditional, and we just send the cached response and
+- * be done with it.
++ * if neither of these headers have been set, then the request is not
++ * conditional, and we just send the cached response and be done with
++ * it.
+ */
+ if (!c->inm && BAD_DATE == c->ims) {
+ break;
+ }
+
+- /* check If-None-Match
++ /*
++ * check If-None-Match
+ *
+- * we check if the Etag on the cached file is in the list of Etags
+- * in the If-None-Match field. The comparison must be a strong comparison,
+- * so the Etag cannot be marked as weak. If the comparision fails
+- * we return 412 Precondition Failed.
+- *
+- * if If-None-Match is specified:
+- * if If-None-Match is a "*" THEN 304
+- * else if Etag is specified AND we get a match THEN 304
+- * else if Weak Etag is specified AND we get a match THEN 304
+- * else sent the original object
++ * we check if the Etag on the cached file is in the list of Etags in
++ * the If-None-Match field. The comparison must be a strong
++ * comparison, so the Etag cannot be marked as weak. If the
++ * comparision fails we return 412 Precondition Failed.
++ *
++ * if If-None-Match is specified: if If-None-Match is a "*" THEN 304
++ * else if Etag is specified AND we get a match THEN 304 else if Weak
++ * Etag is specified AND we get a match THEN 304 else sent the
++ * original object
+ */
+ if (c->inm) {
+ if (!strcmp(c->inm, "*")) {
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "If-None-Match: * specified, return 304");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "If-None-Match: * specified, return 304");
+ }
+ else if (etag && ap_proxy_liststr(c->inm, etag, NULL)) {
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "If-None-Match: specified and we got a strong match - return 304");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "If-None-Match: specified and we got a strong match - return 304");
+ }
+ else if (wetag && ap_proxy_liststr(c->inm, wetag, NULL)) {
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "If-None-Match specified, and we got a weak match - return 304");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "If-None-Match specified, and we got a weak match - return 304");
+ }
+ else
+ break;
+ }
+
+- /* check If-Modified-Since
++ /*
++ * check If-Modified-Since
+ *
+- * if If-Modified-Since is specified AND
+- * Last-Modified is specified somewhere:
+- * if last modification date is earlier than If-Modified-Since THEN 304
+- * else send the original object
++ * if If-Modified-Since is specified AND Last-Modified is specified
++ * somewhere: if last modification date is earlier than
++ * If-Modified-Since THEN 304 else send the original object
+ */
+ if (BAD_DATE != c->ims && BAD_DATE != c->lmod) {
+ if (c->ims >= c->lmod) {
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "If-Modified-Since specified and not modified, try return 304");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "If-Modified-Since specified and not modified, try return 304");
+ }
+ else
+ break;
+@@ -858,47 +873,43 @@
+ /* are we updating the cache file? */
+ if (c->origfp) {
+ ap_proxy_write_headers(c, c->resp_line, c->hdrs);
+- ap_proxy_send_fb(c->origfp, r, c, c->len, 1, IOBUFSIZE);
++ ap_proxy_send_fb(c->origfp, r, c, c->len, 1, 0, IOBUFSIZE);
+ ap_proxy_cache_tidy(c);
+ }
+ else
+ ap_pclosef(r->pool, ap_bfileno(cachefp, B_WR));
+
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Use local copy, cached file hasn't changed");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Use local copy, cached file hasn't changed");
+ return HTTP_NOT_MODIFIED;
+ }
+
+
+ /* No conditional - just send it cousin! */
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Local copy modified, send it");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Local copy modified, send it");
+ r->status_line = strchr(c->resp_line, ' ') + 1;
+ r->status = c->status;
+
+ /* Prepare and send headers to client */
+- ap_overlap_tables(r->headers_out, c->hdrs, AP_OVERLAP_TABLES_SET);
++ ap_proxy_table_replace(r->headers_out, c->hdrs);
+ /* make sure our X-Cache header does not stomp on a previous header */
+ ap_table_mergen(r->headers_out, "X-Cache", c->xcache);
+
+ /* content type is already set in the headers */
+ r->content_type = ap_table_get(r->headers_out, "Content-Type");
+
+- /* cookies are special: they must not be merged (stupid browsers) */
+- ap_proxy_table_unmerge(r->pool, r->headers_out, "Set-Cookie");
+- ap_proxy_table_unmerge(r->pool, r->headers_out, "Set-Cookie2");
+-
+ ap_send_http_header(r);
+
+ /* are we rewriting the cache file? */
+ if (c->origfp) {
+ ap_proxy_write_headers(c, c->resp_line, c->hdrs);
+- ap_proxy_send_fb(c->origfp, r, c, c->len, r->header_only, IOBUFSIZE);
++ ap_proxy_send_fb(c->origfp, r, c, c->len, r->header_only, 0, IOBUFSIZE);
+ ap_proxy_cache_tidy(c);
+ return OK;
+ }
+
+ /* no, we not */
+ if (!r->header_only) {
+- ap_proxy_send_fb(cachefp, r, NULL, c->len, 0, IOBUFSIZE);
++ ap_proxy_send_fb(cachefp, r, NULL, c->len, 0, 0, IOBUFSIZE);
+ }
+ else {
+ ap_pclosef(r->pool, ap_bfileno(cachefp, B_WR));
+@@ -922,17 +933,17 @@
+ * if last modified after if-modified-since then add
+ * last modified date to request
+ */
+-int ap_proxy_cache_check(request_rec *r, char *url, struct cache_conf *conf,
++int ap_proxy_cache_check(request_rec *r, char *url, struct cache_conf * conf,
+ cache_req **cr)
+ {
+- const char *datestr, *pragma_req = NULL, *pragma_cresp = NULL, *cc_req = NULL, *cc_cresp = NULL, *vary = NULL;
++ const char *datestr, *pragma_req = NULL, *pragma_cresp = NULL, *cc_req = NULL,
++ *cc_cresp = NULL;
+ cache_req *c;
+- time_t now;
+ BUFF *cachefp;
+ int i;
+ void *sconf = r->server->module_config;
+ proxy_server_conf *pconf =
+- (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module);
++ (proxy_server_conf *)ap_get_module_config(sconf, &proxy_module);
+ const char *agestr = NULL;
+ char *val;
+ time_t age_c = 0;
+@@ -989,7 +1000,7 @@
+ else {
+ c->filename = NULL;
+ c->fp = NULL;
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "No CacheRoot, so no caching. Declining.");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "No CacheRoot, so no caching. Declining.");
+ return DECLINED;
+ }
+
+@@ -1017,22 +1028,24 @@
+ unlink(c->filename);
+ c->fp = NULL;
+ c->filename = NULL;
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "no-store forbids caching. Declining.");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "no-store forbids caching. Declining.");
+ return DECLINED;
+ }
+
+ /* if the cache file exists, open it */
+ cachefp = NULL;
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Request for %s, pragma_req=%s, ims=%ld", url,
+- pragma_req, c->ims);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Request for %s, pragma_req=%s, ims=%ld", url,
++ (pragma_req == NULL) ? "(unset)" : pragma_req, c->ims);
+ /* find out about whether the request can access the cache */
+ if (c->filename != NULL && r->method_number == M_GET &&
+- strlen(url) < 1024 ) {
++ strlen(url) < 1024) {
+ cachefp = ap_proxy_open_cachefile(r, c->filename);
+ }
+
+
+- /* if a cache file exists, try reading body and headers from cache file */
++ /*
++ * if a cache file exists, try reading body and headers from cache file
++ */
+ if (cachefp != NULL) {
+ i = rdcache(r, cachefp, c);
+ if (i == -1)
+@@ -1040,7 +1053,7 @@
+ "proxy: error reading cache file %s",
+ c->filename);
+ else if (i == 0)
+- ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, r,
++ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, r,
+ "proxy: bad (short?) cache file: %s", c->filename);
+ if (i != 1) {
+ ap_pclosef(r->pool, ap_bfileno(cachefp, B_WR));
+@@ -1049,7 +1062,6 @@
+ if (c->hdrs) {
+ cc_cresp = ap_table_get(c->hdrs, "Cache-Control");
+ pragma_cresp = ap_table_get(c->hdrs, "Pragma");
+- vary = ap_table_get(c->hdrs, "Vary");
+ if ((agestr = ap_table_get(c->hdrs, "Age"))) {
+ age_c = atoi(agestr);
+ }
+@@ -1065,7 +1077,8 @@
+ */
+ /* FIXME: Shouldn't we check the URL somewhere? */
+
+- /* Check Content-Negotiation - Vary
++ /*
++ * Check Content-Negotiation - Vary
+ *
+ * At this point we need to make sure that the object we found in the cache
+ * is the same object that would be delivered to the client, when the
+@@ -1092,8 +1105,10 @@
+ ++vary;
+ }
+
+- /* is this header in the request and the header in the cached
+- * request identical? If not, we give up and do a straight get */
++ /*
++ * is this header in the request and the header in the cached
++ * request identical? If not, we give up and do a straight get
++ */
+ h1 = ap_table_get(r->headers_in, name);
+ h2 = ap_table_get(c->req_hdrs, name);
+ if (h1 == h2) {
+@@ -1106,42 +1121,43 @@
+
+ /* headers do not match, so Vary failed */
+ c->fp = cachefp;
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Vary header mismatch - object must be fetched from scratch. Declining.");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Vary header mismatch - object must be fetched from scratch. Declining.");
+ return DECLINED;
+ }
+ }
+ }
+
+
+- /* We now want to check if our cached data is still fresh. This depends
++ /*
++ * We now want to check if our cached data is still fresh. This depends
+ * on a few things, in this order:
+ *
+- * - RFC2616 14.9.4 End to end reload, Cache-Control: no-cache
+- * no-cache in either the request or the cached response means that
+- * we must revalidate the request unconditionally, overriding any
+- * expiration mechanism. It's equivalent to max-age=0,must-revalidate.
+- *
+- * - RFC2616 14.32 Pragma: no-cache
+- * This is treated the same as Cache-Control: no-cache.
+- *
+- * - RFC2616 14.9.3 Cache-Control: max-stale, must-revalidate, proxy-revalidate
+- * if the max-stale request header exists, modify the stale calculations
+- * below so that an object can be at most <max-stale> seconds stale before
+- * we request a revalidation, _UNLESS_ a must-revalidate or
+- * proxy-revalidate cached response header exists to stop us doing this.
+- *
+- * - RFC2616 14.9.3 Cache-Control: s-maxage
+- * the origin server specifies the maximum age an object can be before
+- * it is considered stale. This directive has the effect of proxy|must
+- * revalidate, which in turn means simple ignore any max-stale setting.
+- *
+- * - RFC2616 14.9.4 Cache-Control: max-age
+- * this header can appear in both requests and responses. If both are
+- * specified, the smaller of the two takes priority.
+- *
+- * - RFC2616 14.21 Expires:
+- * if this request header exists in the cached entity, and it's value is
+- * in the past, it has expired.
++ * - RFC2616 14.9.4 End to end reload, Cache-Control: no-cache no-cache in
++ * either the request or the cached response means that we must
++ * revalidate the request unconditionally, overriding any expiration
++ * mechanism. It's equivalent to max-age=0,must-revalidate.
++ *
++ * - RFC2616 14.32 Pragma: no-cache This is treated the same as
++ * Cache-Control: no-cache.
++ *
++ * - RFC2616 14.9.3 Cache-Control: max-stale, must-revalidate,
++ * proxy-revalidate if the max-stale request header exists, modify the
++ * stale calculations below so that an object can be at most <max-stale>
++ * seconds stale before we request a revalidation, _UNLESS_ a
++ * must-revalidate or proxy-revalidate cached response header exists to
++ * stop us doing this.
++ *
++ * - RFC2616 14.9.3 Cache-Control: s-maxage the origin server specifies the
++ * maximum age an object can be before it is considered stale. This
++ * directive has the effect of proxy|must revalidate, which in turn means
++ * simple ignore any max-stale setting.
++ *
++ * - RFC2616 14.9.4 Cache-Control: max-age this header can appear in both
++ * requests and responses. If both are specified, the smaller of the two
++ * takes priority.
++ *
++ * - RFC2616 14.21 Expires: if this request header exists in the cached
++ * entity, and it's value is in the past, it has expired.
+ *
+ */
+
+@@ -1166,7 +1182,9 @@
+ else
+ maxage_cresp = -1;
+
+- /* if both maxage request and response, the smaller one takes priority */
++ /*
++ * if both maxage request and response, the smaller one takes priority
++ */
+ if (-1 == maxage_req)
+ maxage = maxage_cresp;
+ else if (-1 == maxage_cresp)
+@@ -1187,37 +1205,35 @@
+ minfresh = 0;
+
+ /* override maxstale if must-revalidate or proxy-revalidate */
+- if (maxstale && ( (cc_cresp && ap_proxy_liststr(cc_cresp, "must-revalidate", NULL)) || (cc_cresp && ap_proxy_liststr(cc_cresp, "proxy-revalidate", NULL)) ))
++ if (maxstale && ((cc_cresp && ap_proxy_liststr(cc_cresp, "must-revalidate", NULL)) || (cc_cresp && ap_proxy_liststr(cc_cresp, "proxy-revalidate", NULL))))
+ maxstale = 0;
+
+- now = time(NULL);
+ if (cachefp != NULL &&
+
+ /* handle no-cache */
+- !( (cc_req && ap_proxy_liststr(cc_req, "no-cache", NULL)) ||
++ !((cc_req && ap_proxy_liststr(cc_req, "no-cache", NULL)) ||
+ (pragma_req && ap_proxy_liststr(pragma_req, "no-cache", NULL)) ||
+ (cc_cresp && ap_proxy_liststr(cc_cresp, "no-cache", NULL)) ||
+- (pragma_cresp && ap_proxy_liststr(pragma_cresp, "no-cache", NULL)) ) &&
++ (pragma_cresp && ap_proxy_liststr(pragma_cresp, "no-cache", NULL))) &&
+
+ /* handle expiration */
+- ( (-1 < smaxage && age < (smaxage - minfresh)) ||
++ ((-1 < smaxage && age < (smaxage - minfresh)) ||
+ (-1 < maxage && age < (maxage + maxstale - minfresh)) ||
+- (c->expire != BAD_DATE && age < (c->expire - c->date + maxstale - minfresh)) )
+-
++ (c->expire != BAD_DATE && age < (c->expire - c->date + maxstale - minfresh)))
+ ) {
+
+ /* it's fresh darlings... */
+
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Unexpired data available");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Unexpired data available");
+
+ /* set age header on response */
+ ap_table_set(c->hdrs, "Age",
+ ap_psprintf(r->pool, "%lu", (unsigned long)age));
+
+ /* add warning if maxstale overrode freshness calculation */
+- if (!( (-1 < smaxage && age < smaxage) ||
++ if (!((-1 < smaxage && age < smaxage) ||
+ (-1 < maxage && age < maxage) ||
+- (c->expire != BAD_DATE && (c->expire - c->date) > age) )) {
++ (c->expire != BAD_DATE && (c->expire - c->date) > age))) {
+ /* make sure we don't stomp on a previous warning */
+ ap_table_merge(c->hdrs, "Warning", "110 Response is stale");
+ }
+@@ -1229,11 +1245,12 @@
+
+ }
+
+- /* at this point we have determined our cached data needs revalidation
++ /*
++ * at this point we have determined our cached data needs revalidation
+ * but first - we check 1 thing:
+ *
+- * RFC2616 14.9.4 - if "only-if-cached" specified, send a
+- * 504 Gateway Timeout - we're not allowed to revalidate the object
++ * RFC2616 14.9.4 - if "only-if-cached" specified, send a 504 Gateway
++ * Timeout - we're not allowed to revalidate the object
+ */
+ if (ap_proxy_liststr(cc_req, "only-if-cached", NULL)) {
+ if (cachefp)
+@@ -1242,11 +1259,12 @@
+ }
+
+
+- /* If we already have cached data and a last-modified date, and it is
+- * not a head request, then add an If-Modified-Since.
++ /*
++ * If we already have cached data and a last-modified date, and it is not
++ * a head request, then add an If-Modified-Since.
+ *
+- * If we also have an Etag, then the object must have come from
+- * an HTTP/1.1 server. Add an If-None-Match as well.
++ * If we also have an Etag, then the object must have come from an HTTP/1.1
++ * server. Add an If-None-Match as well.
+ *
+ * See RFC2616 13.3.4
+ */
+@@ -1257,13 +1275,15 @@
+
+ /* If-Modified-Since */
+ if (c->lmod != BAD_DATE) {
+- /* use the later of the one from the request and the last-modified date
+- * from the cache */
++ /*
++ * use the later of the one from the request and the
++ * last-modified date from the cache
++ */
+ if (c->ims == BAD_DATE || c->ims < c->lmod) {
+ const char *q;
+
+ if ((q = ap_table_get(c->hdrs, "Last-Modified")) != NULL)
+- ap_table_set(r->headers_in, "If-Modified-Since", (char *) q);
++ ap_table_set(r->headers_in, "If-Modified-Since", (char *)q);
+ }
+ }
+
+@@ -1277,7 +1297,7 @@
+
+ c->fp = cachefp;
+
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Local copy not present or expired. Declining.");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Local copy not present or expired. Declining.");
+
+ return DECLINED;
+ }
+@@ -1304,10 +1324,10 @@
+ char *p;
+ const char *expire, *lmods, *dates, *clen;
+ time_t expc, date, lmod, now;
+- char buff[17*7+1];
++ char buff[17 * 7 + 1];
+ void *sconf = r->server->module_config;
+ proxy_server_conf *conf =
+- (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module);
++ (proxy_server_conf *)ap_get_module_config(sconf, &proxy_module);
+ const char *cc_resp;
+ table *req_hdrs;
+
+@@ -1317,8 +1337,10 @@
+
+ /* we've received the response from the origin server */
+
+- /* read expiry date; if a bad date, then leave it so the client can
+- * read it */
++ /*
++ * read expiry date; if a bad date, then leave it so the client can read
++ * it
++ */
+ expire = ap_table_get(resp_hdrs, "Expires");
+ if (expire != NULL)
+ expc = ap_parseHTTPdate(expire);
+@@ -1341,44 +1363,55 @@
+ /*
+ * what responses should we not cache?
+ *
+- * At this point we decide based on the response headers whether it
+- * is appropriate _NOT_ to cache the data from the server. There are
+- * a whole lot of conditions that prevent us from caching this data.
+- * They are tested here one by one to be clear and unambiguous. */
+-
+- /* RFC2616 13.4 we are allowed to cache 200, 203, 206, 300, 301 or 410
+- * We don't cache 206, because we don't (yet) cache partial responses.
+- * We include 304 Not Modified here too as this is the origin server
+- * telling us to serve the cached copy. */
++ * At this point we decide based on the response headers whether it is
++ * appropriate _NOT_ to cache the data from the server. There are a whole
++ * lot of conditions that prevent us from caching this data. They are
++ * tested here one by one to be clear and unambiguous.
++ */
++
++ /*
++ * RFC2616 13.4 we are allowed to cache 200, 203, 206, 300, 301 or 410 We
++ * don't cache 206, because we don't (yet) cache partial responses. We
++ * include 304 Not Modified here too as this is the origin server telling
++ * us to serve the cached copy.
++ */
+ if ((r->status != HTTP_OK && r->status != HTTP_NON_AUTHORITATIVE && r->status != HTTP_MULTIPLE_CHOICES && r->status != HTTP_MOVED_PERMANENTLY && r->status != HTTP_NOT_MODIFIED) ||
+
+ /* if a broken Expires header is present, don't cache it */
+ (expire != NULL && expc == BAD_DATE) ||
+
+- /* if the server said 304 Not Modified but we have no cache file - pass
+- * this untouched to the user agent, it's not for us. */
++ /*
++ * if the server said 304 Not Modified but we have no cache file - pass
++ * this untouched to the user agent, it's not for us.
++ */
+ (r->status == HTTP_NOT_MODIFIED && (c == NULL || c->fp == NULL)) ||
+
+- /* 200 OK response from HTTP/1.0 and up without a Last-Modified header */
++ /*
++ * 200 OK response from HTTP/1.0 and up without a Last-Modified header
++ */
+ (r->status == HTTP_OK && lmods == NULL && is_HTTP1) ||
+
+ /* HEAD requests */
+ r->header_only ||
+
+- /* RFC2616 14.9.2 Cache-Control: no-store response indicating do not
+- * cache, or stop now if you are trying to cache it */
++ /*
++ * RFC2616 14.9.2 Cache-Control: no-store response indicating do not
++ * cache, or stop now if you are trying to cache it
++ */
+ ap_proxy_liststr(cc_resp, "no-store", NULL) ||
+
+- /* RFC2616 14.9.1 Cache-Control: private
+- * this object is marked for this user's eyes only. Behave as a tunnel. */
++ /*
++ * RFC2616 14.9.1 Cache-Control: private this object is marked for this
++ * user's eyes only. Behave as a tunnel.
++ */
+ ap_proxy_liststr(cc_resp, "private", NULL) ||
+
+- /* RFC2616 14.8 Authorisation:
+- * if authorisation is included in the request, we don't cache, but we
+- * can cache if the following exceptions are true:
+- * 1) If Cache-Control: s-maxage is included
+- * 2) If Cache-Control: must-revalidate is included
+- * 3) If Cache-Control: public is included
++ /*
++ * RFC2616 14.8 Authorisation: if authorisation is included in the
++ * request, we don't cache, but we can cache if the following exceptions
++ * are true: 1) If Cache-Control: s-maxage is included 2) If
++ * Cache-Control: must-revalidate is included 3) If Cache-Control: public
++ * is included
+ */
+ (ap_table_get(r->headers_in, "Authorization") != NULL
+
+@@ -1388,7 +1421,7 @@
+ /* or we've been asked not to cache it above */
+ nocache) {
+
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Response is not cacheable, unlinking %s", c->filename);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Response is not cacheable, unlinking %s", c->filename);
+
+ /* close the file */
+ if (c->fp != NULL) {
+@@ -1403,15 +1436,15 @@
+ }
+
+
+- /* It's safe to cache the response.
++ /*
++ * It's safe to cache the response.
+ *
+- * We now want to update the cache file header information with
+- * the new date, last modified, expire and content length and write
+- * it away to our cache file. First, we determine these values from
+- * the response, using heuristics if appropriate.
++ * We now want to update the cache file header information with the new
++ * date, last modified, expire and content length and write it away to
++ * our cache file. First, we determine these values from the response,
++ * using heuristics if appropriate.
+ *
+- * In addition, we make HTTP/1.1 age calculations and write them away
+- * too.
++ * In addition, we make HTTP/1.1 age calculations and write them away too.
+ */
+
+ /* Read the date. Generate one if one is not supplied */
+@@ -1430,7 +1463,7 @@
+ date = now;
+ dates = ap_gm_timestr_822(r->pool, now);
+ ap_table_set(resp_hdrs, "Date", dates);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Added date header");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Added date header");
+ }
+
+ /* set response_time for HTTP/1.1 age calculations */
+@@ -1442,16 +1475,17 @@
+ {
+ lmod = date;
+ lmods = dates;
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Last modified is in the future, replacing with now");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Last modified is in the future, replacing with now");
+ }
+ /* if the response did not contain the header, then use the cached version */
+ if (lmod == BAD_DATE && c->fp != NULL) {
+ lmod = c->lmod;
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Reusing cached last modified");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Reusing cached last modified");
+ }
+
+ /* we now need to calculate the expire data for the object. */
+- if (expire == NULL && c->fp != NULL) { /* no expiry data sent in response */
++ if (expire == NULL && c->fp != NULL) { /* no expiry data sent in
++ * response */
+ expire = ap_table_get(c->hdrs, "Expires");
+ if (expire != NULL)
+ expc = ap_parseHTTPdate(expire);
+@@ -1463,18 +1497,18 @@
+ * else
+ * expire date = now + defaultexpire
+ */
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Expiry date is %ld", (long)expc);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Expiry date is %ld", (long)expc);
+ if (expc == BAD_DATE) {
+ if (lmod != BAD_DATE) {
+- double x = (double) (date - lmod) * conf->cache.lmfactor;
++ double x = (double)(date - lmod) * conf->cache.lmfactor;
+ double maxex = conf->cache.maxexpire;
+ if (x > maxex)
+ x = maxex;
+- expc = now + (int) x;
++ expc = now + (int)x;
+ }
+ else
+ expc = now + conf->cache.defaultexpire;
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Expiry date calculated %ld", (long)expc);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Expiry date calculated %ld", (long)expc);
+ }
+
+ /* get the content-length header */
+@@ -1486,21 +1520,21 @@
+
+ /* we have all the header information we need - write it to the cache file */
+ c->version++;
+- ap_proxy_sec2hex(date, buff + 17*(0));
+- buff[17*(1)-1] = ' ';
+- ap_proxy_sec2hex(lmod, buff + 17*(1));
+- buff[17*(2)-1] = ' ';
+- ap_proxy_sec2hex(expc, buff + 17*(2));
+- buff[17*(3)-1] = ' ';
+- ap_proxy_sec2hex(c->version, buff + 17*(3));
+- buff[17*(4)-1] = ' ';
+- ap_proxy_sec2hex(c->req_time, buff + 17*(4));
+- buff[17*(5)-1] = ' ';
+- ap_proxy_sec2hex(c->resp_time, buff + 17*(5));
+- buff[17*(6)-1] = ' ';
+- ap_proxy_sec2hex(c->len, buff + 17*(6));
+- buff[17*(7)-1] = '\n';
+- buff[17*(7)] = '\0';
++ ap_proxy_sec2hex(date, buff + 17 * (0));
++ buff[17 * (1) - 1] = ' ';
++ ap_proxy_sec2hex(lmod, buff + 17 * (1));
++ buff[17 * (2) - 1] = ' ';
++ ap_proxy_sec2hex(expc, buff + 17 * (2));
++ buff[17 * (3) - 1] = ' ';
++ ap_proxy_sec2hex(c->version, buff + 17 * (3));
++ buff[17 * (4) - 1] = ' ';
++ ap_proxy_sec2hex(c->req_time, buff + 17 * (4));
++ buff[17 * (5) - 1] = ' ';
++ ap_proxy_sec2hex(c->resp_time, buff + 17 * (5));
++ buff[17 * (6) - 1] = ' ';
++ ap_proxy_sec2hex(c->len, buff + 17 * (6));
++ buff[17 * (7) - 1] = '\n';
++ buff[17 * (7)] = '\0';
+
+ /* Was the server response a 304 Not Modified?
+ *
+@@ -1570,7 +1604,7 @@
+ c = ap_proxy_cache_error(c);
+ break;
+ }
+- c->tempfile = ap_palloc(r->pool, strlen(conf->cache.root) +1+ L_tmpnam);
++ c->tempfile = ap_palloc(r->pool, strlen(conf->cache.root) + 1 + L_tmpnam);
+ strcpy(c->tempfile, conf->cache.root);
+ strcat(c->tempfile, "/");
+ p = tmpnam(NULL);
+@@ -1581,7 +1615,7 @@
+ break;
+ }
+
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Create temporary file %s", c->tempfile);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Create temporary file %s", c->tempfile);
+
+ /* create the new file */
+ c->fp = ap_proxy_create_cachefile(r, c->tempfile);
+@@ -1677,7 +1711,7 @@
+ c->len = bc;
+ ap_bflush(c->fp);
+ ap_proxy_sec2hex(c->len, buff);
+- curpos = lseek(ap_bfileno(c->fp, B_WR), 17*6, SEEK_SET);
++ curpos = lseek(ap_bfileno(c->fp, B_WR), 17 * 6, SEEK_SET);
+ if (curpos == -1)
+ ap_log_error(APLOG_MARK, APLOG_ERR, s,
+ "proxy: error seeking on cache file %s", c->tempfile);
+@@ -1695,7 +1729,7 @@
+ return;
+ }
+
+- if (ap_pclosef(c->req->pool, ap_bfileno(c->fp, B_WR)) == -1) {
++ if (ap_pclosef(c->req->pool, ap_bfileno(c->fp, B_WR))== -1) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, s,
+ "proxy: error closing cache file %s", c->tempfile);
+ unlink(c->tempfile);
+@@ -1705,12 +1739,13 @@
+ if (unlink(c->filename) == -1 && errno != ENOENT) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, s,
+ "proxy: error deleting old cache file %s",
+- c->tempfile);
++ c->filename);
++ (void)unlink(c->tempfile);
+ }
+ else {
+ char *p;
+ proxy_server_conf *conf =
+- (proxy_server_conf *) ap_get_module_config(s->module_config, &proxy_module);
++ (proxy_server_conf *)ap_get_module_config(s->module_config, &proxy_module);
+
+ for (p = c->filename + strlen(conf->cache.root) + 1;;) {
+ p = strchr(p, '/');
+@@ -1732,10 +1767,11 @@
+ }
+ #if defined(OS2) || defined(WIN32) || defined(NETWARE) || defined(MPE)
+ /* Under OS/2 use rename. */
+- if (rename(c->tempfile, c->filename) == -1)
++ if (rename(c->tempfile, c->filename) == -1) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, s,
+ "proxy: error renaming cache file %s to %s",
+ c->tempfile, c->filename);
++ (void)unlink(c->tempfile);
+ }
+ #else
+
+@@ -1743,11 +1779,9 @@
+ ap_log_error(APLOG_MARK, APLOG_ERR, s,
+ "proxy: error linking cache file %s to %s",
+ c->tempfile, c->filename);
+- }
+-
+ if (unlink(c->tempfile) == -1)
+ ap_log_error(APLOG_MARK, APLOG_ERR, s,
+ "proxy: error deleting temp file %s", c->tempfile);
+ #endif
+-
++ }
+ }
+Index: modules/proxy/proxy_connect.c
+===================================================================
+RCS file: /home/cvs/apache-1.3/src/modules/proxy/proxy_connect.c,v
+retrieving revision 1.48
+retrieving revision 1.49
+diff -u -b -u -r1.48 -r1.49
+--- modules/proxy/proxy_connect.c 13 Mar 2002 21:05:32 -0000 1.48
++++ modules/proxy/proxy_connect.c 25 Mar 2002 09:21:58 -0000 1.49
+@@ -96,14 +96,13 @@
+ * FIXME: no check for r->assbackwards, whatever that is.
+ */
+
+-static int
+-allowed_port(proxy_server_conf *conf, int port)
++static int allowed_port(proxy_server_conf *conf, int port)
+ {
+ int i;
+- int *list = (int *) conf->allowed_connect_ports->elts;
++ int *list = (int *)conf->allowed_connect_ports->elts;
+
+- for(i = 0; i < conf->allowed_connect_ports->nelts; i++) {
+- if(port == list[i])
++ for (i = 0; i < conf->allowed_connect_ports->nelts; i++) {
++ if (port == list[i])
+ return 1;
+ }
+ return 0;
+@@ -125,8 +124,8 @@
+
+ void *sconf = r->server->module_config;
+ proxy_server_conf *conf =
+- (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module);
+- struct noproxy_entry *npent = (struct noproxy_entry *)conf->noproxies->elts;
++ (proxy_server_conf *)ap_get_module_config(sconf, &proxy_module);
++ struct noproxy_entry *npent = (struct noproxy_entry *) conf->noproxies->elts;
+
+ memset(&server, '\0', sizeof(server));
+ server.sin_family = AF_INET;
+@@ -162,15 +161,16 @@
+ default:
+ return HTTP_FORBIDDEN;
+ }
+- } else if(!allowed_port(conf, port))
++ }
++ else if (!allowed_port(conf, port))
+ return HTTP_FORBIDDEN;
+
+ if (proxyhost) {
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server,
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server,
+ "CONNECT to remote proxy %s on port %d", proxyhost, proxyport);
+ }
+ else {
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server,
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server,
+ "CONNECT to %s on port %d", host, port);
+ }
+
+@@ -190,7 +190,7 @@
+
+ #ifdef CHECK_FD_SETSIZE
+ if (sock >= FD_SETSIZE) {
+- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_WARNING, NULL,
++ ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_WARNING, NULL,
+ "proxy_connect_handler: filedescriptor (%u) "
+ "larger than FD_SETSIZE (%u) "
+ "found, you probably need to rebuild Apache with a "
+@@ -215,61 +215,64 @@
+ "Could not connect to remote machine:<br>", strerror(errno), NULL));
+ }
+
+- /* If we are connecting through a remote proxy, we need to pass
+- * the CONNECT request on to it.
++ /*
++ * If we are connecting through a remote proxy, we need to pass the
++ * CONNECT request on to it.
+ */
+ if (proxyport) {
+- /* FIXME: We should not be calling write() directly, but we currently
+- * have no alternative. Error checking ignored. Also, we force
+- * a HTTP/1.0 request to keep things simple.
++ /*
++ * FIXME: We should not be calling write() directly, but we currently
++ * have no alternative. Error checking ignored. Also, we force a
++ * HTTP/1.0 request to keep things simple.
+ */
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server,
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server,
+ "Sending the CONNECT request to the remote proxy");
+ ap_snprintf(buffer, sizeof(buffer), "CONNECT %s HTTP/1.0" CRLF, r->uri);
+- send(sock, buffer, strlen(buffer),0);
++ send(sock, buffer, strlen(buffer), 0);
+ ap_snprintf(buffer, sizeof(buffer),
+ "Proxy-agent: %s" CRLF CRLF, ap_get_server_version());
+- send(sock, buffer, strlen(buffer),0);
++ send(sock, buffer, strlen(buffer), 0);
+ }
+ else {
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server,
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server,
+ "Returning 200 OK Status");
+ ap_rvputs(r, "HTTP/1.0 200 Connection established" CRLF, NULL);
+ ap_rvputs(r, "Proxy-agent: ", ap_get_server_version(), CRLF CRLF, NULL);
+ ap_bflush(r->connection->client);
+ }
+
+- while (1) { /* Infinite loop until error (one side closes the connection) */
++ while (1) { /* Infinite loop until error (one side closes
++ * the connection) */
+ FD_ZERO(&fds);
+ FD_SET(sock, &fds);
+ FD_SET(ap_bfileno(r->connection->client, B_WR), &fds);
+
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server,
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server,
+ "Going to sleep (select)");
+ i = ap_select((ap_bfileno(r->connection->client, B_WR) > sock ?
+ ap_bfileno(r->connection->client, B_WR) + 1 :
+ sock + 1), &fds, NULL, NULL, NULL);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server,
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server,
+ "Woke from select(), i=%d", i);
+
+ if (i) {
+ if (FD_ISSET(sock, &fds)) {
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server,
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server,
+ "sock was set");
+- if ((nbytes = recv(sock, buffer, HUGE_STRING_LEN,0)) != 0) {
++ if ((nbytes = recv(sock, buffer, HUGE_STRING_LEN, 0)) != 0) {
+ if (nbytes == -1)
+ break;
+ if (send(ap_bfileno(r->connection->client, B_WR), buffer,
+- nbytes,0) == EOF)
++ nbytes, 0) == EOF)
+ break;
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO,
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO,
+ r->server, "Wrote %d bytes to client", nbytes);
+ }
+ else
+ break;
+ }
+ else if (FD_ISSET(ap_bfileno(r->connection->client, B_WR), &fds)) {
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server,
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server,
+ "client->fd was set");
+ if ((nbytes = recv(ap_bfileno(r->connection->client, B_WR),
+ buffer, HUGE_STRING_LEN, 0)) != 0) {
+@@ -277,7 +280,7 @@
+ break;
+ if (send(sock, buffer, nbytes, 0) == EOF)
+ break;
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO,
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO,
+ r->server, "Wrote %d bytes to server", nbytes);
+ }
+ else
+Index: modules/proxy/proxy_ftp.c
+===================================================================
+RCS file: /home/cvs/apache-1.3/src/modules/proxy/proxy_ftp.c,v
+retrieving revision 1.96
+retrieving revision 1.98
+diff -u -b -u -r1.96 -r1.98
+--- modules/proxy/proxy_ftp.c 13 Mar 2002 21:05:32 -0000 1.96
++++ modules/proxy/proxy_ftp.c 7 Apr 2002 18:57:36 -0000 1.98
+@@ -229,8 +229,7 @@
+ {
+ int len, status;
+ char linebuff[100], buff[5];
+- char *mb = msgbuf,
+- *me = &msgbuf[msglen];
++ char *mb = msgbuf, *me = &msgbuf[msglen];
+
+ len = ap_bgets(linebuff, sizeof linebuff, ctrl);
+ if (len == -1)
+@@ -241,7 +240,7 @@
+ else
+ status = 100 * linebuff[0] + 10 * linebuff[1] + linebuff[2] - 111 * '0';
+
+- mb = ap_cpystrn(mb, linebuff+4, me - mb);
++ mb = ap_cpystrn(mb, linebuff + 4, me - mb);
+
+ if (linebuff[len - 1] != '\n')
+ (void)ap_bskiplf(ctrl);
+@@ -256,7 +255,7 @@
+ if (linebuff[len - 1] != '\n') {
+ (void)ap_bskiplf(ctrl);
+ }
+- mb = ap_cpystrn(mb, linebuff+4, me - mb);
++ mb = ap_cpystrn(mb, linebuff + 4, me - mb);
+ } while (memcmp(linebuff, buff, 4) != 0);
+ }
+ return status;
+@@ -275,7 +274,8 @@
+ conn_rec *con = r->connection;
+ pool *p = r->pool;
+ char *dir, *path, *reldir, *site, *type = NULL;
+- char *basedir = ""; /* By default, path is relative to the $HOME dir */
++ char *basedir = ""; /* By default, path is relative to the $HOME
++ * dir */
+
+ /* create default sized buffers for the stuff below */
+ buf_size = IOBUFSIZE;
+@@ -283,9 +283,9 @@
+ buf2 = ap_palloc(r->pool, buf_size);
+
+ /* Save "scheme://site" prefix without password */
+- site = ap_unparse_uri_components(p, &r->parsed_uri, UNP_OMITPASSWORD|UNP_OMITPATHINFO);
++ site = ap_unparse_uri_components(p, &r->parsed_uri, UNP_OMITPASSWORD | UNP_OMITPATHINFO);
+ /* ... and path without query args */
+- path = ap_unparse_uri_components(p, &r->parsed_uri, UNP_OMITSITEPART|UNP_OMITQUERY);
++ path = ap_unparse_uri_components(p, &r->parsed_uri, UNP_OMITSITEPART | UNP_OMITQUERY);
+
+ /* If path began with /%2f, change the basedir */
+ if (strncasecmp(path, "/%2f", 4) == 0) {
+@@ -304,8 +304,8 @@
+ /* Copy path, strip (all except the last) trailing slashes */
+ /* (the trailing slash is needed for the dir component loop below) */
+ path = dir = ap_pstrcat(r->pool, path, "/", NULL);
+- for (n = strlen(path); n > 1 && path[n-1] == '/' && path[n-2] == '/'; --n)
+- path[n-1] = '\0';
++ for (n = strlen(path); n > 1 && path[n - 1] == '/' && path[n - 2] == '/'; --n)
++ path[n - 1] = '\0';
+
+ /* print "ftp://host/" */
+ n = ap_snprintf(buf, buf_size, DOCTYPE_HTML_3_2
+@@ -313,8 +313,8 @@
+ "<base href=\"%s%s%s\"></head>\n"
+ "<body><h2>Directory of "
+ "<a href=\"/\">%s</a>/",
+- site, basedir, ap_escape_html(p,path),
+- site, basedir, ap_escape_uri(p,path),
++ site, basedir, ap_escape_html(p, path),
++ site, basedir, ap_escape_uri(p, path),
+ site);
+ total_bytes_sent += ap_proxy_bputs2(buf, con->client, c);
+
+@@ -323,11 +323,10 @@
+ total_bytes_sent += ap_proxy_bputs2("<a href=\"/%2f/\">%2f</a>/", con->client, c);
+ }
+
+- for (dir = path+1; (dir = strchr(dir, '/')) != NULL; )
+- {
++ for (dir = path + 1; (dir = strchr(dir, '/')) != NULL;) {
+ *dir = '\0';
+- if ((reldir = strrchr(path+1, '/'))==NULL) {
+- reldir = path+1;
++ if ((reldir = strrchr(path + 1, '/')) == NULL) {
++ reldir = path + 1;
+ }
+ else
+ ++reldir;
+@@ -344,9 +343,10 @@
+
+ /* If the caller has determined the current directory, and it differs */
+ /* from what the client requested, then show the real name */
+- if (cwd == NULL || strncmp (cwd, path, strlen(cwd)) == 0) {
++ if (cwd == NULL || strncmp(cwd, path, strlen(cwd)) == 0) {
+ ap_snprintf(buf, buf_size, "</h2>\n<hr /><pre>");
+- } else {
++ }
++ else {
+ ap_snprintf(buf, buf_size, "</h2>\n(%s)\n<hr /><pre>",
+ ap_escape_html(p, cwd));
+ }
+@@ -365,13 +365,13 @@
+ if (n == 0)
+ break; /* EOF */
+
+- if (buf[n-1] == '\n') /* strip trailing '\n' */
++ if (buf[n - 1] == '\n') /* strip trailing '\n' */
+ buf[--n] = '\0';
+- if (buf[n-1] == '\r') /* strip trailing '\r' if present */
++ if (buf[n - 1] == '\r') /* strip trailing '\r' if present */
+ buf[--n] = '\0';
+
+ /* Handle unix-style symbolic link */
+- if (buf[0] == 'l' && (filename=strstr(buf, " -> ")) != NULL) {
++ if (buf[0] == 'l' && (filename = strstr(buf, " -> ")) != NULL) {
+ char *link_ptr = filename;
+
+ do {
+@@ -382,7 +382,7 @@
+ *(link_ptr++) = '\0';
+ ap_snprintf(buf2, buf_size, "%s <a href=\"%s\">%s %s</a>\n",
+ ap_escape_html(p, buf),
+- ap_escape_uri(p,filename),
++ ap_escape_uri(p, filename),
+ ap_escape_html(p, filename),
+ ap_escape_html(p, link_ptr));
+ ap_cpystrn(buf, buf2, buf_size);
+@@ -416,13 +416,13 @@
+ /* Special handling for '.' and '..': append slash to link */
+ if (!strcmp(filename, ".") || !strcmp(filename, "..") || buf[0] == 'd') {
+ ap_snprintf(buf2, buf_size, "%s <a href=\"%s/\">%s</a>\n",
+- ap_escape_html(p, buf), ap_escape_uri(p,filename),
++ ap_escape_html(p, buf), ap_escape_uri(p, filename),
+ ap_escape_html(p, filename));
+ }
+ else {
+ ap_snprintf(buf2, buf_size, "%s <a href=\"%s\">%s</a>\n",
+ ap_escape_html(p, buf),
+- ap_escape_uri(p,filename),
++ ap_escape_uri(p, filename),
+ ap_escape_html(p, filename));
+ }
+ ap_cpystrn(buf, buf2, buf_size);
+@@ -457,14 +457,15 @@
+ * Note that we "invent" a realm name which consists of the
+ * ftp://user@host part of the reqest (sans password -if supplied but invalid-)
+ */
+-static int ftp_unauthorized (request_rec *r, int log_it)
++static int ftp_unauthorized(request_rec *r, int log_it)
+ {
+ r->proxyreq = NOT_PROXY;
+- /* Log failed requests if they supplied a password
+- * (log username/password guessing attempts)
++ /*
++ * Log failed requests if they supplied a password (log username/password
++ * guessing attempts)
+ */
+ if (log_it)
+- ap_log_rerror(APLOG_MARK, APLOG_INFO|APLOG_NOERRNO, r,
++ ap_log_rerror(APLOG_MARK, APLOG_INFO | APLOG_NOERRNO, r,
+ "proxy: missing or failed auth to %s",
+ ap_unparse_uri_components(r->pool,
+ &r->parsed_uri, UNP_OMITPATHINFO));
+@@ -472,7 +473,7 @@
+ ap_table_setn(r->err_headers_out, "WWW-Authenticate",
+ ap_pstrcat(r->pool, "Basic realm=\"",
+ ap_unparse_uri_components(r->pool, &r->parsed_uri,
+- UNP_OMITPASSWORD|UNP_OMITPATHINFO),
++ UNP_OMITPASSWORD | UNP_OMITPATHINFO),
+ "\"", NULL));
+
+ return HTTP_UNAUTHORIZED;
+@@ -481,7 +482,7 @@
+ /* Set ftp server to TYPE {A,I,E} before transfer of a directory or file */
+ static int ftp_set_TYPE(request_rec *r, BUFF *ctrl, char xfer_type)
+ {
+- static char old_type[2] = { 'A', '\0' }; /* After logon, mode is ASCII */
++ static char old_type[2] = {'A', '\0'}; /* After logon, mode is ASCII */
+ int ret = HTTP_OK;
+ int rc;
+
+@@ -492,7 +493,7 @@
+ old_type[0] = xfer_type;
+ ap_bvputs(ctrl, "TYPE ", old_type, CRLF, NULL);
+ ap_bflush(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: TYPE %s", old_type);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: TYPE %s", old_type);
+
+ /* responses: 200, 421, 500, 501, 504, 530 */
+ /* 200 Command okay. */
+@@ -502,7 +503,7 @@
+ /* 504 Command not implemented for that parameter. */
+ /* 530 Not logged in. */
+ rc = ftp_getrc(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", rc);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", rc);
+ if (rc == -1 || rc == 421) {
+ ap_kill_timeout(r);
+ ret = ap_proxyerror(r, HTTP_BAD_GATEWAY,
+@@ -515,14 +516,13 @@
+ }
+ /* Allow not implemented */
+ else if (rc == 504)
+- /* ignore it silently */;
++ /* ignore it silently */ ;
+
+ return ret;
+ }
+
+ /* Common cleanup routine: close open BUFFers or sockets, and return an error */
+-static int
+-ftp_cleanup_and_return(request_rec *r, BUFF *ctrl, BUFF *data, int csock, int dsock, int rc)
++static int ftp_cleanup_and_return(request_rec *r, BUFF *ctrl, BUFF *data, int csock, int dsock, int rc)
+ {
+ if (ctrl != NULL)
+ ap_bclose(ctrl);
+@@ -569,7 +569,7 @@
+
+ void *sconf = r->server->module_config;
+ proxy_server_conf *conf =
+- (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module);
++ (proxy_server_conf *)ap_get_module_config(sconf, &proxy_module);
+ struct noproxy_entry *npent = (struct noproxy_entry *) conf->noproxies->elts;
+ struct nocache_entry *ncent = (struct nocache_entry *) conf->nocaches->elts;
+
+@@ -604,25 +604,27 @@
+ while (*path == '/')
+ ++path;
+
+- /* The "Authorization:" header must be checked first.
+- * We allow the user to "override" the URL-coded user [ & password ]
+- * in the Browsers' User&Password Dialog.
+- * NOTE that this is only marginally more secure than having the
+- * password travel in plain as part of the URL, because Basic Auth
+- * simply uuencodes the plain text password.
+- * But chances are still smaller that the URL is logged regularly.
++ /*
++ * The "Authorization:" header must be checked first. We allow the user
++ * to "override" the URL-coded user [ & password ] in the Browsers'
++ * User&Password Dialog. NOTE that this is only marginally more secure
++ * than having the password travel in plain as part of the URL, because
++ * Basic Auth simply uuencodes the plain text password. But chances are
++ * still smaller that the URL is logged regularly.
+ */
+ if ((password = ap_table_get(r->headers_in, "Authorization")) != NULL
+ && strcasecmp(ap_getword(r->pool, &password, ' '), "Basic") == 0
+ && (password = ap_pbase64decode(r->pool, password))[0] != ':') {
+- /* Note that this allocation has to be made from r->connection->pool
+- * because it has the lifetime of the connection. The other allocations
+- * are temporary and can be tossed away any time.
++ /*
++ * Note that this allocation has to be made from r->connection->pool
++ * because it has the lifetime of the connection. The other
++ * allocations are temporary and can be tossed away any time.
+ */
+- user = ap_getword_nulls (r->connection->pool, &password, ':');
++ user = ap_getword_nulls(r->connection->pool, &password, ':');
+ r->connection->ap_auth_type = "Basic";
+ r->connection->user = r->parsed_uri.user = user;
+- nocache = 1; /* This resource only accessible with username/password */
++ nocache = 1; /* This resource only accessible with
++ * username/password */
+ }
+ else if ((user = r->parsed_uri.user) != NULL) {
+ user = ap_pstrdup(p, user);
+@@ -632,7 +634,8 @@
+ decodeenc(tmp);
+ password = tmp;
+ }
+- nocache = 1; /* This resource only accessible with username/password */
++ nocache = 1; /* This resource only accessible with
++ * username/password */
+ }
+ else {
+ user = "anonymous";
+@@ -649,7 +652,7 @@
+ "Connect to remote machine blocked");
+ }
+
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: connect to %s:%d", host, port);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: connect to %s:%d", host, port);
+
+ parms = strchr(path, ';');
+ if (parms != NULL)
+@@ -672,26 +675,26 @@
+ #if !defined(TPF) && !defined(BEOS)
+ if (conf->recv_buffer_size > 0
+ && setsockopt(sock, SOL_SOCKET, SO_RCVBUF,
+- (const char *) &conf->recv_buffer_size, sizeof(int))
++ (const char *)&conf->recv_buffer_size, sizeof(int))
+ == -1) {
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
+ "setsockopt(SO_RCVBUF): Failed to set ProxyReceiveBufferSize, using default");
+ }
+ #endif
+
+- if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *) &one,
++ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)&one,
+ sizeof(one)) == -1) {
+ #ifndef _OSD_POSIX /* BS2000 has this option "always on" */
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
+ "proxy: error setting reuseaddr option: setsockopt(SO_REUSEADDR)");
+ ap_pclosesocket(p, sock);
+ return HTTP_INTERNAL_SERVER_ERROR;
+-#endif /*_OSD_POSIX*/
++#endif /* _OSD_POSIX */
+ }
+
+ #ifdef SINIX_D_RESOLVER_BUG
+ {
+- struct in_addr *ip_addr = (struct in_addr *) *server_hp.h_addr_list;
++ struct in_addr *ip_addr = (struct in_addr *)*server_hp.h_addr_list;
+
+ for (; ip_addr->s_addr != 0; ++ip_addr) {
+ memcpy(&server.sin_addr, ip_addr, sizeof(struct in_addr));
+@@ -726,8 +729,8 @@
+ /* shouldn't we implement telnet control options here? */
+
+ #ifdef CHARSET_EBCDIC
+- ap_bsetflag(ctrl, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 1);
+-#endif /*CHARSET_EBCDIC*/
++ ap_bsetflag(ctrl, B_ASCII2EBCDIC | B_EBCDIC2ASCII, 1);
++#endif /* CHARSET_EBCDIC */
+
+ /* possible results: */
+ /* 120 Service ready in nnn minutes. */
+@@ -735,7 +738,7 @@
+ /* 421 Service not available, closing control connection. */
+ ap_hard_timeout("proxy ftp", r);
+ i = ftp_getrc_msg(ctrl, resp, sizeof resp);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", i);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", i);
+ if (i == -1 || i == 421) {
+ return ftp_cleanup_and_return(r, ctrl, data, sock, dsock,
+ ap_proxyerror(r, HTTP_BAD_GATEWAY,
+@@ -743,17 +746,18 @@
+ }
+ #if 0
+ if (i == 120) {
+- /* RFC2068 states:
+- * 14.38 Retry-After
++ /*
++ * RFC2068 states: 14.38 Retry-After
+ *
+ * The Retry-After response-header field can be used with a 503 (Service
+- * Unavailable) response to indicate how long the service is expected to
+- * be unavailable to the requesting client. The value of this field can
+- * be either an HTTP-date or an integer number of seconds (in decimal)
+- * after the time of the response.
+- * Retry-After = "Retry-After" ":" ( HTTP-date | delta-seconds )
++ * Unavailable) response to indicate how long the service is expected
++ * to be unavailable to the requesting client. The value of this
++ * field can be either an HTTP-date or an integer number of seconds
++ * (in decimal) after the time of the response. Retry-After =
++ * "Retry-After" ":" ( HTTP-date | delta-seconds )
+ */
+- ap_set_header("Retry-After", ap_psprintf(p, "%u", 60*wait_mins);
++/**INDENT** Error@756: Unbalanced parens */
++ ap_set_header("Retry-After", ap_psprintf(p, "%u", 60 * wait_mins);
+ return ftp_cleanup_and_return(r, ctrl, data, sock, dsock,
+ ap_proxyerror(r, HTTP_SERVICE_UNAVAILABLE, resp));
+ }
+@@ -763,11 +767,11 @@
+ ap_proxyerror(r, HTTP_BAD_GATEWAY, resp));
+ }
+
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: connected.");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: connected.");
+
+ ap_bvputs(ctrl, "USER ", user, CRLF, NULL);
+ ap_bflush(ctrl); /* capture any errors */
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: USER %s", user);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: USER %s", user);
+
+ /* possible results; 230, 331, 332, 421, 500, 501, 530 */
+ /* states: 1 - error, 2 - success; 3 - send password, 4,5 fail */
+@@ -780,7 +784,7 @@
+ /* 501 Syntax error in parameters or arguments. */
+ /* 530 Not logged in. */
+ i = ftp_getrc(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", i);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", i);
+ if (i == -1 || i == 421) {
+ return ftp_cleanup_and_return(r, ctrl, data, sock, dsock,
+ ap_proxyerror(r, HTTP_BAD_GATEWAY,
+@@ -788,7 +792,7 @@
+ }
+ if (i == 530) {
+ return ftp_cleanup_and_return(r, ctrl, data, sock, dsock,
+- ftp_unauthorized (r, 1));
++ ftp_unauthorized(r, 1));
+ }
+ if (i != 230 && i != 331) {
+ return ftp_cleanup_and_return(r, ctrl, data, sock, dsock,
+@@ -798,11 +802,11 @@
+ if (i == 331) { /* send password */
+ if (password == NULL) {
+ return ftp_cleanup_and_return(r, ctrl, data, sock, dsock,
+- ftp_unauthorized (r, 0));
++ ftp_unauthorized(r, 0));
+ }
+ ap_bvputs(ctrl, "PASS ", password, CRLF, NULL);
+ ap_bflush(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: PASS %s", password);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: PASS %s", password);
+ /* possible results 202, 230, 332, 421, 500, 501, 503, 530 */
+ /* 230 User logged in, proceed. */
+ /* 332 Need account for login. */
+@@ -812,7 +816,7 @@
+ /* 503 Bad sequence of commands. */
+ /* 530 Not logged in. */
+ i = ftp_getrc(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", i);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", i);
+ if (i == -1 || i == 421) {
+ return ftp_cleanup_and_return(r, ctrl, data, sock, dsock,
+ ap_proxyerror(r, HTTP_BAD_GATEWAY,
+@@ -826,14 +830,15 @@
+ /* @@@ questionable -- we might as well return a 403 Forbidden here */
+ if (i == 530) /* log it: passwd guessing attempt? */
+ return ftp_cleanup_and_return(r, ctrl, data, sock, dsock,
+- ftp_unauthorized (r, 1));
++ ftp_unauthorized(r, 1));
+ if (i != 230 && i != 202)
+ return ftp_cleanup_and_return(r, ctrl, data, sock, dsock,
+ HTTP_BAD_GATEWAY);
+ }
+
+- /* Special handling for leading "%2f": this enforces a "cwd /"
+- * out of the $HOME directory which was the starting point after login
++ /*
++ * Special handling for leading "%2f": this enforces a "cwd /" out of the
++ * $HOME directory which was the starting point after login
+ */
+ if (strncasecmp(path, "%2f", 3) == 0) {
+ path += 3;
+@@ -841,7 +846,7 @@
+ ++path;
+ ap_bputs("CWD /" CRLF, ctrl);
+ ap_bflush(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: CWD /");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: CWD /");
+
+ /* possible results: 250, 421, 500, 501, 502, 530, 550 */
+ /* 250 Requested file action okay, completed. */
+@@ -852,7 +857,7 @@
+ /* 530 Not logged in. */
+ /* 550 Requested action not taken. */
+ i = ftp_getrc(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", i);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", i);
+ if (i == -1 || i == 421)
+ return ftp_cleanup_and_return(r, ctrl, data, sock, dsock,
+ ap_proxyerror(r, HTTP_BAD_GATEWAY,
+@@ -869,7 +874,7 @@
+ * this is what we must do if we don't know the OS type of the remote
+ * machine
+ */
+- for ( ; (strp = strchr(path, '/')) != NULL ; path = strp + 1) {
++ for (; (strp = strchr(path, '/')) != NULL; path = strp + 1) {
+ char *slash = strp;
+
+ *slash = '\0';
+@@ -888,7 +893,7 @@
+
+ ap_bvputs(ctrl, "CWD ", path, CRLF, NULL);
+ ap_bflush(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: CWD %s", path);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: CWD %s", path);
+ *slash = '/';
+
+ /* responses: 250, 421, 500, 501, 502, 530, 550 */
+@@ -900,7 +905,7 @@
+ /* 530 Not logged in. */
+ /* 550 Requested action not taken. */
+ i = ftp_getrc(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", i);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", i);
+ if (i == -1 || i == 421)
+ return ftp_cleanup_and_return(r, ctrl, data, sock, dsock,
+ ap_proxyerror(r, HTTP_BAD_GATEWAY,
+@@ -919,10 +924,11 @@
+
+ if (parms != NULL && strncmp(parms, "type=", 5) == 0
+ && ap_isalpha(parms[5])) {
+- /* "type=d" forces a dir listing.
+- * The other types (i|a|e) are directly used for the ftp TYPE command
++ /*
++ * "type=d" forces a dir listing. The other types (i|a|e) are
++ * directly used for the ftp TYPE command
+ */
+- if ( ! (get_dirlisting = (parms[5] == 'd')))
++ if (!(get_dirlisting = (parms[5] == 'd')))
+ xfer_type = ap_toupper(parms[5]);
+
+ /* Check valid types, rather than ignoring invalid types silently: */
+@@ -948,7 +954,7 @@
+ #if !defined (TPF) && !defined(BEOS)
+ if (conf->recv_buffer_size) {
+ if (setsockopt(dsock, SOL_SOCKET, SO_RCVBUF,
+- (const char *) &conf->recv_buffer_size, sizeof(int)) == -1) {
++ (const char *)&conf->recv_buffer_size, sizeof(int)) == -1) {
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
+ "setsockopt(SO_RCVBUF): Failed to set ProxyReceiveBufferSize, using default");
+ }
+@@ -957,7 +963,7 @@
+
+ ap_bputs("PASV" CRLF, ctrl);
+ ap_bflush(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: PASV command issued");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: PASV command issued");
+ /* possible results: 227, 421, 500, 501, 502, 530 */
+ /* 227 Entering Passive Mode (h1,h2,h3,h4,p1,p2). */
+ /* 421 Service not available, closing control connection. */
+@@ -979,9 +985,9 @@
+ presult = atoi(pstr);
+ if (*(pstr + strlen(pstr) + 1) == '=')
+ pstr += strlen(pstr) + 2;
+- else
+- {
+- pstr = strtok(NULL, "("); /* separate address & port params */
++ else {
++ pstr = strtok(NULL, "("); /* separate address & port
++ * params */
+ if (pstr != NULL)
+ pstr = strtok(NULL, ")");
+ }
+@@ -989,14 +995,14 @@
+ else
+ presult = atoi(pasv);
+
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", presult);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", presult);
+
+ if (presult == 227 && pstr != NULL && (sscanf(pstr,
+ "%d,%d,%d,%d,%d,%d", &h3, &h2, &h1, &h0, &p1, &p0) == 6)) {
+ /* pardon the parens, but it makes gcc happy */
+ paddr = (((((h3 << 8) + h2) << 8) + h1) << 8) + h0;
+ pport = (p1 << 8) + p0;
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: contacting host %d.%d.%d.%d:%d",
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: contacting host %d.%d.%d.%d:%d",
+ h3, h2, h1, h0, pport);
+ data_addr.sin_family = AF_INET;
+ data_addr.sin_addr.s_addr = htonl(paddr);
+@@ -1020,7 +1026,7 @@
+
+ if (!pasvmode) { /* set up data connection */
+ clen = sizeof(struct sockaddr_in);
+- if (getsockname(sock, (struct sockaddr *) &server, &clen) < 0) {
++ if (getsockname(sock, (struct sockaddr *)&server, &clen) < 0) {
+ return ftp_cleanup_and_return(r, ctrl, data, sock, dsock,
+ ap_proxyerror(r, HTTP_INTERNAL_SERVER_ERROR,
+ "proxy: error getting socket address"));
+@@ -1033,16 +1039,16 @@
+ "proxy: error creating socket"));
+ }
+
+- if (setsockopt(dsock, SOL_SOCKET, SO_REUSEADDR, (void *) &one,
++ if (setsockopt(dsock, SOL_SOCKET, SO_REUSEADDR, (void *)&one,
+ sizeof(one)) == -1) {
+ #ifndef _OSD_POSIX /* BS2000 has this option "always on" */
+ return ftp_cleanup_and_return(r, ctrl, data, sock, dsock,
+ ap_proxyerror(r, HTTP_INTERNAL_SERVER_ERROR,
+ "proxy: error setting reuseaddr option"));
+-#endif /*_OSD_POSIX*/
++#endif /* _OSD_POSIX */
+ }
+
+- if (bind(dsock, (struct sockaddr *) &server,
++ if (bind(dsock, (struct sockaddr *)&server,
+ sizeof(struct sockaddr_in)) == -1) {
+
+ return ftp_cleanup_and_return(r, ctrl, data, sock, dsock,
+@@ -1068,16 +1074,16 @@
+ else {
+ ap_bvputs(ctrl, "SIZE ", path, CRLF, NULL);
+ ap_bflush(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: SIZE %s", path);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: SIZE %s", path);
+ i = ftp_getrc_msg(ctrl, resp, sizeof resp);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d with response %s", i, resp);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d with response %s", i, resp);
+ if (i != 500) { /* Size command not recognized */
+ if (i == 550) { /* Not a regular file */
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: SIZE shows this is a directory");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: SIZE shows this is a directory");
+ get_dirlisting = 1;
+ ap_bvputs(ctrl, "CWD ", path, CRLF, NULL);
+ ap_bflush(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: CWD %s", path);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: CWD %s", path);
+
+ /* possible results: 250, 421, 500, 501, 502, 530, 550 */
+ /* 250 Requested file action okay, completed. */
+@@ -1088,7 +1094,7 @@
+ /* 530 Not logged in. */
+ /* 550 Requested action not taken. */
+ i = ftp_getrc(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", i);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", i);
+ if (i == -1 || i == 421)
+ return ftp_cleanup_and_return(r, ctrl, data, sock, dsock,
+ ap_proxyerror(r, HTTP_BAD_GATEWAY,
+@@ -1102,9 +1108,8 @@
+ path = "";
+ len = 0;
+ }
+- else if (i == 213) { /* Size command ok */
+- for (j = 0; j < sizeof resp && ap_isdigit(resp[j]); j++)
+- ;
++ else if (i == 213) {/* Size command ok */
++ for (j = 0; j < sizeof resp && ap_isdigit(resp[j]); j++);
+ resp[j] = '\0';
+ if (resp[0] != '\0')
+ size = ap_pstrdup(p, resp);
+@@ -1115,7 +1120,7 @@
+ #ifdef AUTODETECT_PWD
+ ap_bvputs(ctrl, "PWD", CRLF, NULL);
+ ap_bflush(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: PWD");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: PWD");
+ /* responses: 257, 500, 501, 502, 421, 550 */
+ /* 257 "<directory-name>" <commentary> */
+ /* 421 Service not available, closing control connection. */
+@@ -1124,7 +1129,7 @@
+ /* 502 Command not implemented. */
+ /* 550 Requested action not taken. */
+ i = ftp_getrc_msg(ctrl, resp, sizeof resp);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: PWD returned status %d", i);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: PWD returned status %d", i);
+ if (i == -1 || i == 421)
+ return ftp_cleanup_and_return(r, ctrl, data, sock, dsock,
+ ap_proxyerror(r, HTTP_BAD_GATEWAY,
+@@ -1136,19 +1141,19 @@
+ const char *dirp = resp;
+ cwd = ap_getword_conf(r->pool, &dirp);
+ }
+-#endif /*AUTODETECT_PWD*/
++#endif /* AUTODETECT_PWD */
+
+ if (get_dirlisting) {
+ if (len != 0)
+ ap_bvputs(ctrl, "LIST ", path, CRLF, NULL);
+ else
+ ap_bputs("LIST -lag" CRLF, ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: LIST %s", (len == 0 ? "" : path));
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: LIST %s", (len == 0 ? "" : path));
+ }
+ else {
+ ftp_set_TYPE(r, ctrl, xfer_type);
+ ap_bvputs(ctrl, "RETR ", path, CRLF, NULL);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: RETR %s", path);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: RETR %s", path);
+ }
+ ap_bflush(ctrl);
+ /* RETR: 110, 125, 150, 226, 250, 421, 425, 426, 450, 451, 500, 501, 530, 550
+@@ -1168,19 +1173,20 @@
+ /* 530 Not logged in. */
+ /* 550 Requested action not taken. */
+ rc = ftp_getrc(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", rc);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", rc);
+ if (rc == -1 || rc == 421)
+ return ftp_cleanup_and_return(r, ctrl, data, sock, dsock,
+ ap_proxyerror(r, HTTP_BAD_GATEWAY,
+ "Error reading from remote server"));
+ if (rc == 550) {
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: RETR failed, trying LIST instead");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: RETR failed, trying LIST instead");
+ get_dirlisting = 1;
+- ftp_set_TYPE(r, ctrl, 'A'); /* directories must be transferred in ASCII */
++ ftp_set_TYPE(r, ctrl, 'A'); /* directories must be transferred in
++ * ASCII */
+
+ ap_bvputs(ctrl, "CWD ", path, CRLF, NULL);
+ ap_bflush(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: CWD %s", path);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: CWD %s", path);
+ /* possible results: 250, 421, 500, 501, 502, 530, 550 */
+ /* 250 Requested file action okay, completed. */
+ /* 421 Service not available, closing control connection. */
+@@ -1190,7 +1196,7 @@
+ /* 530 Not logged in. */
+ /* 550 Requested action not taken. */
+ rc = ftp_getrc(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", rc);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", rc);
+ if (rc == -1 || rc == 421)
+ return ftp_cleanup_and_return(r, ctrl, data, sock, dsock,
+ ap_proxyerror(r, HTTP_BAD_GATEWAY,
+@@ -1205,7 +1211,7 @@
+ #ifdef AUTODETECT_PWD
+ ap_bvputs(ctrl, "PWD", CRLF, NULL);
+ ap_bflush(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: PWD");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: PWD");
+ /* responses: 257, 500, 501, 502, 421, 550 */
+ /* 257 "<directory-name>" <commentary> */
+ /* 421 Service not available, closing control connection. */
+@@ -1214,7 +1220,7 @@
+ /* 502 Command not implemented. */
+ /* 550 Requested action not taken. */
+ i = ftp_getrc_msg(ctrl, resp, sizeof resp);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: PWD returned status %d", i);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: PWD returned status %d", i);
+ if (i == -1 || i == 421)
+ return ftp_cleanup_and_return(r, ctrl, data, sock, dsock,
+ ap_proxyerror(r, HTTP_BAD_GATEWAY,
+@@ -1226,13 +1232,13 @@
+ const char *dirp = resp;
+ cwd = ap_getword_conf(r->pool, &dirp);
+ }
+-#endif /*AUTODETECT_PWD*/
++#endif /* AUTODETECT_PWD */
+
+ ap_bputs("LIST -lag" CRLF, ctrl);
+ ap_bflush(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: LIST -lag");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: LIST -lag");
+ rc = ftp_getrc(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", rc);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", rc);
+ if (rc == -1 || rc == 421)
+ return ftp_cleanup_and_return(r, ctrl, data, sock, dsock,
+ ap_proxyerror(r, HTTP_BAD_GATEWAY,
+@@ -1260,11 +1266,12 @@
+ }
+ else {
+ #ifdef CHARSET_EBCDIC
+- r->ebcdic.conv_out = 0; /* do not convert what we read from the ftp server */
++ r->ebcdic.conv_out = 0; /* do not convert what we read from the ftp
++ * server */
+ #endif
+ if (r->content_type != NULL) {
+ ap_table_setn(resp_hdrs, "Content-Type", r->content_type);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: Content-Type set to %s", r->content_type);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: Content-Type set to %s", r->content_type);
+ }
+ else {
+ ap_table_setn(resp_hdrs, "Content-Type", ap_default_type(r));
+@@ -1272,11 +1279,11 @@
+ if (xfer_type != 'A' && size != NULL) {
+ /* We "trust" the ftp server to really serve (size) bytes... */
+ ap_table_set(resp_hdrs, "Content-Length", size);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: Content-Length set to %s", size);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: Content-Length set to %s", size);
+ }
+ }
+ if (r->content_encoding != NULL && r->content_encoding[0] != '\0') {
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: Content-Encoding set to %s", r->content_encoding);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: Content-Encoding set to %s", r->content_encoding);
+ ap_table_setn(resp_hdrs, "Content-Encoding", r->content_encoding);
+ }
+
+@@ -1303,7 +1310,7 @@
+ ap_hard_timeout("proxy ftp data connect", r);
+ clen = sizeof(struct sockaddr_in);
+ do
+- csd = accept(dsock, (struct sockaddr *) &server, &clen);
++ csd = accept(dsock, (struct sockaddr *)&server, &clen);
+ while (csd == -1 && errno == EINTR);
+ if (csd == -1) {
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
+@@ -1335,7 +1342,7 @@
+ ap_pstrcat(r->pool, "MISS from ",
+ ap_get_server_name(r), NULL));
+ /* The Content-Type of this response is the upstream one. */
+- r->content_type = ap_table_get (r->headers_out, "Content-Type");
++ r->content_type = ap_table_get(r->headers_out, "Content-Type");
+ /* finally output the headers to the client */
+ ap_send_http_header(r);
+
+@@ -1348,7 +1355,7 @@
+ /* we need to set this for ap_proxy_send_fb()... */
+ if (c != NULL)
+ c->cache_completion = 0;
+- ap_proxy_send_fb(data, r, c, -1, 0, conf->io_buffer_size);
++ ap_proxy_send_fb(data, r, c, -1, 0, 0, conf->io_buffer_size);
+ }
+ else {
+ send_dir(data, r, c, cwd);
+@@ -1357,8 +1364,9 @@
+ data = NULL;
+ dsock = -1;
+
+- /* We checked for 125||150||226||250 above.
+- * See if another rc is pending, and fetch it:
++ /*
++ * We checked for 125||150||226||250 above. See if another rc is
++ * pending, and fetch it:
+ */
+ if (rc == 125 || rc == 150)
+ rc = ftp_getrc(ctrl);
+@@ -1372,7 +1380,7 @@
+ data = NULL;
+ dsock = -1;
+ }
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: ABOR");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: ABOR");
+ /* responses: 225, 226, 421, 500, 501, 502 */
+ /* 225 Data connection open; no transfer in progress. */
+ /* 226 Closing data connection. */
+@@ -1381,7 +1389,7 @@
+ /* 501 Syntax error in parameters or arguments. */
+ /* 502 Command not implemented. */
+ i = ftp_getrc(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", i);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", i);
+ }
+
+ ap_kill_timeout(r);
+@@ -1390,12 +1398,12 @@
+ /* finish */
+ ap_bputs("QUIT" CRLF, ctrl);
+ ap_bflush(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: QUIT");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: QUIT");
+ /* responses: 221, 500 */
+ /* 221 Service closing control connection. */
+ /* 500 Syntax error, command unrecognized. */
+ i = ftp_getrc(ctrl);
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: QUIT: status %d", i);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: QUIT: status %d", i);
+
+ ap_bclose(ctrl);
+
+Index: modules/proxy/proxy_http.c
+===================================================================
+RCS file: /home/cvs/apache-1.3/src/modules/proxy/proxy_http.c,v
+retrieving revision 1.88
+retrieving revision 1.95
+diff -u -b -u -r1.88 -r1.95
+--- modules/proxy/proxy_http.c 21 Mar 2002 11:38:03 -0000 1.88
++++ modules/proxy/proxy_http.c 17 Apr 2002 16:04:32 -0000 1.95
+@@ -76,8 +76,8 @@
+ const char *err;
+ int port;
+
+- /* do syntatic check.
+- * We break the URL into host, port, path, search
++ /*
++ * do syntatic check. We break the URL into host, port, path, search
+ */
+ port = def_port;
+ err = ap_proxy_canon_netloc(r->pool, &url, NULL, NULL, &host, &port);
+@@ -85,9 +85,10 @@
+ return HTTP_BAD_REQUEST;
+
+ /* now parse path/search args, according to rfc1738 */
+- /* N.B. if this isn't a true proxy request, then the URL _path_
+- * has already been decoded. True proxy requests have r->uri
+- * == r->unparsed_uri, and no others have that property.
++ /*
++ * N.B. if this isn't a true proxy request, then the URL _path_ has
++ * already been decoded. True proxy requests have r->uri ==
++ * r->unparsed_uri, and no others have that property.
+ */
+ if (r->uri == r->unparsed_uri) {
+ search = strchr(url, '?');
+@@ -163,18 +164,21 @@
+ char portstr[32];
+ pool *p = r->pool;
+ int destport = 0;
++ int chunked = 0;
+ char *destportstr = NULL;
+ const char *urlptr = NULL;
+ const char *datestr, *urlstr;
++ const char *content_length;
+
+ void *sconf = r->server->module_config;
+ proxy_server_conf *conf =
+- (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module);
++ (proxy_server_conf *)ap_get_module_config(sconf, &proxy_module);
+ struct noproxy_entry *npent = (struct noproxy_entry *) conf->noproxies->elts;
+ struct nocache_entry *ncent = (struct nocache_entry *) conf->nocaches->elts;
+ int nocache = 0;
+
+- if (conf->cache.root == NULL) nocache = 1;
++ if (conf->cache.root == NULL)
++ nocache = 1;
+
+ memset(&server, '\0', sizeof(server));
+ server.sin_family = AF_INET;
+@@ -232,8 +236,9 @@
+ }
+
+
+- /* we have worked out who exactly we are going to connect to, now
+- * make that connection...
++ /*
++ * we have worked out who exactly we are going to connect to, now make
++ * that connection...
+ */
+ sock = ap_psocket(p, PF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if (sock == -1) {
+@@ -245,7 +250,7 @@
+ #if !defined(TPF) && !defined(BEOS)
+ if (conf->recv_buffer_size) {
+ if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF,
+- (const char *) &conf->recv_buffer_size, sizeof(int))
++ (const char *)&conf->recv_buffer_size, sizeof(int))
+ == -1) {
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
+ "setsockopt(SO_RCVBUF): Failed to set ProxyReceiveBufferSize, using default");
+@@ -255,7 +260,7 @@
+
+ #ifdef SINIX_D_RESOLVER_BUG
+ {
+- struct in_addr *ip_addr = (struct in_addr *) *server_hp.h_addr_list;
++ struct in_addr *ip_addr = (struct in_addr *)*server_hp.h_addr_list;
+
+ for (; ip_addr->s_addr != 0; ++ip_addr) {
+ memcpy(&server.sin_addr, ip_addr, sizeof(struct in_addr));
+@@ -287,16 +292,17 @@
+ /* record request_time for HTTP/1.1 age calculation */
+ c->req_time = time(NULL);
+
+- /* build upstream-request headers by stripping r->headers_in from
+- * connection specific headers.
+- * We must not remove the Connection: header from r->headers_in,
+- * we still have to react to Connection: close
++ /*
++ * build upstream-request headers by stripping r->headers_in from
++ * connection specific headers. We must not remove the Connection: header
++ * from r->headers_in, we still have to react to Connection: close
+ */
+ req_hdrs = ap_copy_table(r->pool, r->headers_in);
+ ap_proxy_clear_connection(r->pool, req_hdrs);
+
+- /* At this point, we start sending the HTTP/1.1 request to the
+- * remote server (proxy or otherwise).
++ /*
++ * At this point, we start sending the HTTP/1.1 request to the remote
++ * server (proxy or otherwise).
+ */
+ f = ap_bcreate(p, B_RDWR | B_SOCKET);
+ ap_bpushfd(f, sock, sock);
+@@ -313,12 +319,14 @@
+ if (conf->viaopt == via_block) {
+ /* Block all outgoing Via: headers */
+ ap_table_unset(req_hdrs, "Via");
+- } else if (conf->viaopt != via_off) {
++ }
++ else if (conf->viaopt != via_off) {
+ /* Create a "Via:" request header entry and merge it */
+ i = ap_get_server_port(r);
+- if (ap_is_default_port(i,r)) {
+- strcpy(portstr,"");
+- } else {
++ if (ap_is_default_port(i, r)) {
++ strcpy(portstr, "");
++ }
++ else {
+ ap_snprintf(portstr, sizeof portstr, ":%d", i);
+ }
+ /* Generate outgoing Via: header with/without server comment: */
+@@ -336,20 +344,23 @@
+ );
+ }
+
+- /* Add X-Forwarded-For: so that the upstream has a chance to
+- determine, where the original request came from. */
++ /*
++ * Add X-Forwarded-For: so that the upstream has a chance to determine,
++ * where the original request came from.
++ */
+ ap_table_mergen(req_hdrs, "X-Forwarded-For", r->connection->remote_ip);
+
+ /* we don't yet support keepalives - but we will soon, I promise! */
+ ap_table_set(req_hdrs, "Connection", "close");
+
+ reqhdrs_arr = ap_table_elts(req_hdrs);
+- reqhdrs_elts = (table_entry *) reqhdrs_arr->elts;
++ reqhdrs_elts = (table_entry *)reqhdrs_arr->elts;
+ for (i = 0; i < reqhdrs_arr->nelts; i++) {
+ if (reqhdrs_elts[i].key == NULL || reqhdrs_elts[i].val == NULL
+
+- /* Clear out hop-by-hop request headers not to send:
+- * RFC2616 13.5.1 says we should strip these headers:
++ /*
++ * Clear out hop-by-hop request headers not to send: RFC2616 13.5.1
++ * says we should strip these headers:
+ */
+ || !strcasecmp(reqhdrs_elts[i].key, "Host") /* Already sent */
+ || !strcasecmp(reqhdrs_elts[i].key, "Keep-Alive")
+@@ -357,15 +368,15 @@
+ || !strcasecmp(reqhdrs_elts[i].key, "Trailer")
+ || !strcasecmp(reqhdrs_elts[i].key, "Transfer-Encoding")
+ || !strcasecmp(reqhdrs_elts[i].key, "Upgrade")
+-
+- /* XXX: @@@ FIXME: "Proxy-Authorization" should *only* be
+- * suppressed if THIS server requested the authentication,
+- * not when a frontend proxy requested it!
++ /*
++ * XXX: @@@ FIXME: "Proxy-Authorization" should *only* be suppressed
++ * if THIS server requested the authentication, not when a frontend
++ * proxy requested it!
+ *
+- * The solution to this problem is probably to strip out
+- * the Proxy-Authorisation header in the authorisation
+- * code itself, not here. This saves us having to signal
+- * somehow whether this request was authenticated or not.
++ * The solution to this problem is probably to strip out the
++ * Proxy-Authorisation header in the authorisation code itself, not
++ * here. This saves us having to signal somehow whether this request
++ * was authenticated or not.
+ */
+ || !strcasecmp(reqhdrs_elts[i].key, "Proxy-Authorization"))
+ continue;
+@@ -377,14 +388,17 @@
+
+ /* send the request data, if any. */
+ if (ap_should_client_block(r)) {
+- while ((i = ap_get_client_block(r, buffer, sizeof buffer)) > 0)
++ while ((i = ap_get_client_block(r, buffer, sizeof buffer)) > 0) {
++ ap_reset_timeout(r);
+ ap_bwrite(f, buffer, i);
+ }
++ }
+ ap_bflush(f);
+ ap_kill_timeout(r);
+
+
+- /* Right - now it's time to listen for a response.
++ /*
++ * Right - now it's time to listen for a response.
+ */
+ ap_hard_timeout("proxy receive", r);
+
+@@ -397,16 +411,17 @@
+ proxyhost ? proxyhost : desthost, len);
+ return ap_proxyerror(r, HTTP_BAD_GATEWAY,
+ "Error reading from remote server");
+- } else if (len == 0) {
++ }
++ else if (len == 0) {
+ ap_bclose(f);
+ ap_kill_timeout(r);
+ return ap_proxyerror(r, HTTP_BAD_GATEWAY,
+ "Document contains no data");
+ }
+
+- /* Is it an HTTP/1 response?
+- * Do some sanity checks on the response.
+- * (This is buggy if we ever see an HTTP/1.10)
++ /*
++ * Is it an HTTP/1 response? Do some sanity checks on the response. (This
++ * is buggy if we ever see an HTTP/1.10)
+ */
+ if (ap_checkmask(buffer, "HTTP/#.# ###*")) {
+ int major, minor;
+@@ -436,7 +451,7 @@
+
+ resp_hdrs = ap_proxy_read_headers(r, buffer, HUGE_STRING_LEN, f);
+ if (resp_hdrs == NULL) {
+- ap_log_error(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, r->server,
++ ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_NOERRNO, r->server,
+ "proxy: Bad HTTP/%d.%d header returned by %s (%s)",
+ major, minor, r->uri, r->method);
+ resp_hdrs = ap_make_table(p, 20);
+@@ -447,9 +462,10 @@
+ if (conf->viaopt != via_off && conf->viaopt != via_block) {
+ /* Create a "Via:" response header entry and merge it */
+ i = ap_get_server_port(r);
+- if (ap_is_default_port(i,r)) {
+- strcpy(portstr,"");
+- } else {
++ if (ap_is_default_port(i, r)) {
++ strcpy(portstr, "");
++ }
++ else {
+ ap_snprintf(portstr, sizeof portstr, ":%d", i);
+ }
+ ap_table_mergen((table *)resp_hdrs, "Via",
+@@ -464,11 +480,21 @@
+ );
+ }
+
+- /* strip hop-by-hop headers defined by Connection */
++ /* is this content chunked? */
++ chunked = ap_find_last_token(r->pool,
++ ap_table_get(resp_hdrs, "Transfer-Encoding"),
++ "chunked");
++
++ /* strip hop-by-hop headers defined by Connection and RFC2616 */
+ ap_proxy_clear_connection(p, resp_hdrs);
++
++ content_length = ap_table_get(resp_hdrs, "Content-Length");
++ if (content_length != NULL)
++ c->len = strtol(content_length, NULL, 10);
++
+ /* Now add out bound headers set by other modules */
+ resp_hdrs = ap_overlay_tables(r->pool, r->err_headers_out, resp_hdrs);
+-}
++ }
+ else {
+ /* an http/0.9 response */
+ backasswards = 1;
+@@ -482,10 +508,11 @@
+ ap_kill_timeout(r);
+
+ /*
+- * HTTP/1.1 requires us to accept 3 types of dates, but only generate
+- * one type
++ * HTTP/1.1 requires us to accept 3 types of dates, but only generate one
++ * type
+ */
+- /* we SET the dates here, obliterating possible multiple dates, as only
++ /*
++ * we SET the dates here, obliterating possible multiple dates, as only
+ * one of each date makes sense in each response.
+ */
+ if ((datestr = ap_table_get(resp_hdrs, "Date")) != NULL)
+@@ -501,7 +528,7 @@
+ if ((urlstr = ap_table_get(resp_hdrs, "URI")) != NULL)
+ ap_table_set(resp_hdrs, "URI", proxy_location_reverse_map(r, urlstr));
+ if ((urlstr = ap_table_get(resp_hdrs, "Content-Location")) != NULL)
+- ap_table_set(resp_hdrs, "Content-Location", proxy_location_reverse_map(r , urlstr));
++ ap_table_set(resp_hdrs, "Content-Location", proxy_location_reverse_map(r, urlstr));
+
+ /* check if NoCache directive on this host */
+ if (nocache == 0) {
+@@ -515,8 +542,9 @@
+ }
+ }
+
+- /* update the cache file, possibly even fulfilling the request if
+- * it turns out a conditional allowed us to serve the object from the
++ /*
++ * update the cache file, possibly even fulfilling the request if it
++ * turns out a conditional allowed us to serve the object from the
+ * cache...
+ */
+ i = ap_proxy_cache_update(c, resp_hdrs, !backasswards, nocache);
+@@ -530,20 +558,22 @@
+ }
+
+ /* Setup the headers for our client from upstreams response-headers */
+- ap_overlap_tables(r->headers_out, resp_hdrs, AP_OVERLAP_TABLES_SET);
++ ap_proxy_table_replace(r->headers_out, resp_hdrs);
+ /* Add X-Cache header - be careful not to obliterate any upstream headers */
+ ap_table_mergen(r->headers_out, "X-Cache",
+ ap_pstrcat(r->pool, "MISS from ",
+ ap_get_server_name(r), NULL));
+ /* The Content-Type of this response is the upstream one. */
+- r->content_type = ap_table_get (r->headers_out, "Content-Type");
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Content-Type: %s", r->content_type);
++ r->content_type = ap_table_get(r->headers_out, "Content-Type");
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Content-Type: %s", r->content_type);
+
+ /* finally output the headers to the client */
+ ap_send_http_header(r);
+
+- /* Is it an HTTP/0.9 respose? If so, send the extra data we read
+- from upstream as the start of the reponse to client */
++ /*
++ * Is it an HTTP/0.9 respose? If so, send the extra data we read from
++ * upstream as the start of the reponse to client
++ */
+ if (backasswards) {
+ ap_hard_timeout("proxy send assbackward", r);
+
+@@ -558,11 +588,13 @@
+
+
+ #ifdef CHARSET_EBCDIC
+- /* What we read/write after the header should not be modified
+- * (i.e., the cache copy is ASCII, not EBCDIC, even for text/html)
++ /*
++ * What we read/write after the header should not be modified (i.e., the
++ * cache copy is ASCII, not EBCDIC, even for text/html)
+ */
+- ap_bsetflag(f, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 0);
+- ap_bsetflag(r->connection->client, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 0);
++ r->ebcdic.conv_in = r->ebcdic.conv_out = 0;
++ ap_bsetflag(f, B_ASCII2EBCDIC | B_EBCDIC2ASCII, 0);
++ ap_bsetflag(r->connection->client, B_ASCII2EBCDIC | B_EBCDIC2ASCII, 0);
+ #endif
+
+ /* send body */
+@@ -578,7 +610,7 @@
+ * content length is not known. We need to make 100% sure c->len is always
+ * set correctly before we get here to correctly do keepalive.
+ */
+- ap_proxy_send_fb(f, r, c, c->len, 0, conf->io_buffer_size);
++ ap_proxy_send_fb(f, r, c, c->len, 0, chunked, conf->io_buffer_size);
+ }
+
+ /* ap_proxy_send_fb() closes the socket f for us */
+Index: modules/proxy/proxy_util.c
+===================================================================
+RCS file: /home/cvs/apache-1.3/src/modules/proxy/proxy_util.c,v
+retrieving revision 1.109
+retrieving revision 1.119
+diff -u -b -u -r1.109 -r1.119
+--- modules/proxy/proxy_util.c 21 Mar 2002 11:38:03 -0000 1.109
++++ modules/proxy/proxy_util.c 15 Apr 2002 09:41:22 -0000 1.119
+@@ -73,9 +73,10 @@
+ /* already called in the knowledge that the characters are hex digits */
+ int ap_proxy_hex2c(const char *x)
+ {
+- int i, ch;
+-
++ int i;
+ #ifndef CHARSET_EBCDIC
++ int ch;
++
+ ch = x[0];
+ if (ap_isdigit(ch))
+ i = ch - '0';
+@@ -93,9 +94,9 @@
+ else
+ i += ch - ('a' - 10);
+ return i;
+-#else /*CHARSET_EBCDIC*/
+- return (1 == sscanf(x, "%2x", &i)) ? os_toebcdic[i&0xFF] : 0;
+-#endif /*CHARSET_EBCDIC*/
++#else /* CHARSET_EBCDIC */
++ return (1 == sscanf(x, "%2x", &i)) ? os_toebcdic[i & 0xFF] : 0;
++#endif /* CHARSET_EBCDIC */
+ }
+
+ void ap_proxy_c2hex(int ch, char *x)
+@@ -115,14 +116,14 @@
+ x[2] = ('A' - 10) + i;
+ else
+ x[2] = '0' + i;
+-#else /*CHARSET_EBCDIC*/
+- static const char ntoa[] = { "0123456789ABCDEF" };
++#else /* CHARSET_EBCDIC */
++ static const char ntoa[] = {"0123456789ABCDEF"};
+ ch = os_toascii[ch & 0xFF];
+ x[0] = '%';
+- x[1] = ntoa[(ch>>4)&0x0F];
+- x[2] = ntoa[ch&0x0F];
++ x[1] = ntoa[(ch >> 4) & 0x0F];
++ x[2] = ntoa[ch & 0x0F];
+ x[3] = '\0';
+-#endif /*CHARSET_EBCDIC*/
++#endif /* CHARSET_EBCDIC */
+ }
+
+ /*
+@@ -267,7 +268,8 @@
+ /* if (i == 0) the no port was given; keep default */
+ if (strp[i] != '\0') {
+ return "Bad port number in URL";
+- } else if (i > 0) {
++ }
++ else if (i > 0) {
+ *port = atoi(strp);
+ if (*port > 65535)
+ return "Port number in URL > 65535";
+@@ -299,7 +301,7 @@
+ return NULL;
+ }
+
+-static const char * const lwday[7] =
++static const char *const lwday[7] =
+ {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
+
+ /*
+@@ -365,63 +367,6 @@
+ }
+
+
+-/* NOTE: This routine is taken from http_protocol::getline()
+- * because the old code found in the proxy module was too
+- * difficult to understand and maintain.
+- */
+-/* Get a line of protocol input, including any continuation lines
+- * caused by MIME folding (or broken clients) if fold != 0, and place it
+- * in the buffer s, of size n bytes, without the ending newline.
+- *
+- * Returns -1 on error, or the length of s.
+- *
+- * Note: Because bgets uses 1 char for newline and 1 char for NUL,
+- * the most we can get is (n - 2) actual characters if it
+- * was ended by a newline, or (n - 1) characters if the line
+- * length exceeded (n - 1). So, if the result == (n - 1),
+- * then the actual input line exceeded the buffer length,
+- * and it would be a good idea for the caller to puke 400 or 414.
+- */
+-static int proxy_getline(char *s, int n, BUFF *in, int fold)
+-{
+- char *pos, next;
+- int retval;
+- int total = 0;
+-
+- pos = s;
+-
+- do {
+- retval = ap_bgets(pos, n, in); /* retval == -1 if error, 0 if EOF */
+-
+- if (retval <= 0)
+- return ((retval < 0) && (total == 0)) ? -1 : total;
+-
+- /* retval is the number of characters read, not including NUL */
+-
+- n -= retval; /* Keep track of how much of s is full */
+- pos += (retval - 1); /* and where s ends */
+- total += retval; /* and how long s has become */
+-
+- if (*pos == '\n') { /* Did we get a full line of input? */
+- *pos = '\0';
+- --total;
+- ++n;
+- }
+- else
+- return total; /* if not, input line exceeded buffer size */
+-
+- /* Continue appending if line folding is desired and
+- * the last line was not empty and we have room in the buffer and
+- * the next line begins with a continuation character.
+- */
+- } while (fold && (retval != 1) && (n > 1)
+- && (ap_blookc(&next, in) == 1)
+- && ((next == ' ') || (next == '\t')));
+-
+- return total;
+-}
+-
+-
+ /*
+ * Reads headers from a buffer and returns an array of headers.
+ * Returns NULL on file error
+@@ -445,37 +390,40 @@
+ * Read header lines until we get the empty separator line, a read error,
+ * the connection closes (EOF), or we timeout.
+ */
+- while ((len = proxy_getline(buffer, size, f, 1)) > 0) {
++ while ((len = ap_getline(buffer, size, f, 1)) > 0) {
+
+ if (!(value = strchr(buffer, ':'))) { /* Find the colon separator */
+
+- /* Buggy MS IIS servers sometimes return invalid headers
+- * (an extra "HTTP/1.0 200, OK" line sprinkled in between
+- * the usual MIME headers). Try to deal with it in a sensible
+- * way, but log the fact.
+- * XXX: The mask check is buggy if we ever see an HTTP/1.10 */
++ /*
++ * Buggy MS IIS servers sometimes return invalid headers (an
++ * extra "HTTP/1.0 200, OK" line sprinkled in between the usual
++ * MIME headers). Try to deal with it in a sensible way, but log
++ * the fact. XXX: The mask check is buggy if we ever see an
++ * HTTP/1.10
++ */
+
+ if (!ap_checkmask(buffer, "HTTP/#.# ###*")) {
+ /* Nope, it wasn't even an extra HTTP header. Give up. */
+ return NULL;
+ }
+
+- ap_log_error(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, r->server,
+- "proxy: Ignoring duplicate HTTP header "
+- "returned by %s (%s)", r->uri, r->method);
++ ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_NOERRNO, r->server,
++ "proxy: Ignoring duplicate HTTP status line "
++ "returned by buggy server %s (%s)", r->uri, r->method);
+ continue;
+ }
+
+ *value = '\0';
+ ++value;
+- /* XXX: RFC2068 defines only SP and HT as whitespace, this test is
++ /*
++ * XXX: RFC2068 defines only SP and HT as whitespace, this test is
+ * wrong... and so are many others probably.
+ */
+ while (ap_isspace(*value))
+ ++value; /* Skip to start of value */
+
+ /* should strip trailing whitespace as well */
+- for (end = &value[strlen(value)-1]; end > value && ap_isspace(*end); --end)
++ for (end = &value[strlen(value) - 1]; end > value && ap_isspace(*end); --end)
+ *end = '\0';
+
+ /* make sure we add so as not to destroy duplicated headers */
+@@ -483,7 +431,7 @@
+
+ /* the header was too long; at the least we should skip extra data */
+ if (len >= size - 1) {
+- while ((len = proxy_getline(field, MAX_STRING_LEN, f, 1))
++ while ((len = ap_getline(field, MAX_STRING_LEN, f, 1))
+ >= MAX_STRING_LEN - 1) {
+ /* soak up the extra data */
+ }
+@@ -494,23 +442,28 @@
+ return resp_hdrs;
+ }
+
+-/* read data from f, write it to:
++/* read data from (socket BUFF*) f, write it to:
+ * - c->fp, if it is open
+ * - r->connection->client, if nowrite == 0
+ */
+
+-long int ap_proxy_send_fb(BUFF *f, request_rec *r, cache_req *c, off_t len, int nowrite, size_t recv_buffer_size)
++long int ap_proxy_send_fb(BUFF *f, request_rec *r, cache_req *c, off_t len, int nowrite, int chunked, size_t recv_buffer_size)
+ {
+- int ok;
++ int ok, end_of_chunk;
+ char *buf;
+ size_t buf_size;
++ size_t remaining = 0;
+ long total_bytes_rcvd;
+- register int n, o, w;
++ register int n = 0, o, w;
+ conn_rec *con = r->connection;
+- int alternate_timeouts = 1; /* 1 if we alternate between soft & hard timeouts */
++ int alternate_timeouts = 1; /* 1 if we alternate between soft & hard
++ * timeouts */
+
+ /* allocate a buffer to store the bytes in */
+- /* make sure it is at least IOBUFSIZE, as recv_buffer_size may be zero for system default */
++ /*
++ * make sure it is at least IOBUFSIZE, as recv_buffer_size may be zero
++ * for system default
++ */
+ buf_size = MAX(recv_buffer_size, IOBUFSIZE);
+ buf = ap_palloc(r->pool, buf_size);
+
+@@ -520,15 +473,14 @@
+
+ #ifdef CHARSET_EBCDIC
+ /* The cache copy is ASCII, not EBCDIC, even for text/html) */
+- ap_bsetflag(f, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 0);
+- if (c != NULL && c->fp != NULL)
+- ap_bsetflag(c->fp, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 0);
+- ap_bsetflag(con->client, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 0);
++ ap_bsetflag(f, B_ASCII2EBCDIC | B_EBCDIC2ASCII, 0);
++ ap_bsetflag(con->client, B_ASCII2EBCDIC | B_EBCDIC2ASCII, 0);
+ #endif
+
+- /* Since we are reading from one buffer and writing to another,
+- * it is unsafe to do a soft_timeout here, at least until the proxy
+- * has its own timeout handler which can set both buffers to EOUT.
++ /*
++ * Since we are reading from one buffer and writing to another, it is
++ * unsafe to do a soft_timeout here, at least until the proxy has its own
++ * timeout handler which can set both buffers to EOUT.
+ */
+
+ ap_kill_timeout(r);
+@@ -538,12 +490,13 @@
+ ap_hard_timeout("proxy send body", r);
+ alternate_timeouts = 0;
+ #else
+- /* CHECKME! Since hard_timeout won't work in unix on sends with partial
+- * cache completion, we have to alternate between hard_timeout
+- * for reads, and soft_timeout for send. This is because we need
+- * to get a return from ap_bwrite to be able to continue caching.
+- * BUT, if we *can't* continue anyway, just use hard_timeout.
+- * (Also, if no cache file is written, use hard timeouts)
++ /*
++ * CHECKME! Since hard_timeout won't work in unix on sends with partial
++ * cache completion, we have to alternate between hard_timeout for reads,
++ * and soft_timeout for send. This is because we need to get a return
++ * from ap_bwrite to be able to continue caching. BUT, if we *can't*
++ * continue anyway, just use hard_timeout. (Also, if no cache file is
++ * written, use hard timeouts)
+ */
+
+ if (c == NULL || c->len <= 0 || c->cache_completion == 1.0) {
+@@ -552,22 +505,92 @@
+ }
+ #endif
+
+- /* Loop and ap_bread() while we can successfully read and write,
+- * or (after the client aborted) while we can successfully
+- * read and finish the configured cache_completion.
++ /*
++ * Loop and ap_bread() while we can successfully read and write, or
++ * (after the client aborted) while we can successfully read and finish
++ * the configured cache_completion.
+ */
+- for (ok = 1; ok; ) {
++ for (end_of_chunk = ok = 1; ok;) {
+ if (alternate_timeouts)
+ ap_hard_timeout("proxy recv body from upstream server", r);
+
+- /* Read block from server */
++
++ /* read a chunked block */
++ if (chunked) {
++ long chunk_start = 0;
++ n = 0;
++
++ /* start of a new chunk */
++ if (end_of_chunk) {
++ end_of_chunk = 0;
++ /* get the chunk size from the stream */
++ chunk_start = ap_getline(buf, buf_size, f, 0);
++ if ((chunk_start <= 0) || ((size_t)chunk_start + 1 >= buf_size) || !ap_isxdigit(*buf)) {
++ n = -1;
++ }
++ /* parse the chunk size */
++ else {
++ remaining = ap_get_chunk_size(buf);
++ if (remaining == 0) { /* Last chunk indicated, get footers */
++ /* as we are a proxy, we discard the footers, as the headers
++ * have already been sent at this point.
++ */
++ if (NULL == ap_proxy_read_headers(r, buf, buf_size, f)) {
++ n = -1;
++ }
++ }
++ }
++ }
++
++ /* read the chunk */
++ if (remaining > 0) {
++ n = ap_bread(f, buf, MIN((int)buf_size, (int)remaining));
++ if (n > -1) {
++ remaining -= n;
++ end_of_chunk = (remaining == 0);
++ }
++ }
++
++ /* soak up trailing CRLF */
++ if (end_of_chunk) {
++ int ch; /* int because it may hold an EOF */
++ /*
++ * For EBCDIC, the proxy has configured the BUFF layer to
++ * transparently pass the ascii characters thru (also writing
++ * an ASCII copy to the cache, where appropriate).
++ * Therefore, we see here an ASCII-CRLF (\015\012),
++ * not an EBCDIC-CRLF (\r\n).
++ */
++ if ((ch = ap_bgetc(f)) == EOF) {
++ /* Protocol error: EOF detected within chunk */
++ n = -1;
++ ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r,
++ "proxy: remote protocol error, eof while reading chunked from proxy");
++ }
++ else
++ {
++ if (ch == '\015') { /* _ASCII_ CR */
++ ch = ap_bgetc(f);
++ }
++ if (ch != '\012') {
++ n = -1;
++ }
++ }
++ }
++ }
++
++ /* otherwise read block normally */
++ else {
+ if (-1 == len) {
+ n = ap_bread(f, buf, buf_size);
+ }
+ else {
+- n = ap_bread(f, buf, MIN((off_t)buf_size, len - total_bytes_rcvd));
++ n = ap_bread(f, buf, MIN((int)buf_size,
++ (int)(len - total_bytes_rcvd)));
++ }
+ }
+
++
+ if (alternate_timeouts)
+ ap_kill_timeout(r);
+ else
+@@ -587,11 +610,12 @@
+ total_bytes_rcvd += n;
+
+ /* if we've received everything... */
+- /* in the case of slow frontends and expensive backends,
+- * we want to avoid leaving a backend connection hanging
+- * while the frontend takes it's time to absorb the bytes.
+- * so: if we just read the last block, we close the backend
+- * connection now instead of later - it's no longer needed.
++ /*
++ * in the case of slow frontends and expensive backends, we want to
++ * avoid leaving a backend connection hanging while the frontend
++ * takes it's time to absorb the bytes. so: if we just read the last
++ * block, we close the backend connection now instead of later - it's
++ * no longer needed.
+ */
+ if (total_bytes_rcvd == len) {
+ ap_bclose(f);
+@@ -599,13 +623,17 @@
+ }
+
+ /* Write to cache first. */
+- /*@@@ XXX FIXME: Assuming that writing the cache file won't time out?!!? */
++ /*
++ * @@@ XXX FIXME: Assuming that writing the cache file won't time
++ * out?!!?
++ */
+ if (c != NULL && c->fp != NULL) {
+ if (ap_bwrite(c->fp, &buf[0], n) != n) {
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, c->req,
+ "proxy: error writing to %s", c->tempfile);
+ c = ap_proxy_cache_error(c);
+- } else {
++ }
++ else {
+ c->written += n;
+ }
+ }
+@@ -624,16 +652,17 @@
+
+ if (w <= 0) {
+ if (c != NULL) {
+- /* when a send failure occurs, we need to decide
+- * whether to continue loading and caching the
+- * document, or to abort the whole thing
++ /*
++ * when a send failure occurs, we need to decide whether
++ * to continue loading and caching the document, or to
++ * abort the whole thing
+ */
+ ok = (c->len > 0) &&
+ (c->cache_completion > 0) &&
+ (c->len * c->cache_completion < total_bytes_rcvd);
+
+- if (! ok) {
+- if (c->fp!=NULL) {
++ if (!ok) {
++ if (c->fp != NULL) {
+ ap_pclosef(c->req->pool, ap_bfileno(c->fp, B_WR));
+ c->fp = NULL;
+ }
+@@ -706,7 +735,7 @@
+ int len, i;
+ const char *p;
+ char valbuf[HUGE_STRING_LEN];
+- valbuf[sizeof(valbuf)-1] = 0; /* safety terminating zero */
++ valbuf[sizeof(valbuf) - 1] = 0; /* safety terminating zero */
+
+ len = strlen(key);
+
+@@ -734,7 +763,7 @@
+ while (ap_isspace(*list)) {
+ list++;
+ }
+- strncpy(valbuf, list, MIN(p-list, sizeof(valbuf)-1));
++ strncpy(valbuf, list, MIN(p - list, sizeof(valbuf) - 1));
+ *val = valbuf;
+ }
+ return 1;
+@@ -760,7 +789,7 @@
+ static const char enc_table[32] = "abcdefghijklmnopqrstuvwxyz012345";
+
+ ap_MD5Init(&context);
+- ap_MD5Update(&context, (const unsigned char *) it, strlen(it));
++ ap_MD5Update(&context, (const unsigned char *)it, strlen(it));
+ ap_MD5Final(digest, &context);
+
+ /* encode 128 bits as 26 characters, using a modified uuencoding */
+@@ -805,8 +834,10 @@
+ int i, k, d;
+ unsigned int x;
+ #if defined(MPE) || (defined(AIX) && defined(__ps2__))
+- /* Believe it or not, AIX 1.x does not allow you to name a file '@',
+- * so hack around it in the encoding. */
++ /*
++ * Believe it or not, AIX 1.x does not allow you to name a file '@', so
++ * hack around it in the encoding.
++ */
+ static const char enc_table[64] =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_%";
+ #else
+@@ -815,7 +846,7 @@
+ #endif
+
+ ap_MD5Init(&context);
+- ap_MD5Update(&context, (const unsigned char *) it, strlen(it));
++ ap_MD5Update(&context, (const unsigned char *)it, strlen(it));
+ ap_MD5Final(digest, &context);
+
+ /* encode 128 bits as 22 characters, using a modified uuencoding */
+@@ -867,7 +898,7 @@
+ }
+ /* no longer necessary, as the source hex is 8-byte int */
+ /* if (j == 0xffffffff)*/
+-/* return -1;*/ /* so that it works with 8-byte ints */
++ /* return -1;*//* so that it works with 8-byte ints */
+ /* else */
+ return j;
+ }
+@@ -938,7 +969,7 @@
+ * This routine returns its own error message
+ */
+ const char *
+- ap_proxy_host2addr(const char *host, struct hostent *reqhp)
++ ap_proxy_host2addr(const char *host, struct hostent * reqhp)
+ {
+ int i;
+ struct hostent *hp;
+@@ -955,14 +986,14 @@
+ }
+ else {
+ ptd->ipaddr = ap_inet_addr(host);
+- hp = gethostbyaddr((char *) &ptd->ipaddr, sizeof(ptd->ipaddr), AF_INET);
++ hp = gethostbyaddr((char *)&ptd->ipaddr, sizeof(ptd->ipaddr), AF_INET);
+ if (hp == NULL) {
+ memset(&ptd->hpbuf, 0, sizeof(ptd->hpbuf));
+ ptd->hpbuf.h_name = 0;
+ ptd->hpbuf.h_addrtype = AF_INET;
+ ptd->hpbuf.h_length = sizeof(ptd->ipaddr);
+ ptd->hpbuf.h_addr_list = ptd->charpbuf;
+- ptd->hpbuf.h_addr_list[0] = (char *) &ptd->ipaddr;
++ ptd->hpbuf.h_addr_list[0] = (char *)&ptd->ipaddr;
+ ptd->hpbuf.h_addr_list[1] = 0;
+ hp = &ptd->hpbuf;
+ }
+@@ -985,12 +1016,13 @@
+ || url[1] != '/' || url[2] != '/')
+ return NULL;
+
+- url = ap_pstrdup(r->pool, &url[1]); /* make it point to "//", which is what proxy_canon_netloc expects */
++ url = ap_pstrdup(r->pool, &url[1]); /* make it point to "//", which is
++ * what proxy_canon_netloc expects */
+
+ err = ap_proxy_canon_netloc(r->pool, &url, &user, &password, &host, &port);
+
+ if (err != NULL)
+- ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, r,
++ ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, r,
+ "%s", err);
+
+ r->hostname = host;
+@@ -1011,9 +1043,12 @@
+ /* "partial" addresses (with less than 4 quads) correctly, i.e. */
+ /* 192.168.123 is parsed as 192.168.0.123, which is not what I want. */
+ /* I therefore have to parse the IP address manually: */
+- /*if (proxy_readmask(This->name, &This->addr.s_addr, &This->mask.s_addr) == 0) */
++ /*
++ * if (proxy_readmask(This->name, &This->addr.s_addr, &This->mask.s_addr)
++ * == 0)
++ */
+ /* addr and mask were set by proxy_readmask() */
+- /*return 1; */
++ /* return 1; */
+
+ /* Parse IP addr manually, optionally allowing */
+ /* abbreviated net addresses like 192.168. */
+@@ -1070,7 +1105,10 @@
+ while (quads > 0 && ip_addr[quads - 1] == 0)
+ --quads;
+
+- /* "IP Address should be given in dotted-quad form, optionally followed by a netmask (e.g., 192.168.111.0/24)"; */
++ /*
++ * "IP Address should be given in dotted-quad form, optionally
++ * followed by a netmask (e.g., 192.168.111.0/24)";
++ */
+ if (quads < 1)
+ return 0;
+
+@@ -1157,7 +1195,7 @@
+
+ /* Try to deal with multiple IP addr's for a host */
+ for (ip_listptr = the_host.h_addr_list; *ip_listptr; ++ip_listptr) {
+- ip_list = (struct in_addr *) *ip_listptr;
++ ip_list = (struct in_addr *)*ip_listptr;
+ if (This->addr.s_addr == (ip_list->s_addr & This->mask.s_addr)) {
+ #if DEBUGGING
+ fprintf(stderr, "3)IP-Match: %s[%s] <-> ", found, inet_ntoa(*ip_list));
+@@ -1256,7 +1294,7 @@
+ if (addr[i] != '\0' || ap_proxy_host2addr(addr, &host) != NULL)
+ return 0;
+
+- This->hostentry = ap_pduphostent (p, &host);
++ This->hostentry = ap_pduphostent(p, &host);
+
+ /* Strip trailing dots */
+ for (i = strlen(addr) - 1; i > 0 && addr[i] == '.'; --i)
+@@ -1318,7 +1356,7 @@
+
+ ap_hard_timeout("proxy connect", r);
+ do {
+- i = connect(sock, (struct sockaddr *) addr, sizeof(struct sockaddr_in));
++ i = connect(sock, (struct sockaddr *)addr, sizeof(struct sockaddr_in));
+ #if defined(WIN32) || defined(NETWARE)
+ if (i == SOCKET_ERROR)
+ errno = WSAGetLastError();
+@@ -1351,7 +1389,8 @@
+ c = ap_proxy_cache_error(c);
+ return 0; /* no need to continue, it failed already */
+ }
+- return 1; /* tell ap_table_do() to continue calling us for more headers */
++ return 1; /* tell ap_table_do() to continue calling us
++ * for more headers */
+ }
+
+ /* send a text line to one or two BUFF's; return line length */
+@@ -1366,7 +1405,8 @@
+ /* do a HTTP/1.1 age calculation */
+ time_t ap_proxy_current_age(cache_req *c, const time_t age_value)
+ {
+- time_t apparent_age, corrected_received_age, response_delay, corrected_initial_age, resident_time, current_age;
++ time_t apparent_age, corrected_received_age, response_delay, corrected_initial_age,
++ resident_time, current_age;
+
+ /* Perform an HTTP/1.1 age calculation. (RFC2616 13.2.3) */
+
+@@ -1398,7 +1438,7 @@
+ "proxy: error opening cache file %s",
+ filename);
+ else
+- ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "File %s not found", filename);
++ ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "File %s not found", filename);
+
+ }
+ return cachefp;
+@@ -1431,10 +1471,10 @@
+ const char *name;
+ char *next = ap_pstrdup(p, ap_table_get(headers, "Connection"));
+
++ /* Some proxies (Squid, ICS) use the non-standard "Proxy-Connection" header. */
+ ap_table_unset(headers, "Proxy-Connection");
+- if (!next)
+- return;
+
++ if (next != NULL) {
+ while (*next) {
+ name = next;
+ while (*next && !ap_isspace(*next) && (*next != ','))
+@@ -1446,6 +1486,30 @@
+ ap_table_unset(headers, name);
+ }
+ ap_table_unset(headers, "Connection");
++ }
++
++ /* unset hop-by-hop headers defined in RFC2616 13.5.1 */
++ ap_table_unset(headers,"Keep-Alive");
++ /*
++ * XXX: @@@ FIXME: "Proxy-Authenticate" should IMO *not* be stripped
++ * because in a chain of proxies some "front" proxy might need
++ * proxy authentication, while a "back-end" proxy which needs none can
++ * simply pass the "Proxy-Authenticate" back to the client, and pass
++ * the client's "Proxy-Authorization" to the front-end proxy.
++ * (See the note in proxy_http.c for the "Proxy-Authorization" case.)
++ *
++ * MnKr 04/2002
++ */
++ ap_table_unset(headers,"Proxy-Authenticate");
++ ap_table_unset(headers,"TE");
++ ap_table_unset(headers,"Trailer");
++ /* it is safe to just chop the transfer-encoding header
++ * here, because proxy doesn't support any other encodings
++ * to the backend other than chunked.
++ */
++ ap_table_unset(headers,"Transfer-Encoding");
++ ap_table_unset(headers,"Upgrade");
++
+ }
+
+ /* overlay one table on another
+@@ -1467,7 +1531,7 @@
+ */
+ int ap_proxy_table_replace(table *base, table *overlay)
+ {
+- table_entry *elts = (table_entry *) overlay->a.elts;
++ table_entry *elts = (table_entry *)overlay->a.elts;
+ int i, q = 0;
+ const char *val;
+
+@@ -1490,40 +1554,11 @@
+ return q;
+ }
+
+-/* unmerge an element in the table */
+-void ap_proxy_table_unmerge(pool *p, table *t, char *key)
+-{
+- long int offset = 0;
+- long int count = 0;
+- char *value = NULL;
+-
+- /* get the value to unmerge */
+- const char *initial = ap_table_get(t, key);
+- if (!initial) {
+- return;
+- }
+- value = ap_pstrdup(p, initial);
+-
+- /* remove the value from the headers */
+- ap_table_unset(t, key);
+-
+- /* find each comma */
+- while (value[count]) {
+- if (value[count] == ',') {
+- value[count] = 0;
+- ap_table_add(t, key, value + offset);
+- offset = count + 1;
+- }
+- count++;
+- }
+- ap_table_add(t, key, value + offset);
+-}
+-
+ #if defined WIN32
+
+ static DWORD tls_index;
+
+-BOOL WINAPI DllMain (HINSTANCE dllhandle, DWORD reason, LPVOID reserved)
++BOOL WINAPI DllMain(HINSTANCE dllhandle, DWORD reason, LPVOID reserved)
+ {
+ LPVOID memptr;
+
+@@ -1531,13 +1566,13 @@
+ case DLL_PROCESS_ATTACH:
+ tls_index = TlsAlloc();
+ case DLL_THREAD_ATTACH: /* intentional no break */
+- TlsSetValue (tls_index, malloc (sizeof (struct per_thread_data)));
++ TlsSetValue(tls_index, malloc(sizeof(struct per_thread_data)));
+ break;
+ case DLL_THREAD_DETACH:
+- memptr = TlsGetValue (tls_index);
++ memptr = TlsGetValue(tls_index);
+ if (memptr) {
+- free (memptr);
+- TlsSetValue (tls_index, 0);
++ free(memptr);
++ TlsSetValue(tls_index, 0);
+ }
+ break;
+ }
+@@ -1551,7 +1586,7 @@
+ {
+ #if defined(WIN32)
+
+- return (struct per_thread_data *) TlsGetValue (tls_index);
++ return (struct per_thread_data *)TlsGetValue(tls_index);
+
+ #else
+
+