diff options
Diffstat (limited to 'src/plugins/http_static/static_server.c')
-rw-r--r-- | src/plugins/http_static/static_server.c | 90 |
1 files changed, 59 insertions, 31 deletions
diff --git a/src/plugins/http_static/static_server.c b/src/plugins/http_static/static_server.c index 94124495bd8..a78b5fe4f2b 100644 --- a/src/plugins/http_static/static_server.c +++ b/src/plugins/http_static/static_server.c @@ -295,14 +295,51 @@ done: } static int +try_url_handler (hss_main_t *hsm, hss_session_t *hs, http_req_method_t rt, + u8 *request, http_status_code_t *sc) +{ + uword *p, *url_table; + hss_url_handler_t fp; + int rv; + + if (!hsm->enable_url_handlers) + return -1; + + /* Look for built-in GET / POST handlers */ + url_table = + (rt == HTTP_REQ_GET) ? hsm->get_url_handlers : hsm->post_url_handlers; + + p = hash_get_mem (url_table, request); + if (!p) + return -1; + + if (hsm->debug_level > 0) + clib_warning ("%s '%s'", (rt == HTTP_REQ_GET) ? "GET" : "POST", request); + + fp = (hss_url_handler_t) p[0]; + hs->path = 0; + rv = fp (rt, request, hs); + if (rv) + { + clib_warning ("builtin handler %llx hit on %s '%s' but failed!", p[0], + (rt == HTTP_REQ_GET) ? "GET" : "POST", request); + *sc = HTTP_STATUS_NOT_FOUND; + } + + return 0; +} + +static int find_data (hss_session_t *hs, http_req_method_t rt, u8 *request) { + http_status_code_t sc = HTTP_STATUS_OK; hss_main_t *hsm = &hss_main; - u8 *path; struct stat _sb, *sb = &_sb; clib_error_t *error; - uword *p, *builtin_table; - http_status_code_t sc = HTTP_STATUS_OK; + u8 *path; + + if (!try_url_handler (hsm, hs, rt, request, &sc)) + goto done; /* * Construct the file to open @@ -316,29 +353,6 @@ find_data (hss_session_t *hs, http_req_method_t rt, u8 *request) if (hsm->debug_level > 0) clib_warning ("%s '%s'", (rt == HTTP_REQ_GET) ? "GET" : "POST", path); - /* Look for built-in GET / POST handlers */ - builtin_table = - (rt == HTTP_REQ_GET) ? hsm->get_url_handlers : hsm->post_url_handlers; - - p = hash_get_mem (builtin_table, request); - - if (p) - { - int rv; - int (*fp) (http_req_method_t, u8 *, hss_session_t *); - fp = (void *) p[0]; - hs->path = path; - rv = (*fp) (rt, request, hs); - if (rv) - { - clib_warning ("builtin handler %llx hit on %s '%s' but failed!", - p[0], (rt == HTTP_REQ_GET) ? "GET" : "POST", request); - - sc = HTTP_STATUS_NOT_FOUND; - } - goto done; - } - /* Try to find the file. 2x special cases to find index.html */ if (stat ((char *) path, sb) < 0 /* cant even stat the file */ || sb->st_size < 20 /* file too small */ @@ -788,6 +802,18 @@ hss_listen (void) return rv; } +static void +hss_url_handlers_init (hss_main_t *hsm) +{ + if (!hsm->get_url_handlers) + { + hsm->get_url_handlers = hash_create_string (0, sizeof (uword)); + hsm->post_url_handlers = hash_create_string (0, sizeof (uword)); + } + + hss_builtinurl_json_handlers_init (); +} + int hss_create (vlib_main_t *vm) { @@ -814,8 +840,8 @@ hss_create (vlib_main_t *vm) /* Init path-to-cache hash table */ BV (clib_bihash_init) (&hsm->name_to_data, "http cache", 128, 32 << 20); - hsm->get_url_handlers = hash_create_string (0, sizeof (uword)); - hsm->post_url_handlers = hash_create_string (0, sizeof (uword)); + if (hsm->enable_url_handlers) + hss_url_handlers_init (hsm); return 0; } @@ -867,6 +893,8 @@ hss_create_command_fn (vlib_main_t *vm, unformat_input_t *input, else if (unformat (line_input, "ptr-thresh %U", unformat_memory_size, &hsm->use_ptr_thresh)) ; + else if (unformat (line_input, "url-handlers")) + hsm->enable_url_handlers = 1; else { error = clib_error_return (0, "unknown input `%U'", @@ -881,9 +909,9 @@ no_input: if (error) goto done; - if (hsm->www_root == 0) + if (hsm->www_root == 0 && !hsm->enable_url_handlers) { - error = clib_error_return (0, "Must specify www-root <path>"); + error = clib_error_return (0, "Must set www-root or url-handlers"); goto done; } @@ -924,7 +952,7 @@ VLIB_CLI_COMMAND (hss_create_command, static) = { .short_help = "http static server www-root <path> [prealloc-fifos <nn>]\n" "[private-segment-size <nnMG>] [fifo-size <nbytes>] [uri <uri>]\n" - "[ptr-thresh <nn>][debug [nn]]\n", + "[ptr-thresh <nn>] [url-handlers] [debug [nn]]\n", .function = hss_create_command_fn, }; |