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]