VSF Documented
vsf_linux_httpd.h
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright(C)2009-2022 by VSF Team *
3 * *
4 * Licensed under the Apache License, Version 2.0 (the "License"); *
5 * you may not use this file except in compliance with the License. *
6 * You may obtain a copy of the License at *
7 * *
8 * http://www.apache.org/licenses/LICENSE-2.0 *
9 * *
10 * Unless required by applicable law or agreed to in writing, software *
11 * distributed under the License is distributed on an "AS IS" BASIS, *
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13 * See the License for the specific language governing permissions and *
14 * limitations under the License. *
15 * *
16 ****************************************************************************/
17
18#ifndef __VSF_LINUX_HTTPD_H__
19#define __VSF_LINUX_HTTPD_H__
20
21/*============================ INCLUDES ======================================*/
22
24#include "service/vsf_service.h"
25
26#if VSF_LINUX_CFG_RELATIVE_PATH == ENABLED
27# include "../../include/sys/socket.h"
28# include "../../include/netinet/in.h"
29#else
30# include <sys/socket.h>
31# include <netinet/in.h>
32#endif
33
34#undef PUBLIC_CONST
35#if defined(__VSF_LINUX_HTTPD_CLASS_IMPLEMENT)
36# define __VSF_CLASS_IMPLEMENT__
37# define PUBLIC_CONST
38#elif defined(__VSF_LINUX_HTTPD_CLASS_INHERIT__)
39# define __VSF_CLASS_INHERIT__
40# define PUBLIC_CONST
41#else
42# define PUBLIC_CONST const
43#endif
44
45#include "utilities/ooc_class.h"
46
47#ifdef __cplusplus
48extern "C" {
49#endif
50
51/*============================ MACROS ========================================*/
52
53#ifndef VSF_LINUX_HTTPD_CFG_REQUEST_BUFSIZE
54# define VSF_LINUX_HTTPD_CFG_REQUEST_BUFSIZE 1024
55#endif
56#ifndef VSF_LINUX_HTTPD_CFG_PRIV_SIZE
57# define VSF_LINUX_HTTPD_CFG_PRIV_SIZE 256
58#endif
59
60#ifndef VSF_LINUX_HTTPD_CFG_FILESYSTEM
61# define VSF_LINUX_HTTPD_CFG_FILESYSTEM ENABLED
62#endif
63#ifndef VSF_LINUX_HTTPD_CFG_WEBSOCKET
64// websocket depends on mbedtls for sha1 and base64
65# define VSF_LINUX_HTTPD_CFG_WEBSOCKET VSF_USE_MBEDTLS
66#endif
67
68/*============================ MACROFIED FUNCTIONS ===========================*/
69/*============================ TYPES =========================================*/
70
73
78
79 // not supported below, DO NOT USE
88
113
114dcl_vsf_bitmap(vsf_linux_httpd_mime_map_t, VSF_LINUX_HTTPD_MIME_NUM)
115
116typedef enum vsf_linux_httpd_encoding_t {
117 VSF_LINUX_HTTPD_ENCODING_INVALID = 0,
118 VSF_LINUX_HTTPD_ENCODING_IDENTITY = VSF_LINUX_HTTPD_ENCODING_INVALID,
119 VSF_LINUX_HTTPD_ENCODING_GZIP,
120 VSF_LINUX_HTTPD_ENCODING_NUM = VSF_LINUX_HTTPD_ENCODING_GZIP,
122
123dcl_vsf_bitmap(vsf_linux_httpd_encoding_map_t, VSF_LINUX_HTTPD_ENCODING_NUM)
124
125typedef enum vsf_linux_httpd_charset_t {
126 VSF_LINUX_HTTPD_CHARSET_INVALID = 0,
127 VSF_LINUX_HTTPD_CHARSET_UTF8,
128 VSF_LINUX_HTTPD_CHARSET_NUM = VSF_LINUX_HTTPD_CHARSET_UTF8,
130
135
138
140
142
161
169
174
175 void (*stream_evthandler_fn)(vsf_stream_t *stream, void *param, vsf_stream_evt_t evt);
177
183
188
189/*============================ INCLUDES ======================================*/
190
191#ifdef __cplusplus
192}
193#endif
194
195#if VSF_LINUX_HTTPD_CFG_FILESYSTEM == ENABLED
197#endif
198#if VSF_LINUX_HTTPD_CFG_WEBSOCKET == ENABLED
200#endif
201
202#ifdef __cplusplus
203extern "C" {
204#endif
205
206/*============================ TYPES =========================================*/
207
209 // ored value of vsf_linux_httpd_urihandler_match_t
212
213 char *ext;
214 char *uri;
215
216 union {
218 // for remap urihandler
220 };
221
222 union {
223 // parameters for specified urihandler_op
224
225 // for buffer_urihandler
226 struct {
230
231#if VSF_LINUX_HTTPD_CFG_WEBSOCKET == ENABLED
232 struct {
233 void *param;
239#endif
240 };
241
242 int (*poll_fn)(vsf_linux_httpd_request_t *req, fd_set *rset, fd_set *wset, bool prepare);
244
248
250
252 protected_member(
258 vsf_bitmap(vsf_linux_httpd_mime_map_t) mime_map;
259 vsf_bitmap(vsf_linux_httpd_encoding_map_t) encoding_map;
260 uint32_t content_length;
261 char *uri;
262 char *query;
263 bool keep_alive;
264 bool is_stream_out_started;
265 bool upgrade;
266
267#if VSF_LINUX_HTTPD_CFG_WEBSOCKET == ENABLED
268 bool websocket;
269 char *websocket_key;
270#endif
271
272 const vsf_linux_httpd_urihandler_t *urihandler;
273 vsf_stream_t *stream_in, *stream_out;
275
277 uint16_t buffer_pos;
278 uint16_t buffer_length;
279
280 union {
281#if VSF_LINUX_HTTPD_CFG_FILESYSTEM == ENABLED
283#endif
284#if VSF_LINUX_HTTPD_CFG_WEBSOCKET == ENABLED
286#endif
290 } urihandler_ctx;
292 public_member(
293 void *target;
295};
296
298 private_member(
299 vsf_dlist_node_t session_node;
301
302 int fd_socket;
303 int fd_stream_out, fd_stream_in;
304
305 bool wait_stream_out, wait_stream_in;
306 bool fatal_error;
307
308 struct sockaddr_in client_addr;
309 vsf_linux_httpd_t *httpd;
310 )
311};
312
313#if defined(VSF_LINUX_HTTPD_CFG_SESSION_POOL_SIZE) && (VSF_LINUX_HTTPD_CFG_SESSION_POOL_SIZE > 0)
314dcl_vsf_pool(vsf_linux_httpd_session_pool)
315def_vsf_pool(vsf_linux_httpd_session_pool, vsf_linux_httpd_session_t)
316#endif
317
319 public_member(
320 PUBLIC_CONST char *root_path;
322 PUBLIC_CONST uint8_t backlog;
323
324 PUBLIC_CONST uint16_t num_of_urihandler;
327 private_member(
328 vsf_dlist_t session_list;
329#if defined(VSF_LINUX_HTTPD_CFG_SESSION_POOL_SIZE) && (VSF_LINUX_HTTPD_CFG_SESSION_POOL_SIZE > 0)
330 vsf_pool(vsf_linux_httpd_session_pool) session_pool;
331 vsf_pool_item(vsf_linux_httpd_session_pool) sessions[VSF_LINUX_HTTPD_CFG_SESSION_POOL_SIZE];
332#endif
333 )
334};
335
336#undef PUBLIC_CONST
337
338/*============================ GLOBAL VARIABLES ==============================*/
339
341
342/*============================ PROTOTYPES ====================================*/
343
344// httpd thread
345extern void * vsf_linux_httpd_thread(void *param);
346// vsf_linux_httpd_start will call pthread_create to run vsf_linux_httpd_thread
348
349#ifdef __cplusplus
350}
351#endif
352
353#undef __VSF_LINUX_HTTPD_CLASS_IMPLEMENT
354#undef __VSF_LINUX_HTTPD_CLASS_INHERIT__
355
356#endif
357/* EOF */
vsf_err_t
Definition __type.h:42
void(* vsf_linux_httpd_websocket_onerror_t)(vsf_linux_httpd_request_t *req)
Definition __vsf_linux_urihandler_websocket.h:50
void(* vsf_linux_httpd_websocket_onmessage_t)(vsf_linux_httpd_request_t *req, const vsf_linux_httpd_urihandler_websocket_t *websocket_ctx, uint8_t *buf, uint32_t len)
Definition __vsf_linux_urihandler_websocket.h:51
void(* vsf_linux_httpd_websocket_onclose_t)(vsf_linux_httpd_request_t *req)
Definition __vsf_linux_urihandler_websocket.h:49
int(* vsf_linux_httpd_websocket_onopen_t)(vsf_linux_httpd_request_t *req)
Definition __vsf_linux_urihandler_websocket.h:48
Definition vsf_linux_httpd.h:251
Definition vsf_linux_httpd.h:297
Definition vsf_linux_httpd.h:318
Definition vsf_mem_stream.h:88
Definition vsf_simple_stream.h:254
vsf_stream_evt_t
Definition vsf_simple_stream.h:160
struct ieee80211_ext_chansw_ie data
Definition ieee80211.h:80
#define vsf_dcl_class
Definition ooc_class.h:46
#define vsf_class(__name)
Definition ooc_class.h:48
unsigned short uint16_t
Definition stdint.h:7
unsigned uint32_t
Definition stdint.h:9
unsigned int uint_fast32_t
Definition stdint.h:27
unsigned char uint8_t
Definition stdint.h:5
Definition select.h:42
Definition in.h:118
Definition vsf_list.h:888
Definition vsf_list.h:883
Definition __vsf_linux_urihandler_file.h:34
Definition vsf_linux_httpd.h:245
vsf_mem_stream_t stream
Definition vsf_linux_httpd.h:246
Definition vsf_linux_httpd.h:170
void(* stream_evthandler_fn)(vsf_stream_t *stream, void *param, vsf_stream_evt_t evt)
Definition vsf_linux_httpd.h:175
vsf_err_t(* fini_fn)(vsf_linux_httpd_request_t *req)
Definition vsf_linux_httpd.h:172
vsf_err_t(* init_fn)(vsf_linux_httpd_request_t *req, uint8_t *data, uint_fast32_t size)
Definition vsf_linux_httpd.h:171
vsf_err_t(* serve_fn)(vsf_linux_httpd_request_t *req)
Definition vsf_linux_httpd.h:173
Definition vsf_linux_httpd.h:208
vsf_linux_httpd_websocket_onmessage_t on_message
Definition vsf_linux_httpd.h:237
struct vsf_linux_httpd_urihandler_t::@804::@806 buffer
vsf_linux_httpd_websocket_onerror_t on_error
Definition vsf_linux_httpd.h:236
vsf_linux_httpd_websocket_onclose_t on_close
Definition vsf_linux_httpd.h:235
vsf_linux_httpd_websocket_onopen_t on_open
Definition vsf_linux_httpd.h:234
char * uri
Definition vsf_linux_httpd.h:214
char * target_uri
Definition vsf_linux_httpd.h:219
char * ext
Definition vsf_linux_httpd.h:213
struct vsf_linux_httpd_urihandler_t::@804::@807 websocket
uint32_t size
Definition vsf_linux_httpd.h:228
void * param
Definition vsf_linux_httpd.h:233
const vsf_linux_httpd_urihandler_op_t * op
Definition vsf_linux_httpd.h:217
vsf_linux_httpd_urihandler_type_t type
Definition vsf_linux_httpd.h:211
int(* poll_fn)(vsf_linux_httpd_request_t *req, fd_set *rset, fd_set *wset, bool prepare)
Definition vsf_linux_httpd.h:242
uint8_t * ptr
Definition vsf_linux_httpd.h:227
vsf_linux_httpd_urihandler_match_t match
Definition vsf_linux_httpd.h:210
Definition __vsf_linux_urihandler_websocket.h:33
#define dcl_vsf_bitmap(__name, __bit_size)
Definition vsf_bitmap.h:98
#define vsf_bitmap(__name)
Definition vsf_bitmap.h:93
const vsf_linux_httpd_urihandler_op_t vsf_linux_httpd_urihandler_buffer_op
Definition vsf_linux_httpd.c:264
#define VSF_LINUX_HTTPD_CFG_PRIV_SIZE
Definition vsf_linux_httpd.h:57
vsf_err_t vsf_linux_httpd_start(vsf_linux_httpd_t *httpd)
Definition vsf_linux_httpd.c:1072
vsf_linux_httpd_mime_t
Definition vsf_linux_httpd.h:89
@ VSF_LINUX_HTTPD_MIME_INVALID
Definition vsf_linux_httpd.h:90
@ VSF_LINUX_HTTPD_MIME_AUDIO_WAV
Definition vsf_linux_httpd.h:102
@ VSF_LINUX_HTTPD_MIME_IMAGE_GIF
Definition vsf_linux_httpd.h:95
@ VSF_LINUX_HTTPD_MIME_TEXT_HTML
Definition vsf_linux_httpd.h:91
@ VSF_LINUX_HTTPD_MIME_APP_TAR
Definition vsf_linux_httpd.h:106
@ VSF_LINUX_HTTPD_MIME_AUDIO_OGG
Definition vsf_linux_httpd.h:103
@ VSF_LINUX_HTTPD_MIME_IMAGE_SVG
Definition vsf_linux_httpd.h:98
@ VSF_LINUX_HTTPD_MIME_TEXT_XML
Definition vsf_linux_httpd.h:92
@ VSF_LINUX_HTTPD_MIME_APP_ZIP
Definition vsf_linux_httpd.h:107
@ VSF_LINUX_HTTPD_MIME_TEXT_PLAIN
Definition vsf_linux_httpd.h:94
@ VSF_LINUX_HTTPD_MIME_IMAGE_ICON
Definition vsf_linux_httpd.h:99
@ VSF_LINUX_HTTPD_MIME_APP_WASM
Definition vsf_linux_httpd.h:109
@ VSF_LINUX_HTTPD_MIME_NUM
Definition vsf_linux_httpd.h:111
@ VSF_LINUX_HTTPD_MIME_APP_JSON
Definition vsf_linux_httpd.h:108
@ VSF_LINUX_HTTPD_MIME_IMAGE_JPEG
Definition vsf_linux_httpd.h:97
@ VSF_LINUX_HTTPD_MIME_APP_PDF
Definition vsf_linux_httpd.h:104
@ VSF_LINUX_HTTPD_MIME_APP_JS
Definition vsf_linux_httpd.h:105
@ VSF_LINUX_HTTPD_MIME_ANY
Definition vsf_linux_httpd.h:110
@ VSF_LINUX_HTTPD_MIME_VIDEO_AVI
Definition vsf_linux_httpd.h:100
@ VSF_LINUX_HTTPD_MIME_TEXT_CSS
Definition vsf_linux_httpd.h:93
@ VSF_LINUX_HTTPD_MIME_IMAGE_PNG
Definition vsf_linux_httpd.h:96
@ VSF_LINUX_HTTPD_MIME_AUDIO_MPEG
Definition vsf_linux_httpd.h:101
void * vsf_linux_httpd_thread(void *param)
Definition vsf_linux_httpd.c:856
#define VSF_LINUX_HTTPD_CFG_REQUEST_BUFSIZE
Definition vsf_linux_httpd.h:54
vsf_linux_httpd_encoding_t
Definition vsf_linux_httpd.h:121
vsf_linux_httpd_urihandler_type_t
Definition vsf_linux_httpd.h:184
@ VSF_LINUX_HTTPD_URI_REMAP
Definition vsf_linux_httpd.h:186
@ VSF_LINUX_HTTPD_URI_OP
Definition vsf_linux_httpd.h:185
vsf_linux_httpd_urihandler_match_t
Definition vsf_linux_httpd.h:178
@ VSF_LINUX_HTTPD_URI_MATCH_EXT
Definition vsf_linux_httpd.h:179
@ VSF_LINUX_HTTPD_URI_MATCH_ANY
Definition vsf_linux_httpd.h:181
@ VSF_LINUX_HTTPD_URI_MATCH_URI
Definition vsf_linux_httpd.h:180
vsf_linux_httpd_response_t
Definition vsf_linux_httpd.h:136
@ VSF_LINUX_HTTPD_METHOD_NOT_ALLOWED
Definition vsf_linux_httpd.h:148
@ VSF_LINUX_HTTPD_BAD_REQUEST
Definition vsf_linux_httpd.h:143
@ VSF_LINUX_HTTPD_CONFLICT
Definition vsf_linux_httpd.h:152
@ VSF_LINUX_HTTPD_PROXY_AUTHENTICATION_REQUIRED
Definition vsf_linux_httpd.h:150
@ VSF_LINUX_HTTPD_REQUEST_TIME_OUT
Definition vsf_linux_httpd.h:151
@ VSF_LINUX_HTTPD_BAD_GATEWAY
Definition vsf_linux_httpd.h:164
@ VSF_LINUX_HTTPD_CONTINUE
Definition vsf_linux_httpd.h:137
@ VSF_LINUX_HTTPD_REQUEST_URI_TOO_LARGE
Definition vsf_linux_httpd.h:157
@ VSF_LINUX_HTTPD_NOT_FOUND
Definition vsf_linux_httpd.h:147
@ VSF_LINUX_HTTPD_FORBIDDEN
Definition vsf_linux_httpd.h:146
@ VSF_LINUX_HTTPD_NOT_IMPLEMENT
Definition vsf_linux_httpd.h:163
@ VSF_LINUX_HTTPD_GATEWAY_TIME_OUT
Definition vsf_linux_httpd.h:166
@ VSF_LINUX_HTTPD_NOT_ACCEPTABLE
Definition vsf_linux_httpd.h:149
@ VSF_LINUX_HTTPD_HTTP_VERSION_NOT_SUPPORTED
Definition vsf_linux_httpd.h:167
@ VSF_LINUX_HTTPD_SERVICE_UNAVAILABLE
Definition vsf_linux_httpd.h:165
@ VSF_LINUX_HTTPD_UNAUTHORIZED
Definition vsf_linux_httpd.h:144
@ VSF_LINUX_HTTPD_INTERNAL_SERVER_ERROR
Definition vsf_linux_httpd.h:162
@ VSF_LINUX_HTTPD_OK
Definition vsf_linux_httpd.h:139
@ VSF_LINUX_HTTPD_PRECONDITION_FAILED
Definition vsf_linux_httpd.h:155
@ VSF_LINUX_HTTPD_LENGTH_REQUIRED
Definition vsf_linux_httpd.h:154
@ VSF_LINUX_HTTPD_MULTIPLE_CHOICES
Definition vsf_linux_httpd.h:141
@ VSF_LINUX_HTTPD_UNSUPPORTED_MEDIA_TYPE
Definition vsf_linux_httpd.h:158
@ VSF_LINUX_HTTPD_EXPECTATION_FAILED
Definition vsf_linux_httpd.h:160
@ VSF_LINUX_HTTPD_PAYMENT_REQUIRED
Definition vsf_linux_httpd.h:145
@ VSF_LINUX_HTTPD_REQUESTED_RANGE_NOT_SATISFIABLE
Definition vsf_linux_httpd.h:159
@ VSF_LINUX_HTTPD_GONE
Definition vsf_linux_httpd.h:153
@ VSF_LINUX_HTTPD_REQUEST_ENITIY_TOO_LARGE
Definition vsf_linux_httpd.h:156
vsf_linux_httpd_request_method_t
Definition vsf_linux_httpd.h:74
@ VSF_LINUX_HTTPD_CONNECT
Definition vsf_linux_httpd.h:83
@ VSF_LINUX_HTTPD_POST
Definition vsf_linux_httpd.h:76
@ VSF_LINUX_HTTPD_TRACE
Definition vsf_linux_httpd.h:85
@ VSF_LINUX_HTTPD_PUT
Definition vsf_linux_httpd.h:81
@ VSF_LINUX_HTTPD_DELETE
Definition vsf_linux_httpd.h:82
@ VSF_LINUX_HTTPD_METHOD_NUM
Definition vsf_linux_httpd.h:77
@ VSF_LINUX_HTTPD_PATCH
Definition vsf_linux_httpd.h:86
@ VSF_LINUX_HTTPD_HEAD
Definition vsf_linux_httpd.h:80
@ VSF_LINUX_HTTPD_OPTIONS
Definition vsf_linux_httpd.h:84
@ VSF_LINUX_HTTPD_GET
Definition vsf_linux_httpd.h:75
#define PUBLIC_CONST
Definition vsf_linux_httpd.h:42
vsf_linux_httpd_charset_t
Definition vsf_linux_httpd.h:129
vsf_linux_httpd_language_t
Definition vsf_linux_httpd.h:131
@ VSF_LINUX_HTTPD_ENGLISH
Definition vsf_linux_httpd.h:133
@ VSF_LINUX_HTTPD_LANGUAGE_INVALID
Definition vsf_linux_httpd.h:132
uint32_t size
Definition vsf_memfs.h:50
#define vsf_pool(__name)
Definition vsf_pool.h:258
#define vsf_pool_item(__name)
Definition vsf_pool.h:259
#define dcl_vsf_pool(__name)
Definition vsf_pool.h:264
#define def_vsf_pool(__name, __type)
Definition vsf_pool.h:271