VSF Documented
__vsf_linux_urihandler_file.inc
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/*============================ INCLUDES ======================================*/
19/*============================ MACROS ========================================*/
20/*============================ MACROFIED FUNCTIONS ===========================*/
21/*============================ TYPES =========================================*/
22/*============================ GLOBAL VARIABLES ==============================*/
23/*============================ PROTOTYPES ====================================*/
24
25static vsf_err_t __vsf_linux_httpd_urihandler_file_init(vsf_linux_httpd_request_t *req, uint8_t *data, uint_fast32_t size);
26static vsf_err_t __vsf_linux_httpd_urihandler_file_fini(vsf_linux_httpd_request_t *req);
27static vsf_err_t __vsf_linux_httpd_urihandler_file_serve(vsf_linux_httpd_request_t *req);
28
29/*============================ LOCAL VARIABLES ===============================*/
30
31static const vsf_linux_httpd_urihandler_op_t __vsf_linux_httpd_urihandler_file_op = {
32 .init_fn = __vsf_linux_httpd_urihandler_file_init,
33 .fini_fn = __vsf_linux_httpd_urihandler_file_fini,
34 .serve_fn = __vsf_linux_httpd_urihandler_file_serve,
35};
36
37/*============================ IMPLEMENTATION ================================*/
38
39static void __vsf_linux_httpd_urihandler_file_evthandler(vsf_eda_t *eda, vsf_evt_t evt)
40{
42 vsf_linux_httpd_request_t *request = vsf_container_of(urihandler_file, vsf_linux_httpd_request_t, urihandler_ctx);
43 vk_file_stream_t *file_stream = &urihandler_file->file_stream;
44 vsf_stream_t *stream = &urihandler_file->stream.use_as__vsf_stream_t;
45
46 switch (evt) {
47 case VSF_EVT_INIT:
48 vk_file_read_stream(file_stream, stream, request->content_length);
49 request->is_stream_out_started = true;
50 break;
51 case VSF_EVT_RETURN:
52 break;
53 }
54}
55
56static vsf_err_t __vsf_linux_httpd_urihandler_file_init(vsf_linux_httpd_request_t *req, uint8_t *data, uint_fast32_t size)
57{
58 VSF_LINUX_ASSERT((req != NULL) && (req->uri != NULL));
59
61 vsf_linux_httpd_urihandler_file_t *urihandler_file = &req->urihandler_ctx.file;
62 char *uri = req->uri, *root_path = session->httpd->root_path;
63
64 if (NULL == root_path) {
65 __not_found:
66 req->response = VSF_LINUX_HTTPD_NOT_FOUND;
67 return VSF_ERR_FAIL;
68 }
69
70 // get root file
71 vk_file_t *root_dir = NULL, *uri_file;
72 if (root_path != NULL) {
73 vk_file_open(NULL, root_path, &root_dir);
75 goto __not_found;
76 }
77 }
78
79 if (uri[0] == '/') {
80 uri++;
81 }
82 vk_file_open(root_dir, uri, &uri_file);
84 goto __not_found;
85 }
86 vk_file_close(root_dir);
87
88 // if uri is a directory, get index.html/index.htm
89 if (uri_file->attr & VSF_FILE_ATTR_DIRECTORY) {
90 vk_file_t *html_file;
91 vk_file_open(uri_file, "index.html", &html_file);
93 vk_file_open(uri_file, "index.htm", &html_file);
95 vk_file_close(uri_file);
96 goto __not_found;
97 }
98 }
99 vk_file_close(uri_file);
100 uri_file = html_file;
102 }
103 urihandler_file->file_stream.file = uri_file;
104 req->content_length = uri_file->size;
105
106 vsf_fifo_stream_t *stream = &urihandler_file->stream;
107 stream->op = &vsf_fifo_stream_op;
108 stream->buffer = req->buffer;
109 stream->size = sizeof(req->buffer);
110 VSF_STREAM_INIT(stream);
111 req->stream_out = &stream->use_as__vsf_stream_t;
112
113 req->response = VSF_LINUX_HTTPD_OK;
114
115 return VSF_ERR_NONE;
116}
117
118static vsf_err_t __vsf_linux_httpd_urihandler_file_fini(vsf_linux_httpd_request_t *req)
119{
120 vsf_linux_httpd_urihandler_file_t *urihandler_file = &req->urihandler_ctx.file;
121 if (urihandler_file->file_stream.file != NULL) {
122 vk_file_close(urihandler_file->file_stream.file);
123 }
124 return VSF_ERR_NONE;
125}
126
127static vsf_err_t __vsf_linux_httpd_urihandler_file_serve(vsf_linux_httpd_request_t *req)
128{
129 vsf_linux_httpd_urihandler_file_t *urihandler_file = &req->urihandler_ctx.file;
130#if VSF_KERNEL_CFG_EDA_SUPPORT_ON_TERMINATE == ENABLED
131 urihandler_file->eda.on_terminate = NULL;
132#endif
133 urihandler_file->eda.fn.evthandler = __vsf_linux_httpd_urihandler_file_evthandler;
134 return vsf_eda_init(&urihandler_file->eda);
135}
#define vsf_container_of(__ptr, __type, __member)
Definition __type.h:164
vsf_err_t
Definition __type.h:42
@ VSF_ERR_NONE
none error
Definition __type.h:44
@ VSF_ERR_FAIL
failed
Definition __type.h:51
Definition vsf_fs.h:182
vk_file_t * file
Definition vsf_fs.h:185
Definition vsf_fs.h:114
Definition vsf_eda.h:766
union vsf_eda_t::@714 fn
vsf_eda_on_terminate_t on_terminate
Definition vsf_eda.h:770
vsf_eda_evthandler_t evthandler
Definition vsf_eda.h:781
Definition vsf_fifo_stream.h:99
Definition vsf_linux_httpd.h:251
bool is_stream_out_started
Definition vsf_linux_httpd.h:291
vsf_linux_httpd_mime_t mime
Definition vsf_linux_httpd.h:291
char * uri
Definition vsf_linux_httpd.h:291
uint32_t content_length
Definition vsf_linux_httpd.h:291
Definition vsf_linux_httpd.h:297
PUBLIC_CONST char * root_path
Definition vsf_linux_httpd.h:326
Definition vsf_simple_stream.h:254
#define VSF_STREAM_INIT(__stream)
Definition vsf_simple_stream.h:126
struct ieee80211_ext_chansw_ie data
Definition ieee80211.h:80
#define NULL
Definition stddef.h:52
unsigned int uint_fast32_t
Definition stdint.h:27
unsigned char uint8_t
Definition stdint.h:5
Definition __vsf_linux_urihandler_file.h:34
vk_file_stream_t file_stream
Definition __vsf_linux_urihandler_file.h:37
vsf_fifo_stream_t stream
Definition __vsf_linux_urihandler_file.h:36
vsf_eda_t eda
Definition __vsf_linux_urihandler_file.h:35
Definition vsf_linux_httpd.h:170
vsf_err_t(* init_fn)(vsf_linux_httpd_request_t *req, uint8_t *data, uint_fast32_t size)
Definition vsf_linux_httpd.h:171
uintptr_t vsf_eda_get_return_value(void)
Definition vsf_eda.c:469
int16_t vsf_evt_t
Definition vsf_eda.h:654
@ VSF_EVT_INIT
Definition vsf_eda.h:605
@ VSF_EVT_RETURN
Definition vsf_eda.h:609
#define vsf_eda_init(__eda,...)
Definition vsf_eda.h:166
const vsf_stream_op_t vsf_fifo_stream_op
Definition vsf_fifo_stream.c:45
vsf_err_t vk_file_close(vk_file_t *file)
Definition vsf_fs.c:713
vsf_err_t vk_file_open(vk_file_t *dir, const char *name, vk_file_t **file)
Definition vsf_fs.c:686
vsf_err_t vk_file_read_stream(vk_file_stream_t *pthis, vsf_stream_t *stream, uint_fast32_t size)
Definition vsf_fs.c:1544
@ VSF_FILE_ATTR_DIRECTORY
Definition vsf_fs_cfg.h:104
#define VSF_LINUX_ASSERT
Definition vsf_linux_cfg.h:31
@ VSF_LINUX_HTTPD_MIME_TEXT_HTML
Definition vsf_linux_httpd.h:91
@ VSF_LINUX_HTTPD_NOT_FOUND
Definition vsf_linux_httpd.h:147
@ VSF_LINUX_HTTPD_OK
Definition vsf_linux_httpd.h:139
uint32_t size
Definition vsf_memfs.h:50