#include <vppinfra/bihash_template.c>
-/** @file Static http server, sufficient to
- serve .html / .css / .js content.
-*/
+/** @file static_server.c
+ * Static http server, sufficient to
+ * serve .html / .css / .js content.
+ */
/*? %%clicmd:group_label Static HTTP Server %% ?*/
http_static_server_main_t http_static_server_main;
vec_free (hs->path);
}
-/** \brief clean up a session
- */
-
-static void
-http_static_server_session_cleanup (http_session_t * hs)
-{
- if (!hs)
- return;
-
- http_static_server_detach_cache_entry (hs);
-
- http_static_server_session_lookup_del (hs->thread_index,
- hs->vpp_session_index);
- vec_free (hs->rx_buf);
- http_static_server_session_free (hs);
-}
-
/** \brief Disconnect a session
*/
-
static void
http_static_server_session_disconnect (http_session_t * hs)
{
/** \brief send http data
@param hs - http session
@param data - the data vector to transmit
+ @param length - length of data
@param offset - transmit offset for this operation
@return offset for next transmit operation, may be unchanged w/ full fifo
*/
close_session (http_session_t * hs)
{
http_static_server_session_disconnect (hs);
- http_static_server_session_cleanup (hs);
}
/** \brief Register a builtin GET or POST handler
*/
-void http_static_server_register_builtin_handler
+__clib_export void http_static_server_register_builtin_handler
(void *fp, char *url, int request_type)
{
http_static_server_main_t *hsm = &http_static_server_main;
dp = pool_elt_at_index (hsm->cache_pool, kv.value);
hs->data = dp->data;
/* Update the cache entry, mark it in-use */
- lru_update (hsm, dp, vlib_time_now (hsm->vlib_main));
+ lru_update (hsm, dp, vlib_time_now (vlib_get_main ()));
hs->cache_pool_index = dp - hsm->cache_pool;
dp->inuse++;
if (hsm->debug_level > 1)
if (hsm->debug_level > 1)
clib_warning ("index %d refcnt now %d", hs->cache_pool_index,
dp->inuse);
- lru_add (hsm, dp, vlib_time_now (hsm->vlib_main));
+ lru_add (hsm, dp, vlib_time_now (vlib_get_main ()));
kv.key = (u64) vec_dup (hs->path);
kv.value = dp - hsm->cache_pool;
/* Add to the lookup table */
/* What kind of dog food are we serving? */
suffix = (char *) (hs->path + vec_len (hs->path) - 1);
- while (*suffix != '.')
+ while ((u8 *) suffix >= hs->path && *suffix != '.')
suffix--;
suffix++;
http_type = "text/html";
{
http_static_server_main_t *hsm = &http_static_server_main;
vnet_disconnect_args_t _a = { 0 }, *a = &_a;
- http_session_t *hs;
-
- http_static_server_sessions_writer_lock ();
-
- hs = http_static_server_session_lookup (s->thread_index, s->session_index);
- http_static_server_session_cleanup (hs);
-
- http_static_server_sessions_writer_unlock ();
a->handle = session_handle (s);
a->app_index = hsm->app_index;
{
http_static_server_main_t *hsm = &http_static_server_main;
vnet_disconnect_args_t _a = { 0 }, *a = &_a;
- http_session_t *hs;
-
- http_static_server_sessions_writer_lock ();
-
- hs = http_static_server_session_lookup (s->thread_index, s->session_index);
- http_static_server_session_cleanup (hs);
-
- http_static_server_sessions_writer_unlock ();
a->handle = session_handle (s);
a->app_index = hsm->app_index;
static int
http_static_server_session_connected_callback (u32 app_index, u32 api_context,
- session_t * s, u8 is_fail)
+ session_t * s,
+ session_error_t err)
{
clib_warning ("called...");
return -1;
return -1;
}
+static void
+http_static_session_cleanup (session_t * s, session_cleanup_ntf_t ntf)
+{
+ http_session_t *hs;
+
+ if (ntf == SESSION_CLEANUP_TRANSPORT)
+ return;
+
+ http_static_server_sessions_writer_lock ();
+
+ hs = http_static_server_session_lookup (s->thread_index, s->session_index);
+ if (!hs)
+ goto done;
+
+ http_static_server_detach_cache_entry (hs);
+ http_static_server_session_lookup_del (hs->thread_index,
+ hs->vpp_session_index);
+ vec_free (hs->rx_buf);
+ http_static_server_session_free (hs);
+
+done:
+ http_static_server_sessions_writer_unlock ();
+}
+
/** \brief Session-layer virtual function table
*/
static session_cb_vft_t http_static_server_session_cb_vft = {
.add_segment_callback = http_static_server_add_segment_callback,
.builtin_app_rx_callback = http_static_server_rx_callback,
.builtin_app_tx_callback = http_static_server_tx_callback,
- .session_reset_callback = http_static_server_session_reset_callback
+ .session_reset_callback = http_static_server_session_reset_callback,
+ .session_cleanup_callback = http_static_session_cleanup,
};
static int
http_static_server_attach ()
{
- vnet_app_add_tls_cert_args_t _a_cert, *a_cert = &_a_cert;
- vnet_app_add_tls_key_args_t _a_key, *a_key = &_a_key;
+ vnet_app_add_cert_key_pair_args_t _ck_pair, *ck_pair = &_ck_pair;
http_static_server_main_t *hsm = &http_static_server_main;
u64 options[APP_OPTIONS_N_OPTIONS];
vnet_app_attach_args_t _a, *a = &_a;
vec_free (a->name);
hsm->app_index = a->app_index;
- clib_memset (a_cert, 0, sizeof (*a_cert));
- a_cert->app_index = a->app_index;
- vec_validate (a_cert->cert, test_srv_crt_rsa_len);
- clib_memcpy_fast (a_cert->cert, test_srv_crt_rsa, test_srv_crt_rsa_len);
- vnet_app_add_tls_cert (a_cert);
-
- clib_memset (a_key, 0, sizeof (*a_key));
- a_key->app_index = a->app_index;
- vec_validate (a_key->key, test_srv_key_rsa_len);
- clib_memcpy_fast (a_key->key, test_srv_key_rsa, test_srv_key_rsa_len);
- vnet_app_add_tls_key (a_key);
+ clib_memset (ck_pair, 0, sizeof (*ck_pair));
+ ck_pair->cert = (u8 *) test_srv_crt_rsa;
+ ck_pair->key = (u8 *) test_srv_key_rsa;
+ ck_pair->cert_len = test_srv_crt_rsa_len;
+ ck_pair->key_len = test_srv_key_rsa_len;
+ vnet_app_add_cert_key_pair (ck_pair);
+ hsm->ckpair_index = ck_pair->index;
return 0;
}
http_static_server_listen ()
{
http_static_server_main_t *hsm = &http_static_server_main;
+ session_endpoint_cfg_t sep = SESSION_ENDPOINT_CFG_NULL;
vnet_listen_args_t _a, *a = &_a;
+ char *uri = "tcp://0.0.0.0/80";
+
clib_memset (a, 0, sizeof (*a));
a->app_index = hsm->app_index;
- a->uri = "tcp://0.0.0.0/80";
+
if (hsm->uri)
- a->uri = (char *) hsm->uri;
- return vnet_bind_uri (a);
+ uri = (char *) hsm->uri;
+
+ if (parse_uri (uri, &sep))
+ return -1;
+
+ clib_memcpy (&a->sep_ext, &sep, sizeof (sep));
+ a->sep_ext.ckpair_index = hsm->ckpair_index;
+
+ return vnet_listen (a);
}
static void
-http_static_server_session_cleanup_cb (void *hs_handlep)
+http_static_server_session_close_cb (void *hs_handlep)
{
http_static_server_main_t *hsm = &http_static_server_main;
http_session_t *hs;
return;
hs->timer_handle = ~0;
http_static_server_session_disconnect (hs);
- http_static_server_session_cleanup (hs);
}
/** \brief Expired session timer-wheel callback
/* Get session handle. The first bit is the timer id */
hs_handle = expired_timers[i] & 0x7FFFFFFF;
session_send_rpc_evt_to_thread (hs_handle >> 24,
- http_static_server_session_cleanup_cb,
+ http_static_server_session_close_cb,
uword_to_pointer (hs_handle, void *));
}
}
for (i = 0; i < vec_len (hsm->sessions); i++)
{
/* *INDENT-OFF* */
- pool_foreach (hs, hsm->sessions[i],
- ({
+ pool_foreach (hs, hsm->sessions[i])
+ {
vec_add1 (session_indices, hs - hsm->sessions[i]);
- }));
+ }
/* *INDENT-ON* */
for (j = 0; j < vec_len (session_indices); j++)