summaryrefslogtreecommitdiffstats
path: root/src/plugins/http/http.c
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2022-02-19 14:30:32 -0800
committerDave Barach <openvpp@barachs.net>2022-02-23 21:24:47 +0000
commit4df1d35132fcd07a5559e63e9ac89b1a2dc2989d (patch)
tree5ffe37fce0fc8bcc62024e4790d30a07e917ed62 /src/plugins/http/http.c
parentf83d6668b083ca9ce502240557d8f6abd8645922 (diff)
http: improvement reset and close handling
Type: improvement Signed-off-by: Florin Coras <fcoras@cisco.com> Change-Id: I37ff8099c6c8044881379b4cd47ca8843746c315
Diffstat (limited to 'src/plugins/http/http.c')
-rw-r--r--src/plugins/http/http.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/plugins/http/http.c b/src/plugins/http/http.c
index f1a304829ac..828e57d3640 100644
--- a/src/plugins/http/http.c
+++ b/src/plugins/http/http.c
@@ -229,6 +229,7 @@ http_ts_disconnect_callback (session_t *ts)
if (hc->state < HTTP_CONN_STATE_TRANSPORT_CLOSED)
hc->state = HTTP_CONN_STATE_TRANSPORT_CLOSED;
+ /* Nothing more to rx, propagate to app */
if (!svm_fifo_max_dequeue_cons (ts->rx_fifo))
session_transport_closing_notify (&hc->connection);
}
@@ -236,15 +237,16 @@ http_ts_disconnect_callback (session_t *ts)
static void
http_ts_reset_callback (session_t *ts)
{
- http_conn_t *ctx;
+ http_conn_t *hc;
- ctx = http_conn_get_w_thread (ts->opaque, ts->thread_index);
+ hc = http_conn_get_w_thread (ts->opaque, ts->thread_index);
- if (ctx->state < HTTP_CONN_STATE_TRANSPORT_CLOSED)
- ctx->state = HTTP_CONN_STATE_TRANSPORT_CLOSED;
+ hc->state = HTTP_CONN_STATE_CLOSED;
+ http_buffer_free (&hc->tx_buf);
+ hc->req_state = HTTP_REQ_STATE_WAIT_METHOD;
+ session_transport_reset_notify (&hc->connection);
- if (!svm_fifo_max_dequeue_cons (ts->rx_fifo))
- session_transport_reset_notify (&ctx->connection);
+ http_disconnect_transport (hc);
}
/**
@@ -856,7 +858,10 @@ http_app_tx_callback (void *session, transport_send_params_t *sp)
hc = http_conn_get_w_thread (as->connection_index, as->thread_index);
if (hc->req_state < HTTP_REQ_STATE_WAIT_APP)
{
- clib_warning ("app data in req state %u", hc->req_state);
+ if (hc->state != HTTP_CONN_STATE_CLOSED)
+ clib_warning ("app data req state %u session state %u", hc->req_state,
+ hc->state);
+ svm_fifo_dequeue_drop_all (as->tx_fifo);
return 0;
}
@@ -865,9 +870,9 @@ http_app_tx_callback (void *session, transport_send_params_t *sp)
http_req_run_state_machine (hc, sp);
- if (hc->state == HTTP_CONN_STATE_CLOSED)
+ if (hc->state == HTTP_CONN_STATE_APP_CLOSED)
{
- if (!svm_fifo_max_dequeue_cons (as->rx_fifo))
+ if (!svm_fifo_max_dequeue_cons (as->tx_fifo))
http_disconnect_transport (hc);
}