Hi,

a bit of history: I read on the documentation the new mod_proxy feature
called ProxyIOBufferSize which allows for even better handling of lasrge
mod_perl httpd's. This babby, and another little patch that also made it
(closing the backend connection as soon as possible) allows for me to
have a split of 100 modproxy process for only 10 backend mod_perl
process... neat! :) (BTW, using this and mod_gzip, and you can save a
bundle instead of buying those nice redline boxes :)

the problem is that it's only available on 1.3.24 (at the time, 2 or 3
days ago, it wasnt available yet), so I used the CVS version.

Looking at the change log, they mention a bug that multiple set-cookie's
will fail (only the last one will be sent to the client, the proxy will
"eat" the others). And it was true... The problem is that 1.3.24 final
also has that bug: only the last set-cookie will reach your browser.

This was a show-stopper for my application. So I sat down, read the
proxy code, and made a patch to solve the bug. I then sent the patch to
the apache bug database (i really hate gnats ;), but they drop it (as a
duplicate). I admit i could not attach my patch to the existing bug
report on this subject (I said I hated gnat's :). So my patch did not
made it the 1.3.24...

Anyway, I attached here. Maybe someone here can push it into apache for
the next release, and in the meantime you can use it, if you want.

I also attach a cgi that set's two cookies, to demonstrate the problem.

Best regards,

PS: mod_perl totally rocks... serving well over 70.000.000 pageviews
    with mason...
-- 
Pedro Melo Cunha - <[EMAIL PROTECTED]>
Novis Telecom, S.A. - Dir. Rede - ISP <http://www.novis.pt/>
Edifício Novis - Estrada da Outurela, 118 - 2795-606 Carnaxide
tel:  +351 21 0104340 - fax: +351 21 0104301
Index: proxy_http.c
===================================================================
RCS file: /home/cvspublic/apache-1.3/src/modules/proxy/proxy_http.c,v
retrieving revision 1.88
diff -u -r1.88 proxy_http.c
--- proxy_http.c        21 Mar 2002 11:38:03 -0000      1.88
+++ proxy_http.c        22 Mar 2002 01:21:39 -0000
@@ -136,6 +136,20 @@
     return url;
 }
 
+
+/* copies header key/value into table p if it's a cookie header.
+ * this is a callback function for a ap_table_do below.
+ */
+int ap_proxy_copy_cookie_headers(void *p, const char *key, const char *value)
+{
+    table *d = (table *)p;
+
+    if (!strcasecmp(key, "Set-Cookie") || !strcasecmp(key, "Set-Cookie2"))
+      ap_table_add(d, key, value);
+
+    return 1;
+}
+
 /*
  * This handles http:// URLs, and other URLs using a remote proxy over http
  * If proxyhost is NULL, then contact the server directly, otherwise
@@ -529,8 +543,20 @@
         ap_proxy_write_headers(c, ap_pstrcat(p, "HTTP/1.1 ", r->status_line, NULL), 
resp_hdrs);
     }
 
-    /* Setup the headers for our client from upstreams response-headers */
+    /* Setup the headers for our client from upstreams response-headers.
+     * We use resp_hdrs to keep all the Set-Cookie and Set-Cookie2 headers,
+     * and then call ap_overlap_table, because it keep's only the last one.
+     * The we copy all the cookies back.
+                */
+    ap_table_do(ap_proxy_copy_cookie_headers, resp_hdrs, r->headers_out, NULL);
+
     ap_overlap_tables(r->headers_out, resp_hdrs, AP_OVERLAP_TABLES_SET);
+
+    ap_table_unset(r->headers_out, "Set-Cookie");
+    ap_table_unset(r->headers_out, "Set-Cookie2");
+
+    ap_table_do(ap_proxy_copy_cookie_headers, r->headers_out, resp_hdrs, NULL);
+
     /* 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 ",
#!/usr/local/bin/perl -w

use CGI qw( :standard );
use CGI::Cookie;

my $c1 = new CGI::Cookie(-name=>'ID',-value=>123456);
my $c2 = new CGI::Cookie(-name=>'preferences',
                         -value=>{ font => Helvetica, size => 12 });

print header(-cookie=>[$c1,$c2]);

print "Done";

Reply via email to