7#ifndef ZEPHYR_INCLUDE_NET_HTTP_SERVICE_H_
8#define ZEPHYR_INCLUDE_NET_HTTP_SERVICE_H_
59#define HTTP_RESOURCE_DEFINE(_name, _service, _resource, _detail) \
60 const STRUCT_SECTION_ITERABLE_ALTERNATE(http_resource_desc_##_service, http_resource_desc, \
62 .resource = _resource, \
63 .detail = (void *)(_detail), \
68struct http_service_runtime_data {
72struct http_service_desc;
75typedef int (*http_socket_create_fn)(
const struct http_service_desc *svc,
int af,
int proto);
78struct http_service_config {
80 http_socket_create_fn socket_create;
84struct http_service_desc {
91 struct http_service_runtime_data *data;
95 const struct http_service_config *config;
96#if defined(CONFIG_NET_SOCKETS_SOCKOPT_TLS)
98 size_t sec_tag_list_size;
102#define __z_http_service_define(_name, _host, _port, _concurrent, _backlog, _detail, \
103 _res_fallback, _res_begin, _res_end, _config, ...) \
104 BUILD_ASSERT(_concurrent <= CONFIG_HTTP_SERVER_MAX_CLIENTS, \
105 "can't accept more then MAX_CLIENTS"); \
106 BUILD_ASSERT(_backlog > 0, "backlog can't be 0"); \
107 static int _name##_fd = -1; \
108 static struct http_service_runtime_data _name##_data = {0}; \
109 const STRUCT_SECTION_ITERABLE(http_service_desc, _name) = { \
111 .port = (uint16_t *)(_port), \
113 .detail = (void *)(_detail), \
114 .concurrent = (_concurrent), \
115 .backlog = (_backlog), \
116 .data = &_name##_data, \
117 .res_begin = (_res_begin), \
118 .res_end = (_res_end), \
119 .res_fallback = (_res_fallback), \
120 .config = (_config), \
121 COND_CODE_1(CONFIG_NET_SOCKETS_SOCKOPT_TLS, \
122 (.sec_tag_list = COND_CODE_0(NUM_VA_ARGS_LESS_1(__VA_ARGS__), (NULL), \
123 (GET_ARG_N(1, __VA_ARGS__))),), ()) \
124 COND_CODE_1(CONFIG_NET_SOCKETS_SOCKOPT_TLS, \
125 (.sec_tag_list_size = COND_CODE_0(NUM_VA_ARGS_LESS_1(__VA_ARGS__), (0),\
126 (GET_ARG_N(1, GET_ARGS_LESS_N(1, __VA_ARGS__))))), ())\
152#define HTTP_SERVICE_DEFINE_EMPTY(_name, _host, _port, _concurrent, _backlog, _detail, \
153 _res_fallback, _config) \
154 __z_http_service_define(_name, _host, _port, _concurrent, _backlog, _detail, \
155 _res_fallback, NULL, NULL, _config)
180#define HTTPS_SERVICE_DEFINE_EMPTY(_name, _host, _port, _concurrent, _backlog, _detail, \
181 _res_fallback, _config, _sec_tag_list, _sec_tag_list_size) \
182 __z_http_service_define(_name, _host, _port, _concurrent, _backlog, _detail, \
183 _res_fallback, NULL, NULL, _config, \
184 _sec_tag_list, _sec_tag_list_size); \
185 BUILD_ASSERT(IS_ENABLED(CONFIG_NET_SOCKETS_SOCKOPT_TLS), \
186 "TLS is required for HTTP secure (CONFIG_NET_SOCKETS_SOCKOPT_TLS)")
209#define HTTP_SERVICE_DEFINE(_name, _host, _port, _concurrent, _backlog, _detail, _res_fallback, \
211 extern struct http_resource_desc _CONCAT(_http_resource_desc_##_name, _list_start)[]; \
212 extern struct http_resource_desc _CONCAT(_http_resource_desc_##_name, _list_end)[]; \
213 __z_http_service_define(_name, _host, _port, _concurrent, _backlog, _detail, \
215 &_CONCAT(_http_resource_desc_##_name, _list_start)[0], \
216 &_CONCAT(_http_resource_desc_##_name, _list_end)[0], _config);
241#define HTTPS_SERVICE_DEFINE(_name, _host, _port, _concurrent, _backlog, _detail, \
242 _res_fallback, _config, _sec_tag_list, _sec_tag_list_size) \
243 extern struct http_resource_desc _CONCAT(_http_resource_desc_##_name, _list_start)[]; \
244 extern struct http_resource_desc _CONCAT(_http_resource_desc_##_name, _list_end)[]; \
245 __z_http_service_define(_name, _host, _port, _concurrent, _backlog, _detail, \
247 &_CONCAT(_http_resource_desc_##_name, _list_start)[0], \
248 &_CONCAT(_http_resource_desc_##_name, _list_end)[0], _config, \
249 _sec_tag_list, _sec_tag_list_size); \
250 BUILD_ASSERT(IS_ENABLED(CONFIG_NET_SOCKETS_SOCKOPT_TLS), \
251 "TLS is required for HTTP secure (CONFIG_NET_SOCKETS_SOCKOPT_TLS)")
258#define HTTP_SERVICE_COUNT(_dst) STRUCT_SECTION_COUNT(http_service_desc, _dst)
265#define HTTP_SERVICE_RESOURCE_COUNT(_service) ((_service)->res_end - (_service)->res_begin)
272#define HTTP_SERVICE_FOREACH(_it) STRUCT_SECTION_FOREACH(http_service_desc, _it)
282#define HTTP_RESOURCE_FOREACH(_service, _it) \
283 STRUCT_SECTION_FOREACH_ALTERNATE(http_resource_desc_##_service, http_resource_desc, _it)
294#define HTTP_SERVICE_FOREACH_RESOURCE(_service, _it) \
295 for (struct http_resource_desc *_it = (_service)->res_begin; ({ \
296 __ASSERT(_it <= (_service)->res_end, "unexpected list end location"); \
297 _it < (_service)->res_end; \
int sec_tag_t
Secure tag, a reference to TLS credential.
Definition tls_credentials.h:80
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
HTTP resource description.
Definition service.h:35
const char * resource
Resource name.
Definition service.h:37
void * detail
Detail associated with this resource.
Definition service.h:39
Representation of a server resource, common for all resource types.
Definition server.h:88
TLS credentials management.