summaryrefslogtreecommitdiffstats
path: root/src/plugins/http/http.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/http/http.c')
-rw-r--r--src/plugins/http/http.c49
1 files changed, 32 insertions, 17 deletions
diff --git a/src/plugins/http/http.c b/src/plugins/http/http.c
index 5cdbaa7df3e..6d08e1dd23e 100644
--- a/src/plugins/http/http.c
+++ b/src/plugins/http/http.c
@@ -360,9 +360,9 @@ read_request (http_conn_t *hc)
}
static int
-v_find_index (u8 *vec, char *str)
+v_find_index (u8 *vec, u32 offset, char *str)
{
- int start_index;
+ int start_index = offset;
u32 slen = (u32) strnlen_s_inline (str, 8);
u32 vlen = vec_len (vec);
@@ -371,9 +371,9 @@ v_find_index (u8 *vec, char *str)
if (vlen <= slen)
return -1;
- for (start_index = 0; start_index < (vlen - slen); start_index++)
+ for (; start_index < (vlen - slen); start_index++)
{
- if (!memcmp (vec, str, slen))
+ if (!memcmp (vec + start_index, str, slen))
return start_index;
}
@@ -386,7 +386,7 @@ v_find_index (u8 *vec, char *str)
static int
state_wait_method (http_conn_t *hc, transport_send_params_t *sp)
{
- http_main_t *hm = &http_main;
+ http_status_code_t ec;
app_worker_t *app_wrk;
http_msg_t msg;
session_t *as;
@@ -402,35 +402,41 @@ state_wait_method (http_conn_t *hc, transport_send_params_t *sp)
if (vec_len (hc->rx_buf) < 8)
{
- send_error (hc, HTTP_STATUS_BAD_REQUEST);
- http_disconnect_transport (hc);
- return -1;
+ ec = HTTP_STATUS_BAD_REQUEST;
+ goto error;
}
- if ((i = v_find_index (hc->rx_buf, "GET ")) >= 0)
+ if ((i = v_find_index (hc->rx_buf, 0, "GET ")) >= 0)
{
hc->method = HTTP_REQ_GET;
hc->rx_buf_offset = i + 5;
+
+ i = v_find_index (hc->rx_buf, hc->rx_buf_offset, "HTTP");
+ if (i < 0)
+ {
+ ec = HTTP_STATUS_BAD_REQUEST;
+ goto error;
+ }
+
+ len = i - hc->rx_buf_offset;
}
- else if ((i = v_find_index (hc->rx_buf, "POST ")) >= 0)
+ else if ((i = v_find_index (hc->rx_buf, 0, "POST ")) >= 0)
{
hc->method = HTTP_REQ_POST;
hc->rx_buf_offset = i + 6;
+ len = vec_len (hc->rx_buf) - hc->rx_buf_offset;
}
else
{
- if (hm->debug_level > 1)
- clib_warning ("Unknown http method");
-
- send_error (hc, HTTP_STATUS_METHOD_NOT_ALLOWED);
- http_disconnect_transport (hc);
- return -1;
+ HTTP_DBG (0, "Unknown http method");
+ ec = HTTP_STATUS_METHOD_NOT_ALLOWED;
+ goto error;
}
buf = &hc->rx_buf[hc->rx_buf_offset];
- len = vec_len (hc->rx_buf) - hc->rx_buf_offset;
msg.type = HTTP_MSG_REQUEST;
+ msg.method_type = hc->method;
msg.data.content_type = HTTP_CONTENT_TEXT_HTML;
msg.data.len = len;
msg.data.offset = 0;
@@ -455,6 +461,14 @@ state_wait_method (http_conn_t *hc, transport_send_params_t *sp)
app_worker_lock_and_send_event (app_wrk, as, SESSION_IO_EVT_RX);
return 0;
+
+error:
+
+ send_error (hc, ec);
+ session_transport_closing_notify (&hc->connection);
+ http_disconnect_transport (hc);
+
+ return -1;
}
/**
@@ -528,6 +542,7 @@ error:
send_error (hc, ec);
hc->req_state = HTTP_REQ_STATE_WAIT_METHOD;
+ session_transport_closing_notify (&hc->connection);
http_disconnect_transport (hc);
/* stop state machine processing */