From: Jim Jagielski Date: Mon, 10 May 2004 13:58:56 +0000 (+0000) Subject: *** empty log message *** X-Git-Tag: pre_ajp_proxy~271 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ec44c1ec9de62abb7a2cb1a7418fa8e209904c54;p=apache *** empty log message *** git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@103639 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index e26d0ceea6..3c05367786 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,10 @@ Changes with Apache 2.1.0-dev [Remove entries to the current 2.0 section below, when backported] + *) Proxy server was deleting cookies that Apache had already + assigned if the origin server had set any cookies. PR 27023. + [Jim Jagielski] + *) Prevent Win32 pool corruption at startup [Allan Edwards] *) Removed old and unmaintained ap_add_named_module API and changed diff --git a/modules/proxy/proxy_http.c b/modules/proxy/proxy_http.c index f695cd7aa1..58485931ef 100644 --- a/modules/proxy/proxy_http.c +++ b/modules/proxy/proxy_http.c @@ -745,6 +745,12 @@ apr_status_t ap_proxy_http_request(apr_pool_t *p, request_rec *r, return APR_SUCCESS; } +static int addit_dammit(void *v, const char *key, const char *val) +{ + apr_table_addn(v, key, val); + return 1; +} + static apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r, proxy_http_conn_t *p_conn, @@ -761,6 +767,7 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r, int len, backasswards; int interim_response; /* non-zero whilst interim 1xx responses * are being read. */ + apr_table_t *save_table; bb = apr_brigade_create(p, c->bucket_alloc); @@ -834,8 +841,16 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r, /* N.B. for HTTP/1.0 clients, we have to fold line-wrapped headers*/ /* Also, take care with headers with multiple occurences. */ + /* First, tuck away all already existing cookies */ + save_table = apr_table_make(r->pool, 2); + apr_table_do(addit_dammit, save_table, r->err_headers_out, + "Set-Cookie", NULL); + apr_table_do(addit_dammit, save_table, r->headers_out, + "Set-Cookie", NULL); + r->headers_out = ap_proxy_read_headers(r, rp, buffer, sizeof(buffer), origin); + if (r->headers_out == NULL) { ap_log_error(APLOG_MARK, APLOG_WARNING, 0, r->server, "proxy: bad HTTP/%d.%d header " @@ -853,8 +868,21 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r, return r->status; } else { - /* strip connection listed hop-by-hop headers from response */ const char *buf; + + /* Now, add in the just read cookies */ + apr_table_do(addit_dammit, save_table, r->headers_out, + "Set-Cookie", NULL); + + /* and now load 'em all in */ + if (!apr_is_empty_table(save_table)) { + apr_table_unset(r->headers_out, "Set-Cookie"); + r->headers_out = apr_table_overlay(r->pool, + r->headers_out, + save_table); + } + + /* strip connection listed hop-by-hop headers from response */ p_conn->close += ap_proxy_liststr(apr_table_get(r->headers_out, "Connection"), "close");