summaryrefslogtreecommitdiffstats
path: root/src/plugins/http_static/http_static.h
diff options
context:
space:
mode:
authorDave Barach <dave@barachs.net>2019-09-11 21:35:48 -0400
committerDave Barach <dave@barachs.net>2019-09-16 16:18:10 -0400
commit5554c56a65cff3ef90844eb5e63d89283fae74df (patch)
treea4f299ec718601f2929c7003e9ab141b6e70cdfb /src/plugins/http_static/http_static.h
parentda9513af296b54ac0299206862e9654ae2431bf7 (diff)
http_static: add dynamic GET / POST method hooks
Add .json output to format_vnet_sw_interface_cntrs(...) Type: feature Signed-off-by: Dave Barach <dave@barachs.net> Change-Id: Ied036ebfaaafbf1dfc2a4e396c00f09f40659400
Diffstat (limited to 'src/plugins/http_static/http_static.h')
-rw-r--r--src/plugins/http_static/http_static.h165
1 files changed, 165 insertions, 0 deletions
diff --git a/src/plugins/http_static/http_static.h b/src/plugins/http_static/http_static.h
index 910a07e14f9..c8823492da1 100644
--- a/src/plugins/http_static/http_static.h
+++ b/src/plugins/http_static/http_static.h
@@ -19,12 +19,20 @@
#define __included_http_static_h__
#include <vnet/vnet.h>
+#include <vnet/session/application.h>
+#include <vnet/session/application_interface.h>
+#include <vnet/session/session.h>
#include <vnet/ip/ip.h>
#include <vnet/ethernet/ethernet.h>
#include <vppinfra/hash.h>
#include <vppinfra/error.h>
#include <vppinfra/time_range.h>
+#include <vppinfra/tw_timer_2t_1w_2048sl.h>
+#include <vppinfra/bihash_vec8_8.h>
+
+/** @file Static http server definitions
+*/
typedef struct
{
@@ -38,11 +46,168 @@ typedef struct
extern http_static_main_t http_static_main;
+/** \brief Session States
+ */
+
+typedef enum
+{
+ /** Session is closed */
+ HTTP_STATE_CLOSED,
+ /** Session is established */
+ HTTP_STATE_ESTABLISHED,
+ /** Session has sent an OK response */
+ HTTP_STATE_OK_SENT,
+ /** Session has sent an HTML response */
+ HTTP_STATE_SEND_MORE_DATA,
+ /** Number of states */
+ HTTP_STATE_N_STATES,
+} http_session_state_t;
+
+typedef enum
+{
+ CALLED_FROM_RX,
+ CALLED_FROM_TX,
+ CALLED_FROM_TIMER,
+} http_state_machine_called_from_t;
+
+typedef enum
+{
+ HTTP_BUILTIN_METHOD_GET = 0,
+ HTTP_BUILTIN_METHOD_POST,
+} http_builtin_method_type_t;
+
+
+/** \brief Application session
+ */
+typedef struct
+{
+ CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
+ /** Base class instance variables */
+#define _(type, name) type name;
+ foreach_app_session_field
+#undef _
+ /** rx thread index */
+ u32 thread_index;
+ /** rx buffer */
+ u8 *rx_buf;
+ /** vpp session index, handle */
+ u32 vpp_session_index;
+ u64 vpp_session_handle;
+ /** Timeout timer handle */
+ u32 timer_handle;
+ /** Fully-resolved file path */
+ u8 *path;
+ /** File data, a vector */
+ u8 *data;
+ /** Current data send offset */
+ u32 data_offset;
+ /** Need to free data in detach_cache_entry */
+ int free_data;
+
+ /** File cache pool index */
+ u32 cache_pool_index;
+ /** state machine called from... */
+ http_state_machine_called_from_t called_from;
+} http_session_t;
+
+/** \brief In-memory file data cache entry
+ */
+typedef struct
+{
+ /** Name of the file */
+ u8 *filename;
+ /** Contents of the file, as a u8 * vector */
+ u8 *data;
+ /** Last time the cache entry was used */
+ f64 last_used;
+ /** Cache LRU links */
+ u32 next_index;
+ u32 prev_index;
+ /** Reference count, so we don't recycle while referenced */
+ int inuse;
+} file_data_cache_t;
+
+/** \brief Main data structure
+ */
+
+typedef struct
+{
+ /** Per thread vector of session pools */
+ http_session_t **sessions;
+ /** Session pool reader writer lock */
+ clib_rwlock_t sessions_lock;
+ /** vpp session to http session index map */
+ u32 **session_to_http_session;
+
+ /** Enable debug messages */
+ int debug_level;
+
+ /** vpp message/event queue */
+ svm_msg_q_t **vpp_queue;
+
+ /** Unified file data cache pool */
+ file_data_cache_t *cache_pool;
+ /** Hash table which maps file name to file data */
+ BVT (clib_bihash) name_to_data;
+
+ /** Hash tables for built-in GET and POST handlers */
+ uword *get_url_handlers;
+ uword *post_url_handlers;
+
+ /** Current cache size */
+ u64 cache_size;
+ /** Max cache size in bytes */
+ u64 cache_limit;
+ /** Number of cache evictions */
+ u64 cache_evictions;
+
+ /** Cache LRU listheads */
+ u32 first_index;
+ u32 last_index;
+
+ /** root path to be served */
+ u8 *www_root;
+
+ /** Server's event queue */
+ svm_queue_t *vl_input_queue;
+
+ /** API client handle */
+ u32 my_client_index;
+
+ /** Application index */
+ u32 app_index;
+
+ /** Process node index for event scheduling */
+ u32 node_index;
+
+ /** Session cleanup timer wheel */
+ tw_timer_wheel_2t_1w_2048sl_t tw;
+ clib_spinlock_t tw_lock;
+
+ /** Time base, so we can generate browser cache control http spew */
+ clib_timebase_t timebase;
+
+ /** Number of preallocated fifos, usually 0 */
+ u32 prealloc_fifos;
+ /** Private segment size, usually 0 */
+ u32 private_segment_size;
+ /** Size of the allocated rx, tx fifos, roughly 8K or so */
+ u32 fifo_size;
+ /** The bind URI, defaults to tcp://0.0.0.0/80 */
+ u8 *uri;
+ vlib_main_t *vlib_main;
+} http_static_server_main_t;
+
+extern http_static_server_main_t http_static_server_main;
+
int http_static_server_enable_api (u32 fifo_size, u32 cache_limit,
u32 prealloc_fifos,
u32 private_segment_size,
u8 * www_root, u8 * uri);
+void http_static_server_register_builtin_handler
+ (void *fp, char *url, int type);
+
#endif /* __included_http_static_h__ */
/*