#define H1C_F_UPG_H2C 0x00080000 /* set if an upgrade to h2 should be done */
#define H1C_F_CO_MSG_MORE 0x00100000 /* set if CO_SFL_MSG_MORE must be set when calling xprt->snd_buf() */
#define H1C_F_CO_STREAMER 0x00200000 /* set if CO_SFL_STREAMER must be set when calling xprt->snd_buf() */
-#define H1C_F_RX_BLK 0x00400000 /* Don't process more input data, waiting sync with output side */
-#define H1C_F_TX_BLK 0x00800000 /* Don't process more output data, waiting sync with input side */
-/* 0x01000000 - 0x40000000 unusued*/
+/* 0x00400000 - 0x40000000 unusued*/
#define H1C_F_IS_BACK 0x80000000 /* Set on outgoing connection */
/*
* H1 Stream flags (32 bits)
*/
#define H1S_F_NONE 0x00000000
-/* 0x00000001..0x00000004 unused */
+
+#define H1S_F_RX_BLK 0x00100000 /* Don't process more input data, waiting sync with output side */
+#define H1S_F_TX_BLK 0x00200000 /* Don't process more output data, waiting sync with input side */
+/* 0x00000004 unused */
#define H1S_F_REOS 0x00000008 /* End of input stream seen even if not delivered yet */
#define H1S_F_WANT_KAL 0x00000010
#define H1S_F_WANT_TUN 0x00000020
if (!h1s)
goto fail;
+ h1s->flags |= H1S_F_RX_BLK;
h1s->cs = cs;
h1s->sess = sess;
cs->ctx = h1s;
h1_release_buf(h1c, &h1s->rxbuf);
- h1c->flags &= ~(H1C_F_TX_BLK|H1C_F_RX_BLK|H1C_F_WANT_SPLICE|
+ h1c->flags &= ~(H1C_F_WANT_SPLICE|
H1C_F_ST_EMBRYONIC|H1C_F_ST_ATTACHED|H1C_F_ST_READY|
H1C_F_OUT_FULL|H1C_F_OUT_ALLOC|H1C_F_IN_SALLOC|
H1C_F_CO_MSG_MORE|H1C_F_CO_STREAMER);
h1c->idle_exp = TICK_ETERNITY;
if (conn_is_back(conn)) {
- h1c->flags |= (H1C_F_IS_BACK|H1C_F_RX_BLK);
+ h1c->flags |= H1C_F_IS_BACK;
h1c->shut_timeout = h1c->timeout = proxy->timeout.server;
if (tick_isset(proxy->timeout.serverfin))
h1c->shut_timeout = proxy->timeout.serverfin;
TRACE_STATE("switch H1 stream in tunnel mode", H1_EV_TX_DATA|H1_EV_TX_HDRS, h1c->conn, h1s);
- if (h1c->flags & H1C_F_RX_BLK) {
- h1c->flags &= ~H1C_F_RX_BLK;
+ if (h1s->flags & H1S_F_RX_BLK) {
+ h1s->flags &= ~H1S_F_RX_BLK;
h1_wake_stream_for_recv(h1s);
- TRACE_STATE("Re-enable input processing on h1c", H1_EV_RX_DATA|H1_EV_H1C_BLK|H1_EV_H1C_WAKE, h1c->conn, h1s);
+ TRACE_STATE("Re-enable input processing", H1_EV_RX_DATA|H1_EV_H1S_BLK|H1_EV_STRM_WAKE, h1c->conn, h1s);
}
- if (h1c->flags & H1C_F_TX_BLK) {
- h1c->flags &= ~H1C_F_TX_BLK;
+ if (h1s->flags & H1S_F_TX_BLK) {
+ h1s->flags &= ~H1S_F_TX_BLK;
h1_wake_stream_for_send(h1s);
- TRACE_STATE("Re-enable output processing on h1c", H1_EV_TX_DATA|H1_EV_H1C_BLK|H1_EV_H1C_WAKE, h1c->conn, h1s);
+ TRACE_STATE("Re-enable output processing", H1_EV_TX_DATA|H1_EV_H1S_BLK|H1_EV_STRM_WAKE, h1c->conn, h1s);
}
}
if (h1s->flags & (H1S_F_PARSING_ERROR|H1S_F_NOT_IMPL_ERROR))
goto end;
- if (h1c->flags & H1C_F_RX_BLK)
+ if (h1s->flags & H1S_F_RX_BLK)
goto out;
do {
else {
if (h1s->req.state < H1_MSG_DONE || h1s->res.state < H1_MSG_DONE) {
/* Unfinished transaction: block this input side waiting the end of the output side */
- h1c->flags |= H1C_F_RX_BLK;
- TRACE_STATE("Disable input processing on h1c", H1_EV_RX_DATA|H1_EV_H1C_BLK, h1c->conn, h1s);
+ h1s->flags |= H1S_F_RX_BLK;
+ TRACE_STATE("Disable input processing", H1_EV_RX_DATA|H1_EV_H1S_BLK, h1c->conn, h1s);
}
- if (h1c->flags & H1C_F_TX_BLK) {
- h1c->flags &= ~H1C_F_TX_BLK;
+ if (h1s->flags & H1S_F_TX_BLK) {
+ h1s->flags &= ~H1S_F_TX_BLK;
h1_wake_stream_for_send(h1s);
- TRACE_STATE("Re-enable output processing on h1c", H1_EV_TX_DATA|H1_EV_H1C_BLK|H1_EV_H1C_WAKE, h1c->conn, h1s);
+ TRACE_STATE("Re-enable output processing", H1_EV_TX_DATA|H1_EV_H1S_BLK|H1_EV_STRM_WAKE, h1c->conn, h1s);
}
break;
}
}
count -= htx_used_space(htx) - used;
- } while (!(h1s->flags & (H1S_F_PARSING_ERROR|H1S_F_NOT_IMPL_ERROR)) && !(h1c->flags & H1C_F_RX_BLK));
+ } while (!(h1s->flags & (H1S_F_PARSING_ERROR|H1S_F_NOT_IMPL_ERROR|H1S_F_RX_BLK)));
if (h1s->flags & (H1S_F_PARSING_ERROR|H1S_F_NOT_IMPL_ERROR)) {
TRACE_ERROR("message aborted, set error on CS", H1_EV_RX_DATA|H1_EV_H1S_ERR, h1c->conn, h1s);
}
- if (h1c->flags & H1C_F_TX_BLK) {
- h1c->flags &= ~H1C_F_TX_BLK;
+ if (h1s->flags & H1S_F_TX_BLK) {
+ h1s->flags &= ~H1S_F_TX_BLK;
h1_wake_stream_for_send(h1s);
- TRACE_STATE("Re-enable output processing on h1c", H1_EV_TX_DATA|H1_EV_H1C_BLK|H1_EV_H1C_WAKE, h1c->conn, h1s);
+ TRACE_STATE("Re-enable output processing", H1_EV_TX_DATA|H1_EV_H1S_BLK|H1_EV_STRM_WAKE, h1c->conn, h1s);
}
}
}
if (htx_is_empty(chn_htx))
goto end;
- if (h1s->flags & H1S_F_PROCESSING_ERROR)
- goto end;
-
- if (h1c->flags & H1C_F_TX_BLK)
+ if (h1s->flags & (H1S_F_PROCESSING_ERROR|H1S_F_TX_BLK))
goto end;
if (!h1_get_buf(h1c, &h1c->obuf)) {
total += count;
if (last_data) {
h1m->state = H1_MSG_DONE;
- if (h1c->flags & H1C_F_RX_BLK) {
- h1c->flags &= ~H1C_F_RX_BLK;
+ if (h1s->flags & H1S_F_RX_BLK) {
+ h1s->flags &= ~H1S_F_RX_BLK;
h1_wake_stream_for_recv(h1s);
- TRACE_STATE("Re-enable input processing on h1c", H1_EV_TX_DATA|H1_EV_H1C_BLK|H1_EV_H1C_WAKE, h1c->conn, h1s);
+ TRACE_STATE("Re-enable input processing", H1_EV_TX_DATA|H1_EV_H1S_BLK|H1_EV_STRM_WAKE, h1c->conn, h1s);
}
TRACE_USER((!(h1m->flags & H1_MF_RESP) ? "H1 request fully xferred" : "H1 response fully xferred"),
tmp.data = 0;
tmp.size = b_room(&h1c->obuf);
- while (count && !(h1s->flags & H1S_F_PROCESSING_ERROR) && !(h1c->flags & H1C_F_TX_BLK) && blk) {
+ while (count && !(h1s->flags & (H1S_F_PROCESSING_ERROR|H1S_F_TX_BLK)) && blk) {
struct htx_sl *sl;
struct ist n, v;
enum htx_blk_type type = htx_get_blk_type(blk);
h1m->state = H1_MSG_HDR_FIRST;
if (h1s->meth == HTTP_METH_HEAD)
h1s->flags |= H1S_F_BODYLESS_RESP;
- if (h1c->flags & H1C_F_RX_BLK) {
- h1c->flags &= ~H1C_F_RX_BLK;
+ if (h1s->flags & H1S_F_RX_BLK) {
+ h1s->flags &= ~H1S_F_RX_BLK;
h1_wake_stream_for_recv(h1s);
- TRACE_STATE("Re-enable input processing on h1c", H1_EV_TX_DATA|H1_EV_H1C_BLK|H1_EV_H1C_WAKE, h1c->conn, h1s);
+ TRACE_STATE("Re-enable input processing", H1_EV_TX_DATA|H1_EV_H1S_BLK|H1_EV_STRM_WAKE, h1c->conn, h1s);
}
break;
h1m->state = H1_MSG_DONE;
if (!(h1m->flags & H1_MF_RESP) && h1s->meth == HTTP_METH_CONNECT) {
- h1c->flags |= H1C_F_TX_BLK;
- TRACE_STATE("Disable output processing on h1c", H1_EV_TX_DATA|H1_EV_H1C_BLK, h1c->conn, h1s);
+ h1s->flags |= H1S_F_TX_BLK;
+ TRACE_STATE("Disable output processing", H1_EV_TX_DATA|H1_EV_H1S_BLK, h1c->conn, h1s);
}
else if ((h1m->flags & H1_MF_RESP) &&
((h1s->meth == HTTP_METH_CONNECT && h1s->status >= 200 && h1s->status < 300) || h1s->status == 101)) {
TRACE_STATE("switch H1 response in tunnel mode", H1_EV_TX_DATA|H1_EV_TX_HDRS, h1c->conn, h1s);
}
- if (h1c->flags & H1C_F_RX_BLK) {
- h1c->flags &= ~H1C_F_RX_BLK;
+ if (h1s->flags & H1S_F_RX_BLK) {
+ h1s->flags &= ~H1S_F_RX_BLK;
h1_wake_stream_for_recv(h1s);
- TRACE_STATE("Re-enable input processing on h1c", H1_EV_TX_DATA|H1_EV_H1C_BLK|H1_EV_H1C_WAKE, h1c->conn, h1s);
+ TRACE_STATE("Re-enable input processing", H1_EV_TX_DATA|H1_EV_H1S_BLK|H1_EV_STRM_WAKE, h1c->conn, h1s);
}
TRACE_USER((!(h1m->flags & H1_MF_RESP) ? "H1 request fully xferred" : "H1 response fully xferred"),
}
end:
- if (!(h1c->flags & (H1C_F_OUT_FULL|H1C_F_TX_BLK)))
+ if (!(h1c->flags & H1C_F_OUT_FULL))
h1_wake_stream_for_send(h1c->h1s);
/* We're done, no more to send */