Return-Path: Delivered-To: apmail-httpd-dev-archive@httpd.apache.org Received: (qmail 46043 invoked by uid 500); 21 Feb 2002 05:49:25 -0000 Mailing-List: contact dev-help@httpd.apache.org; run by ezmlm Precedence: bulk Reply-To: dev@httpd.apache.org list-help: list-unsubscribe: list-post: Delivered-To: mailing list dev@httpd.apache.org Received: (qmail 45942 invoked from network); 21 Feb 2002 05:49:24 -0000 Sender: minfrin Message-ID: <3C741966.30CE03A3@sharp.fm> Date: Wed, 20 Feb 2002 23:47:18 +0200 From: Graham Leggett X-Mailer: Mozilla 4.73 [en] (X11; I; Linux 2.4.18pre1 ppc) X-Accept-Language: en MIME-Version: 1.0 To: Apache Developers List Subject: [Patch] 2.0 proxy fix for lost duplicate headers Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg=sha1; boundary="------------ms595184BB4692D027BBD2D14F" X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N This is a cryptographically signed message in MIME format. --------------ms595184BB4692D027BBD2D14F Content-Type: multipart/mixed; boundary="------------79DD35FCD26DC7A23CDA7AF0" This is a multi-part message in MIME format. --------------79DD35FCD26DC7A23CDA7AF0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Hi all, This patch is the v2.0 port of the fix applied to v1.3 to stop duplicated headers in a response from going missing. Regards, Graham -- ----------------------------------------- minfrin@sharp.fm "There's a moon over Bourbon Street tonight..." --------------79DD35FCD26DC7A23CDA7AF0 Content-Type: text/plain; charset=us-ascii; name="proxy-duplicate-headers.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="proxy-duplicate-headers.patch" diff -r -U 3 /home/minfrin/src/apache/pristine/httpd-2.0/CHANGES httpd-2.0/CHANGES --- /home/minfrin/src/apache/pristine/httpd-2.0/CHANGES Tue Feb 19 23:44:41 2002 +++ httpd-2.0/CHANGES Wed Feb 20 23:30:26 2002 @@ -1,4 +1,16 @@ Changes with Apache 2.0.33-dev + + *) Some browsers ignore cookies that have been merged into a + single Set-Cookie header. Set-Cookie and Set-Cookie2 headers + are now unmerged in the http proxy before being sent to the + client. [Graham Leggett] + + *) Fix a problem with proxy where each entry of a duplicated + header such as Set-Cookie would overwrite and obliterate the + previous value of the header, resulting in multiple header + values (like cookies) going missing. + [Graham Leggett, Joshua Slive] + *) Win32: Fix bug in mod_status with displaying "Restart Time" and "Server uptime". [Bill Stoddard] diff -r -U 3 /home/minfrin/src/apache/pristine/httpd-2.0/modules/proxy/proxy_http.c httpd-2.0/modules/proxy/proxy_http.c --- /home/minfrin/src/apache/pristine/httpd-2.0/modules/proxy/proxy_http.c Mon Feb 11 22:30:13 2002 +++ httpd-2.0/modules/proxy/proxy_http.c Wed Feb 20 23:04:55 2002 @@ -569,21 +569,21 @@ /* Add X-Forwarded-For: so that the upstream has a chance to * determine, where the original request came from. */ - apr_table_setn(r->headers_in, "X-Forwarded-For", + apr_table_mergen(r->headers_in, "X-Forwarded-For", r->connection->remote_ip); /* Add X-Forwarded-Host: so that upstream knows what the * original request hostname was. */ if ((buf = apr_table_get(r->headers_in, "Host"))) { - apr_table_setn(r->headers_in, "X-Forwarded-Host", buf); + apr_table_mergen(r->headers_in, "X-Forwarded-Host", buf); } /* Add X-Forwarded-Server: so that upstream knows what the * name of this proxy server is (if there are more than one) * XXX: This duplicates Via: - do we strictly need it? */ - apr_table_setn(r->headers_in, "X-Forwarded-Server", + apr_table_mergen(r->headers_in, "X-Forwarded-Server", r->server->server_hostname); } @@ -824,6 +824,10 @@ ap_proxy_location_reverse_map(r, conf, buf)); } } + + /* 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"); r->sent_bodyct = 1; /* Is it an HTTP/0.9 response? If so, send the extra data */ diff -r -U 3 /home/minfrin/src/apache/pristine/httpd-2.0/modules/proxy/proxy_util.c httpd-2.0/modules/proxy/proxy_util.c --- /home/minfrin/src/apache/pristine/httpd-2.0/modules/proxy/proxy_util.c Sun Feb 3 17:48:28 2002 +++ httpd-2.0/modules/proxy/proxy_util.c Wed Feb 20 23:10:45 2002 @@ -439,7 +439,8 @@ for (end = &value[strlen(value)-1]; end > value && apr_isspace(*end); --end) *end = '\0'; - apr_table_add(headers_out, buffer, value); + /* make sure we merge so as not to destroy duplicated headers */ + apr_table_merge(headers_out, buffer, value); /* the header was too long; at the least we should skip extra data */ if (len >= size - 1) { @@ -1070,4 +1071,33 @@ f = f->next; } } +} + +/* unmerge an element in the table */ +void ap_proxy_table_unmerge(apr_pool_t *p, apr_table_t *t, char *key) +{ + apr_off_t offset = 0; + apr_off_t count = 0; + char *value = NULL; + + /* get the value to unmerge */ + const char *initial = apr_table_get(t, key); + if (!initial) { + return; + } + value = apr_pstrdup(p, initial); + + /* remove the value from the headers */ + apr_table_unset(t, key); + + /* find each comma */ + while (value[count]) { + if (value[count] == ',') { + value[count] = 0; + apr_table_add(t, key, value + offset); + offset = count + 1; + } + count++; + } + apr_table_add(t, key, value + offset); } --------------79DD35FCD26DC7A23CDA7AF0-- --------------ms595184BB4692D027BBD2D14F Content-Type: application/x-pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-Description: S/MIME Cryptographic Signature MIIHyAYJKoZIhvcNAQcCoIIHuTCCB7UCAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3DQEHAaCC BcYwggKVMIIB/qADAgECAgMEyOwwDQYJKoZIhvcNAQEEBQAwgZIxCzAJBgNVBAYTAlpBMRUw EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEPMA0GA1UEChMGVGhh d3RlMR0wGwYDVQQLExRDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEoMCYGA1UEAxMfUGVyc29uYWwg RnJlZW1haWwgUlNBIDIwMDAuOC4zMDAeFw0wMTA1MTEwMDE3NDZaFw0wMjA1MTEwMDE3NDZa MF0xEDAOBgNVBAQTB0xlZ2dldHQxDzANBgNVBCoTBkdyYWhhbTEXMBUGA1UEAxMOR3JhaGFt IExlZ2dldHQxHzAdBgkqhkiG9w0BCQEWEG1pbmZyaW5Ac2hhcnAuZm0wgZ8wDQYJKoZIhvcN AQEBBQADgY0AMIGJAoGBALX2zJvQ/9l+sCEpkfMNNwtnMcF8vmPM2sRpibT5nR87bYWyLVCt XXWXU+UyDOkiQJt6UahnmYZV7u40a1/osbNnjHjyNybejOuUFjHYy1gDwjsElnxYbRRA2SZc CmrZ4V0QFI0ZKuimGryZQj77UroiIV+Qq+v+PaxDEGwiqJqnAgMBAAGjLTArMBsGA1UdEQQU MBKBEG1pbmZyaW5Ac2hhcnAuZm0wDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQQFAAOBgQCO l5bH8JXuFM+EZi01jfezzKML5iPBHx4BDj/4gl2lXw1t0v6o+9442F6TpnOVAk3LL1KTupvc HfM+Bn71iWuD8ASCoSsmVpeoCbOv3lPGltrDgywcmM8phZyK1hHLvvJgfd4IMZbuH/rm0ZWp WjRORFfik8yuO9DgahgjgAhkujCCAykwggKSoAMCAQICAQwwDQYJKoZIhvcNAQEEBQAwgdEx CzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93 bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24g U2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBD QTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhhd3RlLmNvbTAeFw0wMDA4 MzAwMDAwMDBaFw0wMjA4MjkyMzU5NTlaMIGSMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2Vz dGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UE CxMUQ2VydGlmaWNhdGUgU2VydmljZXMxKDAmBgNVBAMTH1BlcnNvbmFsIEZyZWVtYWlsIFJT QSAyMDAwLjguMzAwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAN4zMqZjxwklRT7Sbngn Z4HF2ogZgpcO40QpimM1Km1wPPrcrvfudG8wvDOQf/k0caCjbZjxw0+iZdsN+kvx1t1hpfmF zVWaNRqdknWoJ67Ycvm6AvbXsJHeHOmr4BgDqHxDQlBRh4M88Dm0m1SKE4f/s5udSWYALQmJ 7JRr6aFpAgMBAAGjTjBMMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFQcml2YXRlTGFiZWwx LTI5NzASBgNVHRMBAf8ECDAGAQH/AgEAMAsGA1UdDwQEAwIBBjANBgkqhkiG9w0BAQQFAAOB gQBzG28mZYv/FTRLWWKK7US+ScfoDbuPuQ1qJipihB+4h2N0HG23zxpTkUvhzeY42e1Q9Dps NJKs5pKcbsEjAcIJp+9LrnLdBmf1UG8uWLi2C8FQV7XsHNfvF7bViJu3ooga7TlbOX00/LaW GCVNavSdxcORL6mWuAU8Uvzd6WIDSDGCAcowggHGAgEBMIGaMIGSMQswCQYDVQQGEwJaQTEV MBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xDzANBgNVBAoTBlRo YXd0ZTEdMBsGA1UECxMUQ2VydGlmaWNhdGUgU2VydmljZXMxKDAmBgNVBAMTH1BlcnNvbmFs IEZyZWVtYWlsIFJTQSAyMDAwLjguMzACAwTI7DAJBgUrDgMCGgUAoIGGMBgGCSqGSIb3DQEJ AzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTAyMDIyMDIxNDcyMFowIwYJKoZIhvcN AQkEMRYEFDJ3/6PjblxJDCIgvpEU23m4OPeWMCcGCSqGSIb3DQEJDzEaMBgwBwYFKw4DAgcw DQYIKoZIhvcNAwICASgwDQYJKoZIhvcNAQEBBQAEgYCsMDci1OblO7qldK+3HDrT+6aDsBit pR1Re+Z9xAmNHBVHtLsXXklXsWYKToMG4qm0jhVk4HtPhUsTWcbqkQS5rbxZKcZle+wEyNn2 GeautfNIJwlsMws2tIs5Bkthb0W8wTh6BNXJc/Z/tU2EIKUp0cs/lWIKMEa5DWAomR74Xw== --------------ms595184BB4692D027BBD2D14F--