diff options
author | Dave Barach <dave@barachs.net> | 2022-12-06 08:39:29 -0500 |
---|---|---|
committer | Dave Barach <dave@barachs.net> | 2022-12-06 11:25:15 -0500 |
commit | 55fbf55c17cc88884aa20e7070bc813000a3b193 (patch) | |
tree | 0260b95dcb6d96edb1caced70231ee2d387fc60a /src/plugins/http | |
parent | 9067f3332ed0ddc143105b003e614f3f90719916 (diff) |
http_static: fix http(s) redirects
Add an http redirect template to generate correct-looking "301 Moved
Permanently" replies.
Supply a default value of 1<<31 for the use_ptr_thresh config parameter.
Expose hss_session_get() so friend plugins which register GET / POST
handlers with the http_static server can add data to the session fifos.
Type: fix
Signed-off-by: Dave Barach <dave@barachs.net>
Change-Id: Ie1452eaf61c6f67311fbab092bc1fe03050bf94f
Diffstat (limited to 'src/plugins/http')
-rw-r--r-- | src/plugins/http/http.c | 45 | ||||
-rw-r--r-- | src/plugins/http/http.h | 1 |
2 files changed, 34 insertions, 12 deletions
diff --git a/src/plugins/http/http.c b/src/plugins/http/http.c index 048b403cd74..27801e8c34f 100644 --- a/src/plugins/http/http.c +++ b/src/plugins/http/http.c @@ -324,10 +324,12 @@ static const char *http_error_template = "HTTP/1.1 %s\r\n" "Pragma: no-cache\r\n" "Content-Length: 0\r\n\r\n"; +static const char *http_redirect_template = "HTTP/1.1 %s\r\n"; + /** * http response boilerplate */ -static const char *http_response_template = "HTTP/1.1 200 OK\r\n" +static const char *http_response_template = "HTTP/1.1 %s\r\n" "Date: %U GMT\r\n" "Expires: %U GMT\r\n" "Server: VPP Static\r\n" @@ -541,9 +543,14 @@ state_srv_wait_app (http_conn_t *hc, transport_send_params_t *sp) goto error; } - if (msg.code != HTTP_STATUS_OK) + ec = msg.code; + + switch (msg.code) { - ec = msg.code; + case HTTP_STATUS_OK: + case HTTP_STATUS_MOVED: + break; + default: goto error; } @@ -558,15 +565,29 @@ state_srv_wait_app (http_conn_t *hc, transport_send_params_t *sp) * - data length */ now = clib_timebase_now (&hm->timebase); - header = format (0, http_response_template, - /* Date */ - format_clib_timebase_time, now, - /* Expires */ - format_clib_timebase_time, now + 600.0, - /* Content type */ - http_content_type_str[msg.content_type], - /* Length */ - msg.data.len); + + switch (msg.code) + { + case HTTP_STATUS_OK: + header = + format (0, http_response_template, http_status_code_str[msg.code], + /* Date */ + format_clib_timebase_time, now, + /* Expires */ + format_clib_timebase_time, now + 600.0, + /* Content type */ + http_content_type_str[msg.content_type], + /* Length */ + msg.data.len); + break; + case HTTP_STATUS_MOVED: + header = + format (0, http_redirect_template, http_status_code_str[msg.code]); + /* Location: http(s)://new-place already queued up as data */ + break; + default: + goto error; + } offset = send_data (hc, header, vec_len (header), 0); if (offset != vec_len (header)) diff --git a/src/plugins/http/http.h b/src/plugins/http/http.h index 04272aee6d6..b11e0da580d 100644 --- a/src/plugins/http/http.h +++ b/src/plugins/http/http.h @@ -95,6 +95,7 @@ typedef enum http_content_type_ #define foreach_http_status_code \ _ (200, OK, "200 OK") \ + _ (301, MOVED, "301 Moved Permanently") \ _ (400, BAD_REQUEST, "400 Bad Request") \ _ (404, NOT_FOUND, "404 Not Found") \ _ (405, METHOD_NOT_ALLOWED, "405 Method Not Allowed") \ |