Hi,
this is the day of resurrections :p
I think I've got a simpler way to address this issue, that is, don't
send unexpected 100-continue to clients due to proxy ping feature.
Here is the patch.
Once again, please object if you don't want me to commit this stuff.
Reagrds,
Yann.
Index: modules/proxy/proxy_util.c
===================================================================
--- modules/proxy/proxy_util.c (revision 1584652)
+++ modules/proxy/proxy_util.c (working copy)
@@ -3312,8 +3312,43 @@ PROXY_DECLARE(int) ap_proxy_create_hdrbrgd(apr_poo
* to backend
*/
if (do_100_continue) {
- apr_table_mergen(r->headers_in, "Expect", "100-Continue");
- r->expecting_100 = 1;
+ const char *val;
+
+ /* Since we may modify the original "proxy-interim-response" env but
+ * also come back here later with the same request (previous ping
+ * failure, load balancing recoverable error...), we use "\n" as the
+ * saved value when the original one is not defined, so that we can do
+ * the right thing (unset) to restore the env (later) in this case.
+ */
+ val = apr_table_get(r->notes, "proxy-interim-pong");
+ if (val == NULL) {
+ val = apr_table_get(r->subprocess_env, "proxy-interim-response");
+ if (val != NULL) {
+ apr_table_setn(r->notes, "proxy-interim-pong", val);
+ }
+ else {
+ apr_table_setn(r->notes, "proxy-interim-pong", "\n");
+ }
+ }
+ if (!r->expecting_100) {
+ /* Don't forward any "100 Continue" response if the client is
+ * not expecting it. */
+ val = "Suppress";
+ }
+ if (val && (val[0] != '\n' || val[1] != '\0')) {
+ apr_table_setn(r->subprocess_env, "proxy-interim-response", val);
+ }
+ else {
+ apr_table_unset(r->subprocess_env, "proxy-interim-response");
+ }
+
+ /* Add the Expect header if not already there. */
+ val = apr_table_get(r->headers_in, "Expect");
+ if ((val == NULL)
+ || (strcasecmp(val, "100-Continue") != 0 // fast path
+ && !ap_find_token(r->pool, val, "100-Continue"))) {
+ apr_table_mergen(r->headers_in, "Expect", "100-Continue");
+ }
}
/* X-Forwarded-*: handling
[EOS]