#define HTTP_MSGF_BODYLESS 0x00000040 /* The message has no body (content-length = 0) */
#define HTTP_MSGF_CONN_UPG 0x00000080 /* The message contains "Connection: Upgrade" header */
+#define HTTP_MSGF_EXPECT_CHECKED 0x00000100 /* Expect header was already handled, if any */
+
/* This function is used to report flags in debugging tools. Please reflect
* below any single-bit flag addition above in the same order via the
* __APPEND_FLAG macro. The new end of the buffer is returned.
/* flags */
_(HTTP_MSGF_CNT_LEN, _(HTTP_MSGF_TE_CHNK, _(HTTP_MSGF_XFER_LEN,
_(HTTP_MSGF_VER_11, _(HTTP_MSGF_SOFT_RW, _(HTTP_MSGF_COMPRESSING,
- _(HTTP_MSGF_BODYLESS, _(HTTP_MSGF_CONN_UPG))))))));
+ _(HTTP_MSGF_BODYLESS, _(HTTP_MSGF_CONN_UPG, _(HTTP_MSGF_EXPECT_CHECKED)))))))));
/* epilogue */
_(~0U);
return buf;
if (txn->meth == HTTP_METH_CONNECT || (msg->flags & HTTP_MSGF_BODYLESS))
goto end;
- if (!(chn->flags & CF_ISRESP) && msg->msg_state < HTTP_MSG_DATA) {
+ if (!(chn->flags & CF_ISRESP)) {
if (http_handle_expect_hdr(s, htx, msg) == -1) {
ret = HTTP_RULE_RES_ERROR;
goto end;
/* If we have HTTP/1.1 message with a body and Expect: 100-continue,
* then we must send an HTTP/1.1 100 Continue intermediate response.
*/
- if (msg->msg_state == HTTP_MSG_BODY && (msg->flags & HTTP_MSGF_VER_11) &&
+ if (!(msg->flags & HTTP_MSGF_EXPECT_CHECKED) &&
+ (msg->flags & HTTP_MSGF_VER_11) &&
(msg->flags & (HTTP_MSGF_CNT_LEN|HTTP_MSGF_TE_CHNK))) {
struct ist hdr = { .ptr = "Expect", .len = 6 };
struct http_hdr_ctx ctx;
http_remove_header(htx, &ctx);
}
}
+ msg->flags |= HTTP_MSGF_EXPECT_CHECKED;
return 0;
}