Ulfius: include/ulfius.h Source File

Ulfius HTTP Framework for REST Applications in C

ulfius.h
Go to the documentation of this file.
1
27 #ifndef __ULFIUS_H__
28 #define __ULFIUS_H__
29
30 #ifdef __cplusplus
31 extern "C"
32 {
33 #endif
34
35 #include "ulfius-cfg.h"
36
39 #ifndef U_DISABLE_GNUTLS
40 #ifndef _GNU_SOURCE
41 #define _GNU_SOURCE
42 #endif
43 #include <gnutls/gnutls.h>
44 #include <gnutls/x509.h>
45 #endif
46
47 #ifndef U_DISABLE_WEBSOCKET
48 #include <poll.h>
49 #include <zlib.h>
50 #ifndef POLLRDHUP
51 #define POLLRDHUP 0x2000
52 #endif
53 #endif
54
55 #include <pthread.h>
56 #include <microhttpd.h>
57
58 #if defined(_WIN32) && !defined(U_DISABLE_WEBSOCKET)
59 #define U_DISABLE_WEBSOCKET
60 #endif
61
62 #if (MHD_VERSION < 0x00095300) && !defined(U_DISABLE_WEBSOCKET)
63 #define U_DISABLE_WEBSOCKET
64 #endif
65
67 #include <orcania.h>
68
70 #ifndef U_DISABLE_YDER
71 #include <yder.h>
72 #else
73
74 #define Y_LOG_MODE_NONE 0
75 #define Y_LOG_MODE_CONSOLE 0
76 #define Y_LOG_MODE_SYSLOG 0
77 #define Y_LOG_MODE_FILE 0
78 #define Y_LOG_MODE_JOURNALD 0
79 #define Y_LOG_MODE_CALLBACK 0
80 #define Y_LOG_MODE_CURRENT 0
81
82 #define Y_LOG_LEVEL_NONE 0
83 #define Y_LOG_LEVEL_DEBUG 0
84 #define Y_LOG_LEVEL_INFO 0
85 #define Y_LOG_LEVEL_WARNING 0
86 #define Y_LOG_LEVEL_ERROR 0
87 #define Y_LOG_LEVEL_CURRENT 0
88
89 int y_init_logs(const char * app, const unsigned long init_mode, const unsigned long init_level, const char * init_log_file, const char * message);
90 int y_set_logs_callback(void (* y_callback_log_message) (void * cls, const char * app_name, const time_t date, const unsigned long level, const char * message), void * cls, const char * message);
91 void y_log_message(const unsigned long type, const char * message, ...);
92 int y_close_logs();
93 #endif
94
95 #ifndef U_DISABLE_JANSSON
96 #include <jansson.h>
97 #endif
98
104 #define ULFIUS_STREAM_BLOCK_SIZE_DEFAULT 1024
105 #define U_STREAM_END MHD_CONTENT_READER_END_OF_STREAM
106 #define U_STREAM_ERROR MHD_CONTENT_READER_END_WITH_ERROR
107 #define U_STREAM_SIZE_UNKNOWN MHD_SIZE_UNKNOWN
108 #define U_STREAM_SIZE_UNKOWN U_STREAM_SIZE_UNKNOWN // Backward compatibility
109
110 #define U_OK 0
111 #define U_ERROR 1
112 #define U_ERROR_MEMORY 2
113 #define U_ERROR_PARAMS 3
114 #define U_ERROR_LIBMHD 4
115 #define U_ERROR_LIBCURL 5
116 #define U_ERROR_NOT_FOUND 6
117 #define U_ERROR_DISCONNECTED 7
118
119 #define U_CALLBACK_CONTINUE 0
120 #define U_CALLBACK_IGNORE 1
121 #define U_CALLBACK_COMPLETE 2
122 #define U_CALLBACK_UNAUTHORIZED 3
123 #define U_CALLBACK_ERROR 4
124
125 #define U_COOKIE_SAME_SITE_NONE 0
126 #define U_COOKIE_SAME_SITE_STRICT 1
127 #define U_COOKIE_SAME_SITE_LAX 2
128
129 #define U_USE_IPV4 0x0001
130 #define U_USE_IPV6 0x0010
131 #define U_USE_ALL (U_USE_IPV4|U_USE_IPV6)
132
133 #define U_SSL_VERIFY_PEER 0x0001
134 #define U_SSL_VERIFY_HOSTNAME 0x0010
135
136
140 typedef enum {
141 U_OPT_NONE = 0,
142 U_OPT_HTTP_VERB = 1,
143 U_OPT_HTTP_URL = 2,
144 U_OPT_HTTP_PROXY = 3,
145 #if MHD_VERSION >= 0x00095208
146 U_OPT_NETWORK_TYPE = 4,
147 #endif
148 U_OPT_CHECK_SERVER_CERTIFICATE = 5,
149 U_OPT_CHECK_SERVER_CERTIFICATE_FLAG = 6,
150 U_OPT_CHECK_PROXY_CERTIFICATE = 7,
151 U_OPT_CHECK_PROXY_CERTIFICATE_FLAG = 8,
152 U_OPT_FOLLOW_REDIRECT = 9,
153 U_OPT_CA_PATH = 10,
154 U_OPT_TIMEOUT = 11,
155 U_OPT_AUTH_BASIC_USER = 12,
156 U_OPT_AUTH_BASIC_PASSWORD = 13,
157 U_OPT_URL_PARAMETER = 14,
158 U_OPT_HEADER_PARAMETER = 15,
159 U_OPT_COOKIE_PARAMETER = 16,
160 U_OPT_POST_BODY_PARAMETER = 17,
161 U_OPT_URL_PARAMETER_REMOVE = 18,
162 U_OPT_HEADER_PARAMETER_REMOVE = 19,
163 U_OPT_COOKIE_PARAMETER_REMOVE = 20,
164 U_OPT_POST_BODY_PARAMETER_REMOVE = 21,
165 U_OPT_BINARY_BODY = 22,
166 U_OPT_STRING_BODY = 23,
167 #ifndef U_DISABLE_JANSSON
168 U_OPT_JSON_BODY = 24,
169 #endif
170 #ifndef U_DISABLE_GNUTLS
171 U_OPT_CLIENT_CERT_FILE = 25,
172 U_OPT_CLIENT_KEY_FILE = 26,
173 U_OPT_CLIENT_KEY_PASSWORD = 27,
174 #endif
175 U_OPT_STATUS = 28,
176 U_OPT_AUTH_REALM = 29,
177 U_OPT_SHARED_DATA = 30
178 } u_option;
179
184 /*************
185 * Structures
186 *************/
187
197 struct _u_map {
198 int nb_values; /* !< Values count */
199 char ** keys; /* !< Array of keys */
200 char ** values; /* !< Array of values */
201 size_t * lengths; /* !< Lengths of each values */
202 };
203
208 struct _u_cookie {
209 char * key; /* !< key if the cookie */
210 char * value; /* !< value of the cookie */
211 char * expires; /* !< expiration date of the cookie */
212 unsigned int max_age; /* !< duration of the cookie in seconds */
213 char * domain; /* !< domain for the cookie */
214 char * path; /* !< url path for the cookie */
215 int secure; /* !< flag to set cookie secure or not */
216 int http_only; /* !< flag to set cookie for HTTP connections only or not */
217 int same_site; /* !< flag to set same_site option to the cookie */
218 };
219
226 struct _u_request {
227 char * http_protocol; /* !< http protocol used (1.0 or 1.1) */
228 char * http_verb; /* !< http method (GET, POST, PUT, DELETE, etc.) */
229 char * http_url; /* !< full url used to call this callback function or full url to call when used in a ulfius_send_http_request */
230 char * url_path; /* !< url path only used to call this callback function (ex, if http_url is /path/?param=1, url_path is /path/) */
231 char * proxy; /* !<proxy address to use for outgoing connections, used by ulfius_send_http_request */
232 #if MHD_VERSION >= 0x00095208
233 unsigned short network_type; /* !< Force connect to ipv4, ipv6 addresses or both, values available are U_USE_ALL, U_USE_IPV4 or U_USE_IPV6 */
234 #endif
235 int check_server_certificate; /* !< check server certificate and hostname, default true, used by ulfius_send_http_request */
236 int check_server_certificate_flag; /* !< check certificate peer and or server hostname if check_server_certificate is enabled, values available are U_SSL_VERIFY_PEER, U_SSL_VERIFY_HOSTNAME or both, default value is both (U_SSL_VERIFY_PEER|U_SSL_VERIFY_HOSTNAME), used by ulfius_send_http_request */
237 int check_proxy_certificate; /* !< check proxy certificate and hostname, default true, used by ulfius_send_http_request, requires libcurl >= 7.52 */
238 int check_proxy_certificate_flag; /* !< check certificate peer and or proxy hostname if check_proxy_certificate is enabled, values available are U_SSL_VERIFY_PEER, U_SSL_VERIFY_HOSTNAME or both, default value is both (U_SSL_VERIFY_PEER|U_SSL_VERIFY_HOSTNAME), used by ulfius_send_http_request, requires libcurl >= 7.52 */
239 int follow_redirect; /* !< follow url redirections, used by ulfius_send_http_request */
240 char * ca_path; /* !< specify a path to CA certificates instead of system path, used by ulfius_send_http_request */
241 unsigned long timeout; /* !< connection timeout used by ulfius_send_http_request, default is 0 */
242 struct sockaddr * client_address; /* !< IP address of the client */
243 char * auth_basic_user; /* !< basic authentication username */
244 char * auth_basic_password; /* !< basic authentication password */
245 struct _u_map * map_url; /* !< map containing the url variables, both from the route and the ?key=value variables */
246 struct _u_map * map_header; /* !< map containing the header variables */
247 struct _u_map * map_cookie; /* !< map containing the cookie variables */
248 struct _u_map * map_post_body; /* !< map containing the post body variables (if available) */
249 void * binary_body; /* !< raw body */
250 size_t binary_body_length; /* !< length of raw body */
251 unsigned int callback_position; /* !< position of the current callback function in the callback list, starts at 0 */
252 #ifndef U_DISABLE_GNUTLS
253 gnutls_x509_crt_t client_cert; /* !< x509 certificate of the client if the instance uses client certificate authentication and the client is authenticated, available only if GnuTLS support is enabled */
254 char * client_cert_file; /* !< path to client certificate file for sending http requests with certificate authentication, available only if GnuTLS support is enabled */
255 char * client_key_file; /* !< path to client key file for sending http requests with certificate authentication, available only if GnuTLS support is enabled */
256 char * client_key_password; /* !< password to unlock client key file, available only if GnuTLS support is enabled */
257 #endif
258 };
259
266 struct _u_response {
267 long status; /* !< HTTP status code (200, 404, 500, etc) */
268 char * protocol; /* !< HTTP Protocol sent */
269 struct _u_map * map_header; /* !< map containing the header variables */
270 unsigned int nb_cookies; /* !< number of cookies sent */
271 struct _u_cookie * map_cookie; /* !< array of cookies sent */
272 char * auth_realm; /* !< realm to send to the client on authenticationb failed */
273 void * binary_body; /* !< raw binary content */
274 size_t binary_body_length; /* !< length of the binary_body */
275 ssize_t (* stream_callback) (void * stream_user_data, uint64_t offset, char * out_buf, size_t max); /* !< callback function to stream data in response body */
276 void (* stream_callback_free) (void * stream_user_data); /* !< callback function to free data allocated for streaming */
277 uint64_t stream_size; /* !< size of the streamed data (U_STREAM_SIZE_UNKNOWN if unknown) */
278 size_t stream_block_size; /* !< size of each block to be streamed, set according to your system */
279 void * stream_user_data; /* !< user defined data that will be available in your callback stream functions */
280 void * websocket_handle; /* !< handle for websocket extension */
281 void * shared_data; /* !< any data shared between callback functions, must be allocated and freed by the callback functions */
282 unsigned int timeout; /* !< Timeout in seconds to close the connection because of inactivity between the client and the server */
283 };
284
291 struct _u_endpoint {
292 char * http_method; /* !< http verb (GET, POST, PUT, etc.) in upper case */
293 char * url_prefix; /* !< prefix for the url (optional) */
294 char * url_format; /* !< string used to define the endpoint format, separate words with / to define a variable in the url, prefix it with @ or :, example: /test/resource/:name/elements, on an url_format that ends with '*', the rest of the url will not be tested */
295 unsigned int priority; /* !< endpoint priority in descending order (0 is the higher priority) */
296 int (* callback_function)(const struct _u_request * request, /* !< pointer to a function that will be executed each time the endpoint is called, you must declare the function as described. */
297 struct _u_response * response,
298 void * user_data);
299 void * user_data; /* !< pointer to a data or a structure that will be available in callback_function */
300 };
301
308 struct _u_instance {
309 struct MHD_Daemon * mhd_daemon; /* !< pointer to the libmicrohttpd daemon */
310 int status; /* !< status of the current instance, status are U_STATUS_STOP, U_STATUS_RUNNING or U_STATUS_ERROR */
311 unsigned int port; /* !< port number to listen to */
312 #if MHD_VERSION >= 0x00095208
313 unsigned short network_type; /* !< Listen to ipv4 and or ipv6 connections, values available are U_USE_ALL, U_USE_IPV4 or U_USE_IPV6 */
314 #endif
315 struct sockaddr_in * bind_address; /* !< ipv4 address to listen to (optional) */
316 struct sockaddr_in6 * bind_address6; /* !< ipv6 address to listen to (optional) */
317 unsigned int timeout; /* !< Timeout to close the connection because of inactivity between the client and the server */
318 int nb_endpoints; /* !< Number of available endpoints */
319 char * default_auth_realm; /* !< Default realm on authentication error */
320 struct _u_endpoint * endpoint_list; /* !< List of available endpoints */
321 struct _u_endpoint * default_endpoint; /* !< Default endpoint if no other endpoint match the current url */
322 struct _u_map * default_headers; /* !< Default headers that will be added to all response->map_header */
323 size_t max_post_param_size; /* !< maximum size for a post parameter, 0 means no limit, default 0 */
324 size_t max_post_body_size; /* !< maximum size for the entire post body, 0 means no limit, default 0 */
325 void * websocket_handler; /* !< handler for the websocket structure */
326 int (* file_upload_callback) (const struct _u_request * request, /* !< callback function to manage file upload by blocks */
327 const char * key,
328 const char * filename,
329 const char * content_type,
330 const char * transfer_encoding,
331 const char * data,
332 uint64_t off,
333 size_t size,
334 void * cls);
335 void * file_upload_cls; /* !< any pointer to pass to the file_upload_callback function */
336 int mhd_response_copy_data; /* !< to choose between MHD_RESPMEM_MUST_COPY and MHD_RESPMEM_MUST_FREE, only if you use MHD < 0.9.61, otherwise this option is skipped because it's useless */
337 int check_utf8; /* !< check that all parameters values in the request (url, header and post_body), are valid utf8 strings, if a parameter value has non utf8 character, the value, will be ignored, default 1 */
338 #ifndef U_DISABLE_GNUTLS
339 int use_client_cert_auth; /* !< Internal variable use to indicate if the instance uses client certificate authentication, Do not change this value, available only if websocket support is enabled */
340 #endif
341 };
342
350 struct connection_info_struct {
351 struct _u_instance * u_instance;
352 struct MHD_PostProcessor * post_processor;
353 int has_post_processor;
354 int callback_first_iteration;
355 struct _u_request * request;
356 size_t max_post_param_size;
357 struct _u_map map_url_initial;
358 };
359
360 /**********************************
361 * Instance functions declarations
362 **********************************/
363
374 void u_free(void * data);
375
383 int ulfius_global_init();
384
388 void ulfius_global_close();
389
411 int ulfius_init_instance(struct _u_instance * u_instance, unsigned int port, struct sockaddr_in * bind_address, const char * default_auth_realm);
412
413 #if MHD_VERSION >= 0x00095208
414
425 int ulfius_init_instance_ipv6(struct _u_instance * u_instance, unsigned int port, struct sockaddr_in6 * bind_address, unsigned short network_type, const char * default_auth_realm);
426 #endif
427
434 void ulfius_clean_instance(struct _u_instance * u_instance);
435
443 int ulfius_start_framework(struct _u_instance * u_instance);
444
454 int ulfius_start_secure_framework(struct _u_instance * u_instance, const char * key_pem, const char * cert_pem);
455
456 #ifndef U_DISABLE_GNUTLS
457
468 int ulfius_start_secure_ca_trust_framework(struct _u_instance * u_instance, const char * key_pem, const char * cert_pem, const char * root_ca_pem);
469 #endif
470
489 int ulfius_start_framework_with_mhd_options(struct _u_instance * u_instance, unsigned int mhd_flags, struct MHD_OptionItem * options);
490
494 void mhd_request_completed (void *cls, struct MHD_Connection *connection, void **con_cls, enum MHD_RequestTerminationCode toe);
495 void * ulfius_uri_logger (void * cls, const char * uri);
496
504 int ulfius_stop_framework(struct _u_instance * u_instance);
505
526 int ulfius_set_upload_file_callback_function(struct _u_instance * u_instance,
527 int (* file_upload_callback) (const struct _u_request * request,
528 const char * key,
529 const char * filename,
530 const char * content_type,
531 const char * transfer_encoding,
532 const char * data,
533 uint64_t off,
534 size_t size,
535 void * cls),
536 void * cls);
537
548 /***********************************
549 * Endpoints functions declarations
550 ***********************************/
551
559 int ulfius_add_endpoint(struct _u_instance * u_instance, const struct _u_endpoint * u_endpoint);
560
578 int ulfius_add_endpoint_by_val(struct _u_instance * u_instance,
579 const char * http_method,
580 const char * url_prefix,
581 const char * url_format,
582 unsigned int priority,
583 int (* callback_function)(const struct _u_request * request, // Input parameters (set by the framework)
584 struct _u_response * response, // Output parameters (set by the user)
585 void * user_data),
586 void * user_data);
587
595 int ulfius_add_endpoint_list(struct _u_instance * u_instance, const struct _u_endpoint ** u_endpoint_list);
596
606 int ulfius_remove_endpoint(struct _u_instance * u_instance, const struct _u_endpoint * u_endpoint);
607
619 int ulfius_set_default_endpoint(struct _u_instance * u_instance,
620 int (* callback_function)(const struct _u_request * request, struct _u_response * response, void * user_data),
621 void * user_data);
622
635 int ulfius_remove_endpoint_by_val(struct _u_instance * u_instance, const char * http_method, const char * url_prefix, const char * url_format);
636
641 const struct _u_endpoint * ulfius_empty_endpoint();
642
650 int ulfius_copy_endpoint(struct _u_endpoint * dest, const struct _u_endpoint * source);
651
659 struct _u_endpoint * ulfius_duplicate_endpoint_list(const struct _u_endpoint * endpoint_list);
660
666 void ulfius_clean_endpoint(struct _u_endpoint * endpoint);
667
673 void ulfius_clean_endpoint_list(struct _u_endpoint * endpoint_list);
674
682 int ulfius_equals_endpoints(const struct _u_endpoint * endpoint1, const struct _u_endpoint * endpoint2);
683
694 #ifndef U_DISABLE_CURL
695 /********************************************
696 * Requests/Responses functions declarations
697 ********************************************/
698
706 int ulfius_send_http_request(const struct _u_request * request, struct _u_response * response);
707
718 int ulfius_send_http_streaming_request(const struct _u_request * request, struct _u_response * response, size_t (* write_body_function)(void * contents, size_t size, size_t nmemb, void * user_data), void * write_body_data);
719
738 int ulfius_send_smtp_email(const char * host,
739 const int port,
740 const int use_tls,
741 const int verify_certificate,
742 const char * user,
743 const char * password,
744 const char * from,
745 const char * to,
746 const char * cc,
747 const char * bcc,
748 const char * subject,
749 const char * mail_body);
750
770 int ulfius_send_smtp_rich_email(const char * host,
771 const int port,
772 const int use_tls,
773 const int verify_certificate,
774 const char * user,
775 const char * password,
776 const char * from,
777 const char * to,
778 const char * cc,
779 const char * bcc,
780 const char * content_type,
781 const char * subject,
782 const char * mail_body);
783 #endif
784
809 int ulfius_add_cookie_to_response(struct _u_response * response, const char * key, const char * value, const char * expires, const unsigned int max_age,
810 const char * domain, const char * path, const int secure, const int http_only);
811
830 int ulfius_add_same_site_cookie_to_response(struct _u_response * response, const char * key, const char * value, const char * expires, const unsigned int max_age,
831 const char * domain, const char * path, const int secure, const int http_only, const int same_site);
832
851 int ulfius_add_header_to_response(struct _u_response * response, const char * key, const char * value);
852
860 int ulfius_set_string_body_request(struct _u_request * request, const char * string_body);
861
870 int ulfius_set_binary_body_request(struct _u_request * request, const char * binary_body, const size_t length);
871
878 int ulfius_set_empty_body_request(struct _u_request * request);
879
888 int ulfius_set_string_body_response(struct _u_response * response, const unsigned int status, const char * body);
889
899 int ulfius_set_binary_body_response(struct _u_response * response, const unsigned int status, const char * body, const size_t length);
900
908 int ulfius_set_empty_body_response(struct _u_response * response, const unsigned int status);
909
932 int ulfius_set_stream_response(struct _u_response * response,
933 const unsigned int status,
934 ssize_t (* stream_callback) (void * stream_user_data, uint64_t offset, char * out_buf, size_t max),
935 void (* stream_callback_free) (void * stream_user_data),
936 uint64_t stream_size,
937 size_t stream_block_size,
938 void * stream_user_data);
939
956 int ulfius_init_request(struct _u_request * request);
957
966 int ulfius_clean_request(struct _u_request * request);
967
974 int ulfius_clean_request_full(struct _u_request * request);
975
983 int ulfius_copy_request(struct _u_request * dest, const struct _u_request * source);
984
990 int ulfius_set_request_properties(struct _u_request * request, ...);
991
998 int ulfius_init_response(struct _u_response * response);
999
1008 int ulfius_clean_response(struct _u_response * response);
1009
1016 int ulfius_clean_response_full(struct _u_response * response);
1017
1025 int ulfius_copy_response(struct _u_response * dest, const struct _u_response * source);
1026
1033 int ulfius_clean_cookie(struct _u_cookie * cookie);
1034
1041 int ulfius_copy_cookie(struct _u_cookie * dest, const struct _u_cookie * source);
1042
1049 struct _u_request * ulfius_duplicate_request(const struct _u_request * request);
1050
1057 struct _u_response * ulfius_duplicate_response(const struct _u_response * response);
1058
1064 int ulfius_set_response_properties(struct _u_response * response, ...);
1065
1084 char * ulfius_url_decode(const char * str);
1085
1094 char * ulfius_url_encode(const char * str);
1095
1106 #ifndef U_DISABLE_JANSSON
1107
1117 json_t * ulfius_get_json_body_request(const struct _u_request * request, json_error_t * json_error);
1118
1126 int ulfius_set_json_body_request(struct _u_request * request, json_t * j_body);
1127
1138 json_t * ulfius_get_json_body_response(struct _u_response * response, json_error_t * json_error);
1139
1148 int ulfius_set_json_body_response(struct _u_response * response, const unsigned int status, const json_t * j_body);
1149 #endif
1150
1161 /************************************************************************
1162 * _u_map declarations *
1163 * _u_map is a simple map structure that handles sets of key/value maps *
1164 ************************************************************************/
1165
1172 int u_map_init(struct _u_map * u_map);
1173
1179 int u_map_clean(struct _u_map * u_map);
1180
1186 int u_map_clean_full(struct _u_map * u_map);
1187
1193 int u_map_clean_enum(char ** array);
1194
1200 const char ** u_map_enum_keys(const struct _u_map * u_map);
1201
1207 const char ** u_map_enum_values(const struct _u_map * u_map);
1208
1217 int u_map_has_key(const struct _u_map * u_map, const char * key);
1218
1227 int u_map_has_value(const struct _u_map * u_map, const char * value);
1228
1238 int u_map_has_value_binary(const struct _u_map * u_map, const char * value, size_t length);
1239
1248 int u_map_has_key_case(const struct _u_map * u_map, const char * key);
1249
1258 int u_map_has_value_case(const struct _u_map * u_map, const char * value);
1259
1268 int u_map_put(struct _u_map * u_map, const char * key, const char * value);
1269
1281 int u_map_put_binary(struct _u_map * u_map, const char * key, const char * value, uint64_t offset, size_t length);
1282
1290 ssize_t u_map_get_length(const struct _u_map * u_map, const char * key);
1291
1299 ssize_t u_map_get_case_length(const struct _u_map * u_map, const char * key);
1300
1308 const char * u_map_get(const struct _u_map * u_map, const char * key);
1309
1317 const char * u_map_get_case(const struct _u_map * u_map, const char * key);
1318
1326 int u_map_remove_from_key(struct _u_map * u_map, const char * key);
1327
1335 int u_map_remove_from_key_case(struct _u_map * u_map, const char * key);
1336
1344 int u_map_remove_from_value(struct _u_map * u_map, const char * value);
1345
1353 int u_map_remove_from_value_case(struct _u_map * u_map, const char * value);
1354
1362 int u_map_remove_from_value_binary(struct _u_map * u_map, const char * key, size_t length);
1363
1370 int u_map_remove_at(struct _u_map * u_map, const int index);
1371
1378 struct _u_map * u_map_copy(const struct _u_map * source);
1379
1387 int u_map_copy_into(struct _u_map * dest, const struct _u_map * source);
1388
1395 int u_map_count(const struct _u_map * source);
1396
1402 int u_map_empty(struct _u_map * u_map);
1403
1414 #ifndef U_DISABLE_WEBSOCKET
1415
1416 /**********************************
1417 * Websocket functions declarations
1418 **********************************/
1419
1420 #define U_WEBSOCKET_USER_AGENT "Ulfius Websocket Client Framework"
1421
1422 #define U_WEBSOCKET_MAGIC_STRING "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
1423 #define U_WEBSOCKET_UPGRADE_VALUE "websocket"
1424 #define U_WEBSOCKET_BAD_REQUEST_BODY "Error in websocket handshake, wrong parameters"
1425 #define U_WEBSOCKET_USEC_WAIT 50
1426 #define WEBSOCKET_MAX_CLOSE_TRY 10
1427
1428 #define U_WEBSOCKET_BIT_FIN 0x80
1429 #define U_WEBSOCKET_MASK 0x80
1430 #define U_WEBSOCKET_LEN_MASK 0x7F
1431 #define U_WEBSOCKET_OPCODE_CONTINUE 0x00
1432 #define U_WEBSOCKET_OPCODE_TEXT 0x01
1433 #define U_WEBSOCKET_OPCODE_BINARY 0x02
1434 #define U_WEBSOCKET_OPCODE_CLOSE 0x08
1435 #define U_WEBSOCKET_OPCODE_PING 0x09
1436 #define U_WEBSOCKET_OPCODE_PONG 0x0A
1437 #define U_WEBSOCKET_OPCODE_CLOSED 0xFD
1438 #define U_WEBSOCKET_OPCODE_ERROR 0xFE
1439 #define U_WEBSOCKET_OPCODE_NONE 0xFF
1440
1441 #define U_WEBSOCKET_NONE 0
1442 #define U_WEBSOCKET_SERVER 1
1443 #define U_WEBSOCKET_CLIENT 2
1444
1445 #define U_WEBSOCKET_STATUS_OPEN 0
1446 #define U_WEBSOCKET_STATUS_CLOSE 1
1447 #define U_WEBSOCKET_STATUS_ERROR 2
1448
1449 #define U_WEBSOCKET_RSV1 0x40
1450 #define U_WEBSOCKET_RSV2 0x20
1451 #define U_WEBSOCKET_RSV3 0x10
1452
1453 #define WEBSOCKET_RESPONSE_HTTP 0x0001
1454 #define WEBSOCKET_RESPONSE_UPGRADE 0x0002
1455 #define WEBSOCKET_RESPONSE_CONNECTION 0x0004
1456 #define WEBSOCKET_RESPONSE_ACCEPT 0x0008
1457 #define WEBSOCKET_RESPONSE_PROTCOL 0x0010
1458 #define WEBSOCKET_RESPONSE_EXTENSION 0x0020
1459
1460 #define WEBSOCKET_DEFLATE_CHUNK_SIZE 32768
1461 #define WEBSOCKET_DEFLATE_WINDOWS_BITS 15
1462
1466 struct _websocket_deflate_context {
1467 z_stream infstream;
1468 z_stream defstream;
1469 int deflate_mask;
1470 int inflate_mask;
1471 uint server_no_context_takeover;
1472 uint client_no_context_takeover;
1473 uint server_max_window_bits;
1474 uint client_max_window_bits;
1475 };
1476
1481 struct _websocket_extension {
1482 char * extension_server;
1483 char * extension_client;
1484 uint8_t rsv;
1485 int (* websocket_extension_message_out_perform)(const uint8_t opcode,
1486 const uint64_t data_len_in,
1487 const char * data_in,
1488 uint64_t * data_len_out,
1489 char ** data_out,
1490 const uint64_t fragment_len,
1491 void * user_data,
1492 void * context);
1493 void * websocket_extension_message_out_perform_user_data;
1494 int (* websocket_extension_message_in_perform)(const uint8_t opcode,
1495 const uint64_t data_len_in,
1496 const char * data_in,
1497 uint64_t * data_len_out,
1498 char ** data_out,
1499 const uint64_t fragment_len,
1500 void * user_data,
1501 void * context);
1502 void * websocket_extension_message_in_perform_user_data;
1503 int (* websocket_extension_server_match)(const char * extension_client,
1504 const char ** extension_client_list,
1505 char ** extension_server,
1506 void * user_data,
1507 void ** context);
1508 void * websocket_extension_server_match_user_data;
1509 int (* websocket_extension_client_match)(const char * extension_server,
1510 void * user_data,
1511 void ** context);
1512 void * websocket_extension_client_match_user_data;
1513 void (* websocket_extension_free_context)(void * user_data,
1514 void * context);
1515 void * websocket_extension_free_context_user_data;
1516 int enabled;
1517 void * context;
1518 };
1519
1526 struct _websocket_manager {
1527 struct _websocket_message_list * message_list_incoming; /* !< list of incoming messages */
1528 struct _websocket_message_list * message_list_outcoming; /* !< list of outcoming messages */
1529 int connected; /* !< flag to know if the websocket is connected or not */
1530 int ping_sent; /* !< flag to know if the websocket has sent a ping frame or not, before receiving a pong */
1531 int close_flag; /* !< flag to set before closing a websocket */
1532 MHD_socket mhd_sock; /* !< reference to libmicrohttpd's socket for websocket server */
1533 int tcp_sock; /* !< tcp socket for websocket client */
1534 int tls; /* !< set to 1 if the websocket is in a TLS socket */
1535 gnutls_session_t gnutls_session; /* !< GnuTLS session for websocket client */
1536 gnutls_certificate_credentials_t xcred; /* !< certificate credential used by GnuTLS */
1537 char * protocol; /* !< websocket protocol */
1538 char * extensions; /* !< websocket extension */
1539 pthread_mutex_t read_lock; /* !< mutex to read data in the socket */
1540 pthread_mutex_t write_lock; /* !< mutex to write data in the socket */
1541 pthread_mutex_t status_lock; /* !< mutex to broadcast new status */
1542 pthread_cond_t status_cond; /* !< condition to broadcast new status */
1543 struct pollfd fds_in;
1544 struct pollfd fds_out;
1545 int type;
1546 int rsv_expected;
1547 struct _pointer_list * websocket_extension_list;
1548 };
1549
1555 struct _websocket_message {
1556 time_t datestamp; /* !< date stamp of the message */
1557 uint8_t rsv; /* !< flags RSV1-3 of the message */
1558 uint8_t opcode; /* !< opcode for the message (string or binary) */
1559 uint8_t has_mask; /* !< does the message contain a mask? */
1560 uint8_t mask[4]; /* !< mask used if any */
1561 size_t data_len; /* !< length of the data */
1562 char * data; /* !< message data */
1563 size_t fragment_len; /* !< length of the fragment, 0 if not fragmented */
1564 uint8_t fin; /* !< flag fin (end of fragmented message) */
1565 };
1566
1570 struct _websocket_message_list {
1571 struct _websocket_message ** list; /* !< messages list */
1572 size_t len; /* !< message list length */
1573 };
1574
1579 struct _websocket {
1580 struct _u_instance * instance; /* !< reference to the ulfius instance if any */
1581 struct _u_request * request; /* !< refrence to the ulfius request of any */
1582 void (* websocket_manager_callback) (const struct _u_request * request, /* !< reference to a function called after the websocket handshake */
1583 struct _websocket_manager * websocket_manager,
1584 void * websocket_manager_user_data);
1585 void * websocket_manager_user_data; /* !< a user-defined reference that will be available in websocket_manager_callback */
1586 void (* websocket_incoming_message_callback) (const struct _u_request * request, /* !< reference to a function called each time a message arrives */
1587 struct _websocket_manager * websocket_manager,
1588 const struct _websocket_message * message,
1589 void * websocket_incoming_user_data);
1590 void * websocket_incoming_user_data; /* !< a user-defined reference that will be available in websocket_incoming_message_callback */
1591 void (* websocket_onclose_callback) (const struct _u_request * request, /* !< reference to a function called after the websocket connection ends */
1592 struct _websocket_manager * websocket_manager,
1593 void * websocket_onclose_user_data);
1594 void * websocket_onclose_user_data; /* !< a user-defined reference that will be available in websocket_onclose_callback */
1595 struct _websocket_manager * websocket_manager; /* !< refrence to the websocket manager if any */
1596 struct MHD_UpgradeResponseHandle * urh; /* !< reference used by libmicrohttpd to upgrade the connection */
1597 };
1598
1602 struct _websocket_client_handler {
1603 struct _websocket * websocket; /* !< the websocket to use */
1604 struct _u_response * response; /* !< the response attached to the websocket */
1605 };
1606
1607 /********************************/
1609 /********************************/
1610
1620 int ulfius_websocket_send_message(struct _websocket_manager * websocket_manager,
1621 const uint8_t opcode,
1622 const uint64_t data_len,
1623 const char * data);
1624
1636 int ulfius_websocket_send_fragmented_message(struct _websocket_manager * websocket_manager,
1637 const uint8_t opcode,
1638 const uint64_t data_len,
1639 const char * data,
1640 const uint64_t fragment_len);
1641
1648 #ifndef U_DISABLE_JANSSON
1649 int ulfius_websocket_send_json_message(struct _websocket_manager * websocket_manager,
1650 json_t * message);
1651 #endif
1652
1662 struct _websocket_message * ulfius_websocket_pop_first_message(struct _websocket_message_list * message_list);
1663
1668 void ulfius_clear_websocket_message(struct _websocket_message * message);
1669
1670 /********************************/
1672 /********************************/
1673
1688 int ulfius_set_websocket_response(struct _u_response * response,
1689 const char * websocket_protocol,
1690 const char * websocket_extensions,
1691 void (* websocket_manager_callback) (const struct _u_request * request,
1692 struct _websocket_manager * websocket_manager,
1693 void * websocket_manager_user_data),
1694 void * websocket_manager_user_data,
1695 void (* websocket_incoming_message_callback) (const struct _u_request * request,
1696 struct _websocket_manager * websocket_manager,
1697 const struct _websocket_message * message,
1698 void * websocket_incoming_user_data),
1699 void * websocket_incoming_user_data,
1700 void (* websocket_onclose_callback) (const struct _u_request * request,
1701 struct _websocket_manager * websocket_manager,
1702 void * websocket_onclose_user_data),
1703 void * websocket_onclose_user_data);
1704
1721 int ulfius_add_websocket_extension_message_perform(struct _u_response * response,
1722 const char * extension_server,
1723 uint8_t rsv,
1724 int (* websocket_extension_message_out_perform)(const uint8_t opcode,
1725 const uint64_t data_len_in,
1726 const char * data_in,
1727 uint64_t * data_len_out,
1728 char ** data_out,
1729 const uint64_t fragment_len,
1730 void * user_data,
1731 void * context),
1732 void * websocket_extension_message_out_perform_user_data,
1733 int (* websocket_extension_message_in_perform)(const uint8_t opcode,
1734 const uint64_t data_len_in,
1735 const char * data_in,
1736 uint64_t * data_len_out,
1737 char ** data_out,
1738 const uint64_t fragment_len,
1739 void * user_data,
1740 void * context),
1741 void * websocket_extension_message_in_perform_user_data,
1742 int (* websocket_extension_server_match)(const char * extension_client,
1743 const char ** extension_client_list,
1744 char ** extension_server,
1745 void * user_data,
1746 void ** context),
1747 void * websocket_extension_server_match_user_data,
1748 void (* websocket_extension_free_context)(void * user_data,
1749 void * context),
1750 void * websocket_extension_free_context_user_data);
1751
1766 int websocket_extension_message_out_deflate(const uint8_t opcode,
1767 const uint64_t data_len_in,
1768 const char * data_in,
1769 uint64_t * data_len_out,
1770 char ** data_out,
1771 const uint64_t fragment_len,
1772 void * user_data,
1773 void * context);
1774
1788 int websocket_extension_message_in_inflate(const uint8_t opcode,
1789 const uint64_t data_len_in,
1790 const char * data_in,
1791 uint64_t * data_len_out,
1792 char ** data_out,
1793 const uint64_t fragment_len,
1794 void * user_data,
1795 void * context);
1796
1803 void websocket_extension_deflate_free_context(void * user_data, void * context);
1804
1814 int websocket_extension_server_match_deflate(const char * extension_client, const char ** extension_client_list, char ** extension_server, void * user_data, void ** context);
1815
1824 int ulfius_add_websocket_deflate_extension(struct _u_response * response);
1825
1835 int ulfius_websocket_send_close_signal(struct _websocket_manager * websocket_manager);
1836
1844 int ulfius_websocket_status(struct _websocket_manager * websocket_manager);
1845
1854 int ulfius_websocket_wait_close(struct _websocket_manager * websocket_manager, unsigned int timeout);
1855
1856 /********************************/
1858 /********************************/
1859
1873 int ulfius_open_websocket_client_connection(struct _u_request * request,
1874 void (* websocket_manager_callback) (const struct _u_request * request,
1875 struct _websocket_manager * websocket_manager,
1876 void * websocket_manager_user_data),
1877 void * websocket_manager_user_data,
1878 void (* websocket_incoming_message_callback) (const struct _u_request * request,
1879 struct _websocket_manager * websocket_manager,
1880 const struct _websocket_message * message,
1881 void * websocket_incoming_user_data),
1882 void * websocket_incoming_user_data,
1883 void (* websocket_onclose_callback) (const struct _u_request * request,
1884 struct _websocket_manager * websocket_manager,
1885 void * websocket_onclose_user_data),
1886 void * websocket_onclose_user_data,
1887 struct _websocket_client_handler * websocket_client_handler,
1888 struct _u_response * response);
1889
1905 int ulfius_add_websocket_client_extension_message_perform(struct _websocket_client_handler * websocket_client_handler,
1906 const char * extension,
1907 uint8_t rsv,
1908 int (* websocket_extension_message_out_perform)(const uint8_t opcode,
1909 const uint64_t data_len_in,
1910 const char * data_in,
1911 uint64_t * data_len_out,
1912 char ** data_out,
1913 const uint64_t fragment_len,
1914 void * user_data,
1915 void * context),
1916 void * websocket_extension_message_out_perform_user_data,
1917 int (* websocket_extension_message_in_perform)(const uint8_t opcode,
1918 const uint64_t data_len_in,
1919 const char * data_in,
1920 uint64_t * data_len_out,
1921 char ** data_out,
1922 const uint64_t fragment_len,
1923 void * user_data,
1924 void * context),
1925 void * websocket_extension_message_in_perform_user_data,
1926 int (* websocket_extension_client_match)(const char * extension_server,
1927 void * user_data,
1928 void ** context),
1929 void * websocket_extension_client_match_user_data,
1930 void (* websocket_extension_free_context)(void * user_data,
1931 void * context),
1932 void * websocket_extension_free_context_user_data);
1933
1941 int websocket_extension_client_match_deflate(const char * extension_server, void * user_data, void ** context);
1942
1950 int ulfius_add_websocket_client_deflate_extension(struct _websocket_client_handler * websocket_client_handler);
1951
1957 int ulfius_websocket_client_connection_send_close_signal(struct _websocket_client_handler * websocket_client_handler);
1958
1964 int ulfius_websocket_client_connection_close(struct _websocket_client_handler * websocket_client_handler);
1965
1972 int ulfius_websocket_client_connection_status(struct _websocket_client_handler * websocket_client_handler);
1973
1982 int ulfius_websocket_client_connection_wait_close(struct _websocket_client_handler * websocket_client_handler, unsigned int timeout);
1983
1993 int ulfius_set_websocket_request(struct _u_request * request,
1994 const char * url,
1995 const char * websocket_protocol,
1996 const char * websocket_extensions);
1997
1998 #endif
1999
2001 #define ULFIUS_URL_SEPARATOR "/"
2002 #define ULFIUS_HTTP_ENCODING_JSON "application/json"
2003 #define ULFIUS_HTTP_HEADER_CONTENT "Content-Type"
2004 #define ULFIUS_HTTP_NOT_FOUND_BODY "Resource not found"
2005 #define ULFIUS_HTTP_ERROR_BODY "Server Error"
2006
2007 #define ULFIUS_COOKIE_ATTRIBUTE_EXPIRES "Expires"
2008 #define ULFIUS_COOKIE_ATTRIBUTE_MAX_AGE "Max-Age"
2009 #define ULFIUS_COOKIE_ATTRIBUTE_DOMAIN "Domain"
2010 #define ULFIUS_COOKIE_ATTRIBUTE_PATH "Path"
2011 #define ULFIUS_COOKIE_ATTRIBUTE_SECURE "Secure"
2012 #define ULFIUS_COOKIE_ATTRIBUTE_HTTPONLY "HttpOnly"
2013
2014 #define ULFIUS_POSTBUFFERSIZE 65536
2015
2016 #define U_STATUS_STOP 0
2017 #define U_STATUS_RUNNING 1
2018 #define U_STATUS_ERROR 2
2019
2020 #ifndef U_DISABLE_WEBSOCKET
2021
2025 struct _websocket_handle {
2026 char * websocket_protocol; /* !< protocol for the websocket */
2027 char * websocket_extensions; /* !< extensions for the websocket */
2028 void (* websocket_manager_callback) (const struct _u_request * request, /* !< callback function for working with the websocket */
2029 struct _websocket_manager * websocket_manager,
2030 void * websocket_manager_user_data);
2031 void * websocket_manager_user_data; /* !< user-defined data that will be handled to websocket_manager_callback */
2032 void (* websocket_incoming_message_callback) (const struct _u_request * request, /* !< callback function that will be called every time a message arrives from the client in the websocket */
2033 struct _websocket_manager * websocket_manager,
2034 const struct _websocket_message * message,
2035 void * websocket_incoming_user_data);
2036 void * websocket_incoming_user_data; /* !< user-defined data that will be handled to websocket_incoming_message_callback */
2037 void (* websocket_onclose_callback) (const struct _u_request * request, /* !< callback function that will be called if the websocket is open while the program calls ulfius_stop_framework */
2038 struct _websocket_manager * websocket_manager,
2039 void * websocket_onclose_user_data);
2040 void * websocket_onclose_user_data; /* !< user-defined data that will be handled to websocket_onclose_callback */
2041 int rsv_expected;
2042 struct _pointer_list * websocket_extension_list;
2043 };
2044
2048 struct _websocket_handler {
2049 pthread_mutex_t websocket_active_lock; /* !< mutex to change nb_websocket_active value */
2050 size_t nb_websocket_active; /* !< number of active websocket */
2051 struct _websocket ** websocket_active; /* !< array of active websocket */
2052 pthread_mutex_t websocket_close_lock; /* !< mutex to broadcast close signal */
2053 pthread_cond_t websocket_close_cond; /* !< condition to broadcast close signal */
2054 int pthread_init;
2055 };
2056
2057 #endif // U_DISABLE_WEBSOCKET
2058
2069 #ifndef U_DISABLE_GNUTLS
2070 /*
2071 * ulfius_export_client_certificate_pem
2072 * Exports the client certificate using PEM format
2073 * @param request struct _u_request used
2074 * @return the certificate in PEM format
2075 * returned value must be u_free'd after use
2076 */
2077 char * ulfius_export_client_certificate_pem(const struct _u_request * request);
2078
2079 /*
2080 * ulfius_import_client_certificate_pem
2081 * Imports the client certificate using PEM format
2082 * @param request struct _u_request used
2083 * @param str_cert client certificate in PEM format
2084 * @return U_OK on success
2085 */
2086 int ulfius_import_client_certificate_pem(struct _u_request * request, const char * str_cert);
2087
2088 #endif // U_DISABLE_GNUTLS
2089
2094 #ifdef __cplusplus
2095 }
2096 #endif
2097
2098 #endif // __ULFIUS_H__
U_OPT_CA_PATH
@ U_OPT_CA_PATH
specify a path to CA certificates instead of system path, used by ulfius_send_http_request,...
Definition: ulfius.h:153
_u_instance::endpoint_list
struct _u_endpoint * endpoint_list
Definition: ulfius.h:320
connection_info_struct
Definition: ulfius.h:350
ulfius_stop_framework
int ulfius_stop_framework(struct _u_instance *u_instance)
Definition: ulfius.c:1257
u_map_init
int u_map_init(struct _u_map *u_map)
Definition: u_map.c:33
u_map_empty
int u_map_empty(struct _u_map *u_map)
Definition: u_map.c:504
_u_cookie::http_only
int http_only
Definition: ulfius.h:216
_u_instance::mhd_response_copy_data
int mhd_response_copy_data
Definition: ulfius.h:336
u_map_has_key
int u_map_has_key(const struct _u_map *u_map, const char *key)
Definition: u_map.c:113
U_OPT_AUTH_REALM
@ U_OPT_AUTH_REALM
realm to send to the client response on authenticationb failed, expected option value type: const cha...
Definition: ulfius.h:176
ulfius_add_same_site_cookie_to_response
int ulfius_add_same_site_cookie_to_response(struct _u_response *response, const char *key, const char *value, const char *expires, const unsigned int max_age, const char *domain, const char *path, const int secure, const int http_only, const int same_site)
Definition: u_response.c:205
_u_request::proxy
char * proxy
Definition: ulfius.h:231
u_map_get_case
const char * u_map_get_case(const struct _u_map *u_map, const char *key)
Definition: u_map.c:410
ulfius_equals_endpoints
int ulfius_equals_endpoints(const struct _u_endpoint *endpoint1, const struct _u_endpoint *endpoint2)
Definition: ulfius.c:1483
_u_response::stream_size
uint64_t stream_size
Definition: ulfius.h:277
ulfius_add_endpoint_by_val
int ulfius_add_endpoint_by_val(struct _u_instance *u_instance, const char *http_method, const char *url_prefix, const char *url_format, unsigned int priority, int(*callback_function)(const struct _u_request *request, struct _u_response *response, void *user_data), void *user_data)
Definition: ulfius.c:1501
_u_cookie
Definition: ulfius.h:208
U_OPT_AUTH_BASIC_USER
@ U_OPT_AUTH_BASIC_USER
basic authentication username, expected option value type: const char *
Definition: ulfius.h:155
_u_cookie::key
char * key
Definition: ulfius.h:209
_u_instance::file_upload_cls
void * file_upload_cls
Definition: ulfius.h:335
_u_request::url_path
char * url_path
Definition: ulfius.h:230
_u_map
Definition: ulfius.h:197
u_map_get_case_length
ssize_t u_map_get_case_length(const struct _u_map *u_map, const char *key)
Definition: u_map.c:438
U_OPT_URL_PARAMETER
@ U_OPT_URL_PARAMETER
Add to the map containing the url variables, both from the route and the ?key=value variables,...
Definition: ulfius.h:157
U_OPT_CLIENT_CERT_FILE
@ U_OPT_CLIENT_CERT_FILE
path to client certificate file for sending http requests with certificate authentication,...
Definition: ulfius.h:171
_u_instance::mhd_daemon
struct MHD_Daemon * mhd_daemon
Definition: ulfius.h:309
ulfius_start_secure_framework
int ulfius_start_secure_framework(struct _u_instance *u_instance, const char *key_pem, const char *cert_pem)
Definition: ulfius.c:1121
u_map_enum_values
const char ** u_map_enum_values(const struct _u_map *u_map)
Definition: u_map.c:109
ulfius_clean_instance
void ulfius_clean_instance(struct _u_instance *u_instance)
Definition: ulfius.c:1580
_u_map::values
char ** values
Definition: ulfius.h:200
U_OPT_CHECK_SERVER_CERTIFICATE
@ U_OPT_CHECK_SERVER_CERTIFICATE
check server certificate and hostname, default true, used by ulfius_send_http_request,...
Definition: ulfius.h:148
_u_response::auth_realm
char * auth_realm
Definition: ulfius.h:272
u_map_copy_into
int u_map_copy_into(struct _u_map *dest, const struct _u_map *source)
Definition: u_map.c:477
connection_info_struct::has_post_processor
int has_post_processor
Definition: ulfius.h:353
ulfius_url_decode
char * ulfius_url_decode(const char *str)
Definition: ulfius.c:1830
_u_instance::port
unsigned int port
Definition: ulfius.h:311
ulfius_uri_logger
void * ulfius_uri_logger(void *cls, const char *uri)
Definition: ulfius.c:205
ulfius_init_instance
int ulfius_init_instance(struct _u_instance *u_instance, unsigned int port, struct sockaddr_in *bind_address, const char *default_auth_realm)
Definition: ulfius.c:1685
ulfius_set_string_body_response
int ulfius_set_string_body_response(struct _u_response *response, const unsigned int status, const char *body)
Definition: u_response.c:509
U_OPT_CHECK_PROXY_CERTIFICATE
@ U_OPT_CHECK_PROXY_CERTIFICATE
check proxy certificate and hostname, default true, used by ulfius_send_http_request,...
Definition: ulfius.h:150
_u_response::timeout
unsigned int timeout
Definition: ulfius.h:282
U_OPT_HEADER_PARAMETER_REMOVE
@ U_OPT_HEADER_PARAMETER_REMOVE
Remove from map containing the header variables, expected option value type: const char *.
Definition: ulfius.h:162
_u_response::stream_callback
ssize_t(* stream_callback)(void *stream_user_data, uint64_t offset, char *out_buf, size_t max)
Definition: ulfius.h:275
_u_endpoint
Contains all informations needed for an endpoint.
Definition: ulfius.h:291
_u_instance::default_auth_realm
char * default_auth_realm
Definition: ulfius.h:319
_u_cookie::same_site
int same_site
Definition: ulfius.h:217
u_map_get
const char * u_map_get(const struct _u_map *u_map, const char *key)
Definition: u_map.c:368
websocket_extension_deflate_free_context
void websocket_extension_deflate_free_context(void *user_data, void *context)
Definition: u_websocket.c:2163
ulfius_add_endpoint_list
int ulfius_add_endpoint_list(struct _u_instance *u_instance, const struct _u_endpoint **u_endpoint_list)
Definition: ulfius.c:1401
_u_instance::websocket_handler
void * websocket_handler
Definition: ulfius.h:325
ulfius_global_init
int ulfius_global_init()
Definition: ulfius.c:1859
_u_instance::bind_address
struct sockaddr_in * bind_address
Definition: ulfius.h:315
ulfius_set_empty_body_request
int ulfius_set_empty_body_request(struct _u_request *request)
Definition: u_request.c:766
u_map_has_key_case
int u_map_has_key_case(const struct _u_map *u_map, const char *key)
Definition: u_map.c:386
_u_instance::timeout
unsigned int timeout
Definition: ulfius.h:317
ulfius_import_client_certificate_pem
int ulfius_import_client_certificate_pem(struct _u_request *request, const char *str_cert)
Definition: u_request.c:892
websocket_extension_message_in_inflate
int websocket_extension_message_in_inflate(const uint8_t opcode, const uint64_t data_len_in, const char *data_in, uint64_t *data_len_out, char **data_out, const uint64_t fragment_len, void *user_data, void *context)
Definition: u_websocket.c:1944
connection_info_struct::callback_first_iteration
int callback_first_iteration
Definition: ulfius.h:354
U_OPT_FOLLOW_REDIRECT
@ U_OPT_FOLLOW_REDIRECT
follow url redirections, used by ulfius_send_http_request, expected option value type: int
Definition: ulfius.h:152
u_map_clean
int u_map_clean(struct _u_map *u_map)
Definition: u_map.c:66
ulfius_set_binary_body_response
int ulfius_set_binary_body_response(struct _u_response *response, const unsigned int status, const char *body, const size_t length)
Definition: u_response.c:527
u_free
void u_free(void *data)
Definition: ulfius.c:1699
ulfius_start_framework
int ulfius_start_framework(struct _u_instance *u_instance)
Definition: ulfius.c:1104
_u_map::nb_values
int nb_values
Definition: ulfius.h:198
_u_request::client_key_file
char * client_key_file
Definition: ulfius.h:255
_u_request::check_server_certificate_flag
int check_server_certificate_flag
Definition: ulfius.h:236
ulfius_websocket_client_connection_close
int ulfius_websocket_client_connection_close(struct _websocket_client_handler *websocket_client_handler)
Definition: u_websocket.c:2666
_u_cookie::expires
char * expires
Definition: ulfius.h:211
_u_cookie::path
char * path
Definition: ulfius.h:214
_u_request::callback_position
unsigned int callback_position
Definition: ulfius.h:251
_u_instance::default_endpoint
struct _u_endpoint * default_endpoint
Definition: ulfius.h:321
u_map_put
int u_map_put(struct _u_map *u_map, const char *key, const char *value)
Definition: u_map.c:141
websocket_extension_client_match_deflate
int websocket_extension_client_match_deflate(const char *extension_server, void *user_data, void **context)
Definition: u_websocket.c:2533
U_OPT_SHARED_DATA
@ U_OPT_SHARED_DATA
any data shared between callback functions, must be allocated and freed by the callback functions,...
Definition: ulfius.h:177
U_OPT_STATUS
@ U_OPT_STATUS
HTTP response status code (200, 404, 500, etc), expected option value type: long.
Definition: ulfius.h:175
U_OPT_CLIENT_KEY_FILE
@ U_OPT_CLIENT_KEY_FILE
path to client key file for sending http requests with certificate authentication,...
Definition: ulfius.h:172
_u_request::timeout
unsigned long timeout
Definition: ulfius.h:241
_u_cookie::max_age
unsigned int max_age
Definition: ulfius.h:212
U_OPT_BINARY_BODY
@ U_OPT_BINARY_BODY
Set a raw body to the request or the reponse, expected option value type: const char *,...
Definition: ulfius.h:165
_u_instance::file_upload_callback
int(* file_upload_callback)(const struct _u_request *request, const char *key, const char *filename, const char *content_type, const char *transfer_encoding, const char *data, uint64_t off, size_t size, void *cls)
Definition: ulfius.h:326
_u_instance::use_client_cert_auth
int use_client_cert_auth
Definition: ulfius.h:339
ulfius_get_json_body_request
json_t * ulfius_get_json_body_request(const struct _u_request *request, json_error_t *json_error)
Definition: u_request.c:839
_u_response::binary_body_length
size_t binary_body_length
Definition: ulfius.h:274
ulfius_set_string_body_request
int ulfius_set_string_body_request(struct _u_request *request, const char *string_body)
Definition: u_request.c:719
ulfius_send_smtp_rich_email
int ulfius_send_smtp_rich_email(const char *host, const int port, const int use_tls, const int verify_certificate, const char *user, const char *password, const char *from, const char *to, const char *cc, const char *bcc, const char *content_type, const char *subject, const char *mail_body)
Definition: u_send_request.c:703
ulfius_url_encode
char * ulfius_url_encode(const char *str)
Definition: ulfius.c:1796
_u_cookie::secure
int secure
Definition: ulfius.h:215
_u_request::follow_redirect
int follow_redirect
Definition: ulfius.h:239
u_map_enum_keys
const char ** u_map_enum_keys(const struct _u_map *u_map)
Definition: u_map.c:105
connection_info_struct::u_instance
struct _u_instance * u_instance
Definition: ulfius.h:351
U_OPT_COOKIE_PARAMETER_REMOVE
@ U_OPT_COOKIE_PARAMETER_REMOVE
Remove from map containing the cookie variables, expected option value type: const char *.
Definition: ulfius.h:163
u_map_has_value_case
int u_map_has_value_case(const struct _u_map *u_map, const char *value)
Definition: u_map.c:398
ulfius_send_smtp_email
int ulfius_send_smtp_email(const char *host, const int port, const int use_tls, const int verify_certificate, const char *user, const char *password, const char *from, const char *to, const char *cc, const char *bcc, const char *subject, const char *mail_body)
Definition: u_send_request.c:906
U_OPT_AUTH_BASIC_PASSWORD
@ U_OPT_AUTH_BASIC_PASSWORD
basic authentication password, expected option value type: const char *
Definition: ulfius.h:156
_u_request::auth_basic_user
char * auth_basic_user
Definition: ulfius.h:243
u_map_remove_from_key
int u_map_remove_from_key(struct _u_map *u_map, const char *key)
Definition: u_map.c:237
mhd_request_completed
void mhd_request_completed(void *cls, struct MHD_Connection *connection, void **con_cls, enum MHD_RequestTerminationCode toe)
Definition: ulfius.c:282
ulfius_add_websocket_extension_message_perform
int ulfius_add_websocket_extension_message_perform(struct _u_response *response, const char *extension_server, uint8_t rsv, int(*websocket_extension_message_out_perform)(const uint8_t opcode, const uint64_t data_len_in, const char *data_in, uint64_t *data_len_out, char **data_out, const uint64_t fragment_len, void *user_data, void *context), void *websocket_extension_message_out_perform_user_data, int(*websocket_extension_message_in_perform)(const uint8_t opcode, const uint64_t data_len_in, const char *data_in, uint64_t *data_len_out, char **data_out, const uint64_t fragment_len, void *user_data, void *context), void *websocket_extension_message_in_perform_user_data, int(*websocket_extension_server_match)(const char *extension_client, const char **extension_client_list, char **extension_server, void *user_data, void **context), void *websocket_extension_server_match_user_data, void(*websocket_extension_free_context)(void *user_data, void *context), void *websocket_extension_free_context_user_data)
Definition: u_websocket.c:1785
ulfius_websocket_send_fragmented_message
int ulfius_websocket_send_fragmented_message(struct _websocket_manager *websocket_manager, const uint8_t opcode, const uint64_t data_len, const char *data, const uint64_t fragment_len)
Definition: u_websocket.c:1433
ulfius_websocket_send_message
int ulfius_websocket_send_message(struct _websocket_manager *websocket_manager, const uint8_t opcode, const uint64_t data_len, const char *data)
Definition: u_websocket.c:1523
_u_request::map_url
struct _u_map * map_url
Definition: ulfius.h:245
ulfius_websocket_status
int ulfius_websocket_status(struct _websocket_manager *websocket_manager)
Definition: u_websocket.c:2197
_u_map::keys
char ** keys
Definition: ulfius.h:199
ulfius_clean_response
int ulfius_clean_response(struct _u_response *response)
Definition: u_response.c:326
_u_response::websocket_handle
void * websocket_handle
Definition: ulfius.h:280
ulfius_set_json_body_response
int ulfius_set_json_body_response(struct _u_response *response, const unsigned int status, const json_t *j_body)
Definition: u_response.c:662
ulfius_start_secure_ca_trust_framework
int ulfius_start_secure_ca_trust_framework(struct _u_instance *u_instance, const char *key_pem, const char *cert_pem, const char *root_ca_pem)
Definition: ulfius.c:1170
ulfius_set_empty_body_response
int ulfius_set_empty_body_response(struct _u_response *response, const unsigned int status)
Definition: u_response.c:548
u_map_put_binary
int u_map_put_binary(struct _u_map *u_map, const char *key, const char *value, uint64_t offset, size_t length)
Definition: u_map.c:149
ulfius_copy_response
int ulfius_copy_response(struct _u_response *dest, const struct _u_response *source)
Definition: u_response.c:419
_u_endpoint::priority
unsigned int priority
Definition: ulfius.h:295
U_OPT_STRING_BODY
@ U_OPT_STRING_BODY
Set a char * body to the request or the reponse, expected option value type: const char *.
Definition: ulfius.h:166
_u_endpoint::url_prefix
char * url_prefix
Definition: ulfius.h:293
U_OPT_CHECK_PROXY_CERTIFICATE_FLAG
@ U_OPT_CHECK_PROXY_CERTIFICATE_FLAG
check certificate peer and or proxy hostname if check_proxy_certificate is enabled,...
Definition: ulfius.h:151
u_map_remove_from_key_case
int u_map_remove_from_key_case(struct _u_map *u_map, const char *key)
Definition: u_map.c:260
ulfius_add_websocket_client_deflate_extension
int ulfius_add_websocket_client_deflate_extension(struct _websocket_client_handler *websocket_client_handler)
Definition: u_websocket.c:2644
_u_response::stream_block_size
size_t stream_block_size
Definition: ulfius.h:278
ulfius_websocket_send_close_signal
int ulfius_websocket_send_close_signal(struct _websocket_manager *websocket_manager)
Definition: u_websocket.c:2182
ulfius_set_upload_file_callback_function
int ulfius_set_upload_file_callback_function(struct _u_instance *u_instance, int(*file_upload_callback)(const struct _u_request *request, const char *key, const char *filename, const char *content_type, const char *transfer_encoding, const char *data, uint64_t off, size_t size, void *cls), void *cls)
Definition: ulfius.c:1560
ulfius_clean_endpoint
void ulfius_clean_endpoint(struct _u_endpoint *endpoint)
Definition: ulfius.c:1335
U_OPT_COOKIE_PARAMETER
@ U_OPT_COOKIE_PARAMETER
Add to the map containing the cookie variables, expected option value type: const char *,...
Definition: ulfius.h:159
ulfius_set_response_properties
int ulfius_set_response_properties(struct _u_response *response,...)
Definition: u_response.c:587
ulfius_add_websocket_deflate_extension
int ulfius_add_websocket_deflate_extension(struct _u_response *response)
Definition: u_websocket.c:2170
ulfius_init_request
int ulfius_init_request(struct _u_request *request)
Definition: u_request.c:302
_u_response
definition of the parameters available in a struct _u_response
Definition: ulfius.h:266
_u_request::map_cookie
struct _u_map * map_cookie
Definition: ulfius.h:247
_u_request::check_proxy_certificate_flag
int check_proxy_certificate_flag
Definition: ulfius.h:238
_u_request::check_server_certificate
int check_server_certificate
Definition: ulfius.h:235
_u_instance::check_utf8
int check_utf8
Definition: ulfius.h:337
_u_instance::default_headers
struct _u_map * default_headers
Definition: ulfius.h:322
_u_request::client_cert
gnutls_x509_crt_t client_cert
Definition: ulfius.h:253
_u_instance::nb_endpoints
int nb_endpoints
Definition: ulfius.h:318
_u_response::protocol
char * protocol
Definition: ulfius.h:268
_u_request::check_proxy_certificate
int check_proxy_certificate
Definition: ulfius.h:237
ulfius_clean_endpoint_list
void ulfius_clean_endpoint_list(struct _u_endpoint *endpoint_list)
Definition: ulfius.c:1350
_u_request::binary_body_length
size_t binary_body_length
Definition: ulfius.h:250
ulfius_duplicate_response
struct _u_response * ulfius_duplicate_response(const struct _u_response *response)
Definition: u_response.c:486
_u_response::stream_user_data
void * stream_user_data
Definition: ulfius.h:279
ulfius_websocket_pop_first_message
struct _websocket_message * ulfius_websocket_pop_first_message(struct _websocket_message_list *message_list)
Definition: u_websocket.c:1549
u_map_remove_from_value_binary
int u_map_remove_from_value_binary(struct _u_map *u_map, const char *key, size_t length)
Definition: u_map.c:287
_u_request::map_header
struct _u_map * map_header
Definition: ulfius.h:246
u_map_clean_full
int u_map_clean_full(struct _u_map *u_map)
Definition: u_map.c:82
websocket_extension_server_match_deflate
int websocket_extension_server_match_deflate(const char *extension_client, const char **extension_client_list, char **extension_server, void *user_data, void **context)
Definition: u_websocket.c:2022
_u_endpoint::http_method
char * http_method
Definition: ulfius.h:292
ulfius_clean_cookie
int ulfius_clean_cookie(struct _u_cookie *cookie)
Definition: u_response.c:283
_u_map::lengths
size_t * lengths
Definition: ulfius.h:201
U_OPT_CLIENT_KEY_PASSWORD
@ U_OPT_CLIENT_KEY_PASSWORD
password to unlock client key file, available only if GnuTLS support is enabled, expected option valu...
Definition: ulfius.h:173
U_OPT_URL_PARAMETER_REMOVE
@ U_OPT_URL_PARAMETER_REMOVE
Remove from the map containing the url variables, both from the route and the ?key=value variables,...
Definition: ulfius.h:161
ulfius_websocket_client_connection_wait_close
int ulfius_websocket_client_connection_wait_close(struct _websocket_client_handler *websocket_client_handler, unsigned int timeout)
Definition: u_websocket.c:2707
ulfius_global_close
void ulfius_global_close()
Definition: ulfius.c:1883
u_map_count
int u_map_count(const struct _u_map *source)
Definition: u_map.c:495
U_OPT_HTTP_VERB
@ U_OPT_HTTP_VERB
http method (GET, POST, PUT, DELETE, etc.), expected option value type: const char *
Definition: ulfius.h:142
ulfius_duplicate_request
struct _u_request * ulfius_duplicate_request(const struct _u_request *request)
Definition: u_request.c:782
ulfius_set_websocket_response
int ulfius_set_websocket_response(struct _u_response *response, const char *websocket_protocol, const char *websocket_extensions, void(*websocket_manager_callback)(const struct _u_request *request, struct _websocket_manager *websocket_manager, void *websocket_manager_user_data), void *websocket_manager_user_data, void(*websocket_incoming_message_callback)(const struct _u_request *request, struct _websocket_manager *websocket_manager, const struct _websocket_message *message, void *websocket_incoming_user_data), void *websocket_incoming_user_data, void(*websocket_onclose_callback)(const struct _u_request *request, struct _websocket_manager *websocket_manager, void *websocket_onclose_user_data), void *websocket_onclose_user_data)
Definition: u_websocket.c:1738
ulfius_start_framework_with_mhd_options
int ulfius_start_framework_with_mhd_options(struct _u_instance *u_instance, unsigned int mhd_flags, struct MHD_OptionItem *options)
Definition: ulfius.c:1230
U_OPT_NONE
@ U_OPT_NONE
Empty option to complete a ulfius_set_request_properties or ulfius_set_request_properties.
Definition: ulfius.h:141
U_OPT_POST_BODY_PARAMETER
@ U_OPT_POST_BODY_PARAMETER
Add to the map containing the post body variables (if available), expected option value type: const c...
Definition: ulfius.h:160
_u_instance::status
int status
Definition: ulfius.h:310
ulfius_add_header_to_response
int ulfius_add_header_to_response(struct _u_response *response, const char *key, const char *value)
Definition: u_response.c:697
ulfius_set_default_endpoint
int ulfius_set_default_endpoint(struct _u_instance *u_instance, int(*callback_function)(const struct _u_request *request, struct _u_response *response, void *user_data), void *user_data)
Definition: ulfius.c:1537
ulfius_add_endpoint
int ulfius_add_endpoint(struct _u_instance *u_instance, const struct _u_endpoint *u_endpoint)
Definition: ulfius.c:1361
ulfius_set_request_properties
int ulfius_set_request_properties(struct _u_request *request,...)
Definition: u_request.c:529
ulfius_remove_endpoint_by_val
int ulfius_remove_endpoint_by_val(struct _u_instance *u_instance, const char *http_method, const char *url_prefix, const char *url_format)
Definition: ulfius.c:1524
_u_request::map_post_body
struct _u_map * map_post_body
Definition: ulfius.h:248
ulfius_clear_websocket_message
void ulfius_clear_websocket_message(struct _websocket_message *message)
Definition: u_websocket.c:1571
ulfius_remove_endpoint
int ulfius_remove_endpoint(struct _u_instance *u_instance, const struct _u_endpoint *u_endpoint)
Definition: ulfius.c:1418
ulfius_set_websocket_request
int ulfius_set_websocket_request(struct _u_request *request, const char *url, const char *websocket_protocol, const char *websocket_extensions)
Definition: u_websocket.c:2285
_u_response::map_header
struct _u_map * map_header
Definition: ulfius.h:269
ulfius_set_binary_body_request
int ulfius_set_binary_body_request(struct _u_request *request, const char *binary_body, const size_t length)
Definition: u_request.c:741
u_map_remove_from_value_case
int u_map_remove_from_value_case(struct _u_map *u_map, const char *value)
Definition: u_map.c:310
u_map_remove_from_value
int u_map_remove_from_value(struct _u_map *u_map, const char *value)
Definition: u_map.c:283
_u_request::http_protocol
char * http_protocol
Definition: ulfius.h:227
ulfius_set_stream_response
int ulfius_set_stream_response(struct _u_response *response, const unsigned int status, ssize_t(*stream_callback)(void *stream_user_data, uint64_t offset, char *out_buf, size_t max), void(*stream_callback_free)(void *stream_user_data), uint64_t stream_size, size_t stream_block_size, void *stream_user_data)
Definition: u_response.c:562
_u_cookie::value
char * value
Definition: ulfius.h:210
_u_request
definition of the parameters available in a struct _u_request
Definition: ulfius.h:226
U_OPT_HTTP_PROXY
@ U_OPT_HTTP_PROXY
proxy address to use for outgoing connections, used by ulfius_send_http_request, expected option valu...
Definition: ulfius.h:144
_u_response::nb_cookies
unsigned int nb_cookies
Definition: ulfius.h:270
u_option
u_option
Definition: ulfius.h:140
U_OPT_POST_BODY_PARAMETER_REMOVE
@ U_OPT_POST_BODY_PARAMETER_REMOVE
Remove from map containing the post body variables (if available), expected option value type: const ...
Definition: ulfius.h:164
connection_info_struct::request
struct _u_request * request
Definition: ulfius.h:355
ulfius_duplicate_endpoint_list
struct _u_endpoint * ulfius_duplicate_endpoint_list(const struct _u_endpoint *endpoint_list)
Definition: ulfius.c:1314
ulfius_add_cookie_to_response
int ulfius_add_cookie_to_response(struct _u_response *response, const char *key, const char *value, const char *expires, const unsigned int max_age, const char *domain, const char *path, const int secure, const int http_only)
Definition: u_response.c:200
_u_endpoint::user_data
void * user_data
Definition: ulfius.h:299
ulfius_copy_request
int ulfius_copy_request(struct _u_request *dest, const struct _u_request *source)
Definition: u_request.c:415
websocket_extension_message_out_deflate
int websocket_extension_message_out_deflate(const uint8_t opcode, const uint64_t data_len_in, const char *data_in, uint64_t *data_len_out, char **data_out, const uint64_t fragment_len, void *user_data, void *context)
Definition: u_websocket.c:1854
U_OPT_HEADER_PARAMETER
@ U_OPT_HEADER_PARAMETER
Add to the map containing the header variables, expected option value type: const char *,...
Definition: ulfius.h:158
U_OPT_CHECK_SERVER_CERTIFICATE_FLAG
@ U_OPT_CHECK_SERVER_CERTIFICATE_FLAG
check certificate peer and or server hostname if check_server_certificate is enabled,...
Definition: ulfius.h:149
_u_instance::bind_address6
struct sockaddr_in6 * bind_address6
Definition: ulfius.h:316
_u_request::http_verb
char * http_verb
Definition: ulfius.h:228
ulfius_init_response
int ulfius_init_response(struct _u_response *response)
Definition: u_response.c:367
u_map_clean_enum
int u_map_clean_enum(char **array)
Definition: u_map.c:91
_u_request::client_cert_file
char * client_cert_file
Definition: ulfius.h:254
U_OPT_TIMEOUT
@ U_OPT_TIMEOUT
connection timeout used by ulfius_send_http_request, default is 0 or Timeout in seconds to close the ...
Definition: ulfius.h:154
u_map_remove_at
int u_map_remove_at(struct _u_map *u_map, const int index)
Definition: u_map.c:333
_u_response::stream_callback_free
void(* stream_callback_free)(void *stream_user_data)
Definition: ulfius.h:276
ulfius_send_http_streaming_request
int ulfius_send_http_streaming_request(const struct _u_request *request, struct _u_response *response, size_t(*write_body_function)(void *contents, size_t size, size_t nmemb, void *user_data), void *write_body_data)
Definition: u_send_request.c:191
connection_info_struct::map_url_initial
struct _u_map map_url_initial
Definition: ulfius.h:357
_u_request::binary_body
void * binary_body
Definition: ulfius.h:249
_u_request::http_url
char * http_url
Definition: ulfius.h:229
_u_instance
Contains the needed data for an ulfius instance to work.
Definition: ulfius.h:308
_u_request::client_key_password
char * client_key_password
Definition: ulfius.h:256
ulfius_add_websocket_client_extension_message_perform
int ulfius_add_websocket_client_extension_message_perform(struct _websocket_client_handler *websocket_client_handler, const char *extension, uint8_t rsv, int(*websocket_extension_message_out_perform)(const uint8_t opcode, const uint64_t data_len_in, const char *data_in, uint64_t *data_len_out, char **data_out, const uint64_t fragment_len, void *user_data, void *context), void *websocket_extension_message_out_perform_user_data, int(*websocket_extension_message_in_perform)(const uint8_t opcode, const uint64_t data_len_in, const char *data_in, uint64_t *data_len_out, char **data_out, const uint64_t fragment_len, void *user_data, void *context), void *websocket_extension_message_in_perform_user_data, int(*websocket_extension_client_match)(const char *extension_server, void *user_data, void **context), void *websocket_extension_client_match_user_data, void(*websocket_extension_free_context)(void *user_data, void *context), void *websocket_extension_free_context_user_data)
Definition: u_websocket.c:2326
_u_cookie::domain
char * domain
Definition: ulfius.h:213
_u_request::auth_basic_password
char * auth_basic_password
Definition: ulfius.h:244
u_map_copy
struct _u_map * u_map_copy(const struct _u_map *source)
Definition: u_map.c:452
_u_response::map_cookie
struct _u_cookie * map_cookie
Definition: ulfius.h:271
ulfius_open_websocket_client_connection
int ulfius_open_websocket_client_connection(struct _u_request *request, void(*websocket_manager_callback)(const struct _u_request *request, struct _websocket_manager *websocket_manager, void *websocket_manager_user_data), void *websocket_manager_user_data, void(*websocket_incoming_message_callback)(const struct _u_request *request, struct _websocket_manager *websocket_manager, const struct _websocket_message *message, void *websocket_incoming_user_data), void *websocket_incoming_user_data, void(*websocket_onclose_callback)(const struct _u_request *request, struct _websocket_manager *websocket_manager, void *websocket_onclose_user_data), void *websocket_onclose_user_data, struct _websocket_client_handler *websocket_client_handler, struct _u_response *response)
Definition: u_websocket.c:2412
U_OPT_JSON_BODY
@ U_OPT_JSON_BODY
Set a stringified json_t * body to the request or the reponse, expected option value type: json_t *.
Definition: ulfius.h:168
_u_request::client_address
struct sockaddr * client_address
Definition: ulfius.h:242
_u_instance::max_post_param_size
size_t max_post_param_size
Definition: ulfius.h:323
u_map_get_length
ssize_t u_map_get_length(const struct _u_map *u_map, const char *key)
Definition: u_map.c:424
u_map_has_value_binary
int u_map_has_value_binary(const struct _u_map *u_map, const char *value, size_t length)
Definition: u_map.c:129
ulfius_copy_endpoint
int ulfius_copy_endpoint(struct _u_endpoint *dest, const struct _u_endpoint *source)
Definition: ulfius.c:1292
ulfius_clean_response_full
int ulfius_clean_response_full(struct _u_response *response)
Definition: u_response.c:358
ulfius_export_client_certificate_pem
char * ulfius_export_client_certificate_pem(const struct _u_request *request)
Definition: u_request.c:868
U_OPT_HTTP_URL
@ U_OPT_HTTP_URL
full url used to call this callback function or full url to call when used in a ulfius_send_http_requ...
Definition: ulfius.h:143
ulfius_websocket_client_connection_send_close_signal
int ulfius_websocket_client_connection_send_close_signal(struct _websocket_client_handler *websocket_client_handler)
Definition: u_websocket.c:2653
u_map_has_value
int u_map_has_value(const struct _u_map *u_map, const char *value)
Definition: u_map.c:125
ulfius_copy_cookie
int ulfius_copy_cookie(struct _u_cookie *dest, const struct _u_cookie *source)
Definition: u_response.c:301
_u_request::ca_path
char * ca_path
Definition: ulfius.h:240
ulfius_websocket_send_json_message
int ulfius_websocket_send_json_message(struct _websocket_manager *websocket_manager, json_t *message)
Definition: u_websocket.c:1535
_u_response::binary_body
void * binary_body
Definition: ulfius.h:273
ulfius_clean_request
int ulfius_clean_request(struct _u_request *request)
Definition: u_request.c:358
ulfius_set_json_body_request
int ulfius_set_json_body_request(struct _u_request *request, json_t *j_body)
Definition: u_request.c:813
ulfius_get_json_body_response
json_t * ulfius_get_json_body_response(struct _u_response *response, json_error_t *json_error)
Definition: u_response.c:689
_u_response::shared_data
void * shared_data
Definition: ulfius.h:281
connection_info_struct::post_processor
struct MHD_PostProcessor * post_processor
Definition: ulfius.h:352
_u_response::status
long status
Definition: ulfius.h:267
connection_info_struct::max_post_param_size
size_t max_post_param_size
Definition: ulfius.h:356
ulfius_send_http_request
int ulfius_send_http_request(const struct _u_request *request, struct _u_response *response)
Definition: u_send_request.c:159
ulfius_websocket_wait_close
int ulfius_websocket_wait_close(struct _websocket_manager *websocket_manager, unsigned int timeout)
Definition: u_websocket.c:2211
ulfius_empty_endpoint
const struct _u_endpoint * ulfius_empty_endpoint()
Definition: ulfius.c:1472
_u_instance::max_post_body_size
size_t max_post_body_size
Definition: ulfius.h:324
_u_endpoint::callback_function
int(* callback_function)(const struct _u_request *request, struct _u_response *response, void *user_data)
Definition: ulfius.h:296
ulfius_clean_request_full
int ulfius_clean_request_full(struct _u_request *request)
Definition: u_request.c:401
ulfius_websocket_client_connection_status
int ulfius_websocket_client_connection_status(struct _websocket_client_handler *websocket_client_handler)
Definition: u_websocket.c:2693
_u_endpoint::url_format
char * url_format
Definition: ulfius.h:294