]> granicus.if.org Git - apache/commitdiff
*** empty log message ***
authorJim Jagielski <jim@apache.org>
Mon, 10 May 2004 13:58:56 +0000 (13:58 +0000)
committerJim Jagielski <jim@apache.org>
Mon, 10 May 2004 13:58:56 +0000 (13:58 +0000)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@103639 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
modules/proxy/proxy_http.c

diff --git a/CHANGES b/CHANGES
index e26d0ceea6b027c8115b0ac4e42a34b65e9cb787..3c05367786bc02aa5b614595fbb0045074296de3 100644 (file)
--- 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
index f695cd7aa163e8135b07f3309b7f4a16a17b5599..58485931efc0cbf8ec49646a25f56f85e32cb08f 100644 (file)
@@ -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");