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";