diff options
Diffstat (limited to 'src/plugins/http_static/http_static.c')
-rw-r--r-- | src/plugins/http_static/http_static.c | 91 |
1 files changed, 76 insertions, 15 deletions
diff --git a/src/plugins/http_static/http_static.c b/src/plugins/http_static/http_static.c index 4e611a6a378..077371cac52 100644 --- a/src/plugins/http_static/http_static.c +++ b/src/plugins/http_static/http_static.c @@ -1,7 +1,5 @@ /* - * http_static.c - skeleton vpp engine plug-in - * - * Copyright (c) <current-year> <your-organization> + * Copyright (c) 2017-2022 Cisco and/or its affiliates. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: @@ -31,17 +29,85 @@ #define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__) -#define REPLY_MSG_ID_BASE hmp->msg_id_base +#define REPLY_MSG_ID_BASE hsm->msg_id_base #include <vlibapi/api_helper_macros.h> -http_static_main_t http_static_main; +/** \brief Register a builtin GET or POST handler + */ +__clib_export void +http_static_server_register_builtin_handler (void *fp, char *url, + http_req_method_t request_type) +{ + hss_main_t *hsm = &hss_main; + uword *p, *builtin_table; + + builtin_table = (request_type == HTTP_REQ_GET) ? hsm->get_url_handlers : + hsm->post_url_handlers; + + p = hash_get_mem (builtin_table, url); + + if (p) + { + clib_warning ("WARNING: attempt to replace handler for %s '%s' ignored", + (request_type == HTTP_REQ_GET) ? "GET" : "POST", url); + return; + } + + hash_set_mem (builtin_table, url, (uword) fp); + + /* + * Need to update the hash table pointer in http_static_server_main + * in case we just expanded it... + */ + if (request_type == HTTP_REQ_GET) + hsm->get_url_handlers = builtin_table; + else + hsm->post_url_handlers = builtin_table; +} + +/** \brief API helper function for vl_api_http_static_enable_t messages + */ +static int +hss_enable_api (u32 fifo_size, u32 cache_limit, u32 prealloc_fifos, + u32 private_segment_size, u8 *www_root, u8 *uri) +{ + hss_main_t *hsm = &hss_main; + int rv; + + hsm->fifo_size = fifo_size; + hsm->cache_limit = cache_limit; + hsm->prealloc_fifos = prealloc_fifos; + hsm->private_segment_size = private_segment_size; + hsm->www_root = format (0, "%s%c", www_root, 0); + hsm->uri = format (0, "%s%c", uri, 0); + + if (vec_len (hsm->www_root) < 2) + return VNET_API_ERROR_INVALID_VALUE; + + if (hsm->app_index != ~0) + return VNET_API_ERROR_APP_ALREADY_ATTACHED; + + vnet_session_enable_disable (hsm->vlib_main, 1 /* turn on TCP, etc. */); + + rv = hss_create (hsm->vlib_main); + switch (rv) + { + case 0: + break; + default: + vec_free (hsm->www_root); + vec_free (hsm->uri); + return VNET_API_ERROR_INIT_FAILED; + } + return 0; +} /* API message handler */ static void vl_api_http_static_enable_t_handler (vl_api_http_static_enable_t * mp) { vl_api_http_static_enable_reply_t *rmp; - http_static_main_t *hmp = &http_static_main; + hss_main_t *hsm = &hss_main; int rv; mp->uri[ARRAY_LEN (mp->uri) - 1] = 0; @@ -57,28 +123,23 @@ static void vl_api_http_static_enable_t_handler #include <http_static/http_static.api.c> static clib_error_t * -http_static_init (vlib_main_t * vm) +hss_api_init (vlib_main_t *vm) { - http_static_main_t *hmp = &http_static_main; - - hmp->vlib_main = vm; - hmp->vnet_main = vnet_get_main (); + hss_main_t *hsm = &hss_main; /* Ask for a correctly-sized block of API message decode slots */ - hmp->msg_id_base = setup_message_id_table (); + hsm->msg_id_base = setup_message_id_table (); return 0; } -VLIB_INIT_FUNCTION (http_static_init); +VLIB_INIT_FUNCTION (hss_api_init); -/* *INDENT-OFF* */ VLIB_PLUGIN_REGISTER () = { .version = VPP_BUILD_VER, .description = "HTTP Static Server" }; -/* *INDENT-ON* */ /* * fd.io coding-style-patch-verification: ON |