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
31extern "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_JANSSON
48#include <jansson.h>
49#endif
50
51#ifndef U_DISABLE_WEBSOCKET
52 #include <poll.h>
53 #include <zlib.h>
54 #include <pthread.h>
55 #ifndef POLLRDHUP
56 #define POLLRDHUP 0x2000
57 #endif
58#endif
59
60#include <microhttpd.h>
61
62#if defined(_WIN32) && !defined(U_DISABLE_WEBSOCKET)
63 #define U_DISABLE_WEBSOCKET
64#endif
65
66#if (MHD_VERSION < 0x00095300) && !defined(U_DISABLE_WEBSOCKET)
67 #define U_DISABLE_WEBSOCKET
68#endif
69
71#include <orcania.h>
72
74#ifndef U_DISABLE_YDER
75 #include <yder.h>
76#else
77
78#define Y_LOG_MODE_NONE 0
79#define Y_LOG_MODE_CONSOLE 0
80#define Y_LOG_MODE_SYSLOG 0
81#define Y_LOG_MODE_FILE 0
82#define Y_LOG_MODE_JOURNALD 0
83#define Y_LOG_MODE_CALLBACK 0
84#define Y_LOG_MODE_CURRENT 0
85
86#define Y_LOG_LEVEL_NONE 0
87#define Y_LOG_LEVEL_DEBUG 0
88#define Y_LOG_LEVEL_INFO 0
89#define Y_LOG_LEVEL_WARNING 0
90#define Y_LOG_LEVEL_ERROR 0
91#define Y_LOG_LEVEL_CURRENT 0
92
93int y_init_logs(const char * app, const unsigned long init_mode, const unsigned long init_level, const char * init_log_file, const char * message);
94int 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);
95void y_log_message(const unsigned long type, const char * message, ...);
96int y_close_logs();
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_EMPTY 0
126#define U_COOKIE_SAME_SITE_STRICT 1
127#define U_COOKIE_SAME_SITE_LAX 2
128#define U_COOKIE_SAME_SITE_NONE 3
129
130#define U_USE_IPV4 0x0001
131#define U_USE_IPV6 0x0010
132#define U_USE_ALL (U_USE_IPV4|U_USE_IPV6)
133
134#define U_SSL_VERIFY_PEER 0x0001
135#define U_SSL_VERIFY_HOSTNAME 0x0010
136
137#define U_POST_PROCESS_NONE 0x0000
138#define U_POST_PROCESS_URL_ENCODED 0x0001
139#define U_POST_PROCESS_MULTIPART_FORMDATA 0x0010
140
186
191/*************
192 * Structures
193 *************/
194
204struct _u_map {
205 int nb_values; /* !< Values count */
206 char ** keys; /* !< Array of keys */
207 char ** values; /* !< Array of values */
208 size_t * lengths; /* !< Lengths of each values */
209};
210
215struct _u_cookie {
216 char * key; /* !< key if the cookie */
217 char * value; /* !< value of the cookie */
218 char * expires; /* !< expiration date of the cookie */
219 unsigned int max_age; /* !< duration of the cookie in seconds */
220 char * domain; /* !< domain for the cookie */
221 char * path; /* !< url path for the cookie */
222 int secure; /* !< flag to set cookie secure or not */
223 int http_only; /* !< flag to set cookie for HTTP connections only or not */
224 int same_site; /* !< flag to set same_site option to the cookie */
225};
226
234 char * http_protocol; /* !< http protocol used (1.0 or 1.1) */
235 char * http_verb; /* !< http method (GET, POST, PUT, DELETE, etc.) */
236 char * http_url; /* !< full url used to call this callback function or full url to call when used in a ulfius_send_http_request */
237 char * url_path; /* !< url path only used to call this callback function (ex, if http_url is /path/?param=1, url_path is /path/) */
238 char * proxy; /* !<proxy address to use for outgoing connections, used by ulfius_send_http_request */
239#if MHD_VERSION >= 0x00095208
240 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 */
241#endif
242 int check_server_certificate; /* !< check server certificate and hostname, default true, used by ulfius_send_http_request */
243 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 */
244 int check_proxy_certificate; /* !< check proxy certificate and hostname, default true, used by ulfius_send_http_request, requires libcurl >= 7.52 */
245 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 */
246 int follow_redirect; /* !< follow url redirections, used by ulfius_send_http_request */
247 char * ca_path; /* !< specify a path to CA certificates instead of system path, used by ulfius_send_http_request */
248 unsigned long timeout; /* !< connection timeout used by ulfius_send_http_request, default is 0 */
249 struct sockaddr * client_address; /* !< IP address of the client */
250 char * auth_basic_user; /* !< basic authentication username */
251 char * auth_basic_password; /* !< basic authentication password */
252 struct _u_map * map_url; /* !< map containing the url variables, both from the route and the ?key=value variables */
253 struct _u_map * map_header; /* !< map containing the header variables */
254 struct _u_map * map_cookie; /* !< map containing the cookie variables */
255 struct _u_map * map_post_body; /* !< map containing the post body variables (if available) */
256 void * binary_body; /* !< raw body */
257 size_t binary_body_length; /* !< length of raw body */
258 unsigned int callback_position; /* !< position of the current callback function in the callback list, starts at 0 */
259#ifndef U_DISABLE_GNUTLS
260 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 */
261 char * client_cert_file; /* !< path to client certificate file for sending http requests with certificate authentication, available only if GnuTLS support is enabled */
262 char * client_key_file; /* !< path to client key file for sending http requests with certificate authentication, available only if GnuTLS support is enabled */
263 char * client_key_password; /* !< password to unlock client key file, available only if GnuTLS support is enabled */
264#endif
265};
266
274 long status; /* !< HTTP status code (200, 404, 500, etc) */
275 char * protocol; /* !< HTTP Protocol sent */
276 struct _u_map * map_header; /* !< map containing the header variables */
277 unsigned int nb_cookies; /* !< number of cookies sent */
278 struct _u_cookie * map_cookie; /* !< array of cookies sent */
279 char * auth_realm; /* !< realm to send to the client on authenticationb failed */
280 void * binary_body; /* !< raw binary content */
281 size_t binary_body_length; /* !< length of the binary_body */
282 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 */
283 void (* stream_callback_free) (void * stream_user_data); /* !< callback function to free data allocated for streaming */
284 uint64_t stream_size; /* !< size of the streamed data (U_STREAM_SIZE_UNKNOWN if unknown) */
285 size_t stream_block_size; /* !< size of each block to be streamed, set according to your system */
286 void * stream_user_data; /* !< user defined data that will be available in your callback stream functions */
287 void * websocket_handle; /* !< handle for websocket extension */
288 void * shared_data; /* !< any data shared between callback functions, must be allocated and freed by the callback functions */
289 void (* free_shared_data)(void * shared_data); /* !< pointer to a function that will free shared_data */
290 unsigned int timeout; /* !< Timeout in seconds to close the connection because of inactivity between the client and the server */
291};
292
300 char * http_method; /* !< http verb (GET, POST, PUT, etc.) in upper case */
301 char * url_prefix; /* !< prefix for the url (optional) */
302 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 */
303 unsigned int priority; /* !< endpoint priority in descending order (0 is the higher priority) */
304 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. */
305 struct _u_response * response,
306 void * user_data);
307 void * user_data; /* !< pointer to a data or a structure that will be available in callback_function */
308};
309
317 struct MHD_Daemon * mhd_daemon; /* !< pointer to the libmicrohttpd daemon */
318 int status; /* !< status of the current instance, status are U_STATUS_STOP, U_STATUS_RUNNING or U_STATUS_ERROR */
319 unsigned int port; /* !< port number to listen to */
320#if MHD_VERSION >= 0x00095208
321 unsigned short network_type; /* !< Listen to ipv4 and or ipv6 connections, values available are U_USE_ALL, U_USE_IPV4 or U_USE_IPV6 */
322#endif
323 struct sockaddr_in * bind_address; /* !< ipv4 address to listen to (optional) */
324 struct sockaddr_in6 * bind_address6; /* !< ipv6 address to listen to (optional) */
325 unsigned int timeout; /* !< Timeout to close the connection because of inactivity between the client and the server */
326 int nb_endpoints; /* !< Number of available endpoints */
327 char * default_auth_realm; /* !< Default realm on authentication error */
328 struct _u_endpoint * endpoint_list; /* !< List of available endpoints */
329 struct _u_endpoint * default_endpoint; /* !< Default endpoint if no other endpoint match the current url */
330 struct _u_map * default_headers; /* !< Default headers that will be added to all response->map_header */
331 size_t max_post_param_size; /* !< maximum size for a post parameter, 0 means no limit, default 0 */
332 size_t max_post_body_size; /* !< maximum size for the entire post body, 0 means no limit, default 0 */
333 void * websocket_handler; /* !< handler for the websocket structure */
334 int (* file_upload_callback) (const struct _u_request * request, /* !< callback function to manage file upload by blocks */
335 const char * key,
336 const char * filename,
337 const char * content_type,
338 const char * transfer_encoding,
339 const char * data,
340 uint64_t off,
341 size_t size,
342 void * cls);
343 void * file_upload_cls; /* !< any pointer to pass to the file_upload_callback function */
344 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 */
345 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 */
346#ifndef U_DISABLE_GNUTLS
347 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 */
348#endif
349 int allowed_post_processor; /* !< Specifies which content-type are allowed to process in the request->map_post_body parameters list, default value is U_POST_PROCESS_URL_ENCODED|U_POST_PROCESS_MULTIPART_FORMDATA, to disable all, use U_POST_PROCESS_NONE */
350};
351
368
369/**********************************
370 * Instance functions declarations
371 **********************************/
372
383void u_free(void * data);
384
392int ulfius_global_init(void);
393
397void ulfius_global_close(void);
398
420int ulfius_init_instance(struct _u_instance * u_instance, unsigned int port, struct sockaddr_in * bind_address, const char * default_auth_realm);
421
422#if MHD_VERSION >= 0x00095208
434int 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);
435#endif
436
443void ulfius_clean_instance(struct _u_instance * u_instance);
444
452int ulfius_start_framework(struct _u_instance * u_instance);
453
463int ulfius_start_secure_framework(struct _u_instance * u_instance, const char * key_pem, const char * cert_pem);
464
465#ifndef U_DISABLE_GNUTLS
477int ulfius_start_secure_ca_trust_framework(struct _u_instance * u_instance, const char * key_pem, const char * cert_pem, const char * root_ca_pem);
478#endif
479
498int ulfius_start_framework_with_mhd_options(struct _u_instance * u_instance, unsigned int mhd_flags, struct MHD_OptionItem * mhd_ops);
499
503void mhd_request_completed (void *cls, struct MHD_Connection *connection, void **con_cls, enum MHD_RequestTerminationCode toe);
504void * ulfius_uri_logger (void * cls, const char * uri);
505
513int ulfius_stop_framework(struct _u_instance * u_instance);
514
536 int (* file_upload_callback) (const struct _u_request * request,
537 const char * key,
538 const char * filename,
539 const char * content_type,
540 const char * transfer_encoding,
541 const char * data,
542 uint64_t off,
543 size_t size,
544 void * cls),
545 void * cls);
546
557/***********************************
558 * Endpoints functions declarations
559 ***********************************/
560
568int ulfius_add_endpoint(struct _u_instance * u_instance, const struct _u_endpoint * u_endpoint);
569
587int ulfius_add_endpoint_by_val(struct _u_instance * u_instance,
588 const char * http_method,
589 const char * url_prefix,
590 const char * url_format,
591 unsigned int priority,
592 int (* callback_function)(const struct _u_request * request, // Input parameters (set by the framework)
593 struct _u_response * response, // Output parameters (set by the user)
594 void * user_data),
595 void * user_data);
596
604int ulfius_add_endpoint_list(struct _u_instance * u_instance, const struct _u_endpoint ** u_endpoint_list);
605
615int ulfius_remove_endpoint(struct _u_instance * u_instance, const struct _u_endpoint * u_endpoint);
616
628int ulfius_set_default_endpoint(struct _u_instance * u_instance,
629 int (* callback_function)(const struct _u_request * request, struct _u_response * response, void * user_data),
630 void * user_data);
631
644int ulfius_remove_endpoint_by_val(struct _u_instance * u_instance, const char * http_method, const char * url_prefix, const char * url_format);
645
650const struct _u_endpoint * ulfius_empty_endpoint(void);
651
659int ulfius_copy_endpoint(struct _u_endpoint * dest, const struct _u_endpoint * source);
660
668struct _u_endpoint * ulfius_duplicate_endpoint_list(const struct _u_endpoint * endpoint_list);
669
675void ulfius_clean_endpoint(struct _u_endpoint * endpoint);
676
682void ulfius_clean_endpoint_list(struct _u_endpoint * endpoint_list);
683
691int ulfius_equals_endpoints(const struct _u_endpoint * endpoint1, const struct _u_endpoint * endpoint2);
692
703#ifndef U_DISABLE_CURL
704/********************************************
705 * Requests/Responses functions declarations
706 ********************************************/
707
715int ulfius_send_http_request(const struct _u_request * request, struct _u_response * response);
716
727int ulfius_send_http_request_with_limit(const struct _u_request * request, struct _u_response * response, size_t response_body_limit, size_t max_header);
728
739int 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);
740
753int ulfius_send_http_streaming_request_max_header(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, size_t max_header);
754
773int ulfius_send_smtp_email(const char * host,
774 const int port,
775 const int use_tls,
776 const int verify_certificate,
777 const char * user,
778 const char * password,
779 const char * from,
780 const char * to,
781 const char * cc,
782 const char * bcc,
783 const char * subject,
784 const char * mail_body);
785
805int ulfius_send_smtp_rich_email(const char * host,
806 const int port,
807 const int use_tls,
808 const int verify_certificate,
809 const char * user,
810 const char * password,
811 const char * from,
812 const char * to,
813 const char * cc,
814 const char * bcc,
815 const char * content_type,
816 const char * subject,
817 const char * mail_body);
818#endif
819
844int ulfius_add_cookie_to_response(struct _u_response * response, const char * key, const char * value, const char * expires, const unsigned int max_age,
845 const char * domain, const char * path, const int secure, const int http_only);
846
865int 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,
866 const char * domain, const char * path, const int secure, const int http_only, const int same_site);
867
886int ulfius_add_header_to_response(struct _u_response * response, const char * key, const char * value);
887
895int ulfius_set_string_body_request(struct _u_request * request, const char * string_body);
896
905int ulfius_set_binary_body_request(struct _u_request * request, const char * binary_body, const size_t length);
906
913int ulfius_set_empty_body_request(struct _u_request * request);
914
923int ulfius_set_string_body_response(struct _u_response * response, const unsigned int status, const char * body);
924
934int ulfius_set_binary_body_response(struct _u_response * response, const unsigned int status, const char * body, const size_t length);
935
943int ulfius_set_empty_body_response(struct _u_response * response, const unsigned int status);
944
967int ulfius_set_stream_response(struct _u_response * response,
968 const unsigned int status,
969 ssize_t (* stream_callback) (void * stream_user_data, uint64_t offset, char * out_buf, size_t max),
970 void (* stream_callback_free) (void * stream_user_data),
971 uint64_t stream_size,
972 size_t stream_block_size,
973 void * stream_user_data);
974
991int ulfius_init_request(struct _u_request * request);
992
1001int ulfius_clean_request(struct _u_request * request);
1002
1009int ulfius_clean_request_full(struct _u_request * request);
1010
1018int ulfius_copy_request(struct _u_request * dest, const struct _u_request * source);
1019
1025int ulfius_set_request_properties(struct _u_request * request, ...);
1026
1033struct _u_request * ulfius_duplicate_request(const struct _u_request * request);
1034
1052char * ulfius_export_request_http(const struct _u_request * request);
1053
1059int ulfius_init_response(struct _u_response * response);
1060
1069int ulfius_clean_response(struct _u_response * response);
1070
1076int ulfius_clean_response_full(struct _u_response * response);
1077
1084int ulfius_copy_response(struct _u_response * dest, const struct _u_response * source);
1085
1092int ulfius_clean_cookie(struct _u_cookie * cookie);
1093
1100int ulfius_copy_cookie(struct _u_cookie * dest, const struct _u_cookie * source);
1101
1108struct _u_response * ulfius_duplicate_response(const struct _u_response * response);
1109
1115int ulfius_set_response_properties(struct _u_response * response, ...);
1116
1125int ulfius_set_response_shared_data(struct _u_response * response, void * shared_data, void (* free_shared_data) (void * shared_data));
1126
1149char * ulfius_export_response_http(const struct _u_response * response);
1150
1169char * ulfius_url_decode(const char * str);
1170
1179char * ulfius_url_encode(const char * str);
1180
1191#ifndef U_DISABLE_JANSSON
1202json_t * ulfius_get_json_body_request(const struct _u_request * request, json_error_t * json_error);
1203
1211int ulfius_set_json_body_request(struct _u_request * request, json_t * j_body);
1212
1223json_t * ulfius_get_json_body_response(struct _u_response * response, json_error_t * json_error);
1224
1233int ulfius_set_json_body_response(struct _u_response * response, const unsigned int status, const json_t * j_body);
1234#endif
1235
1246/************************************************************************
1247 * _u_map declarations *
1248 * _u_map is a simple map structure that handles sets of key/value maps *
1249 ************************************************************************/
1250
1257int u_map_init(struct _u_map * u_map);
1258
1264int u_map_clean(struct _u_map * u_map);
1265
1271int u_map_clean_full(struct _u_map * u_map);
1272
1278int u_map_clean_enum(char ** array);
1279
1285const char ** u_map_enum_keys(const struct _u_map * u_map);
1286
1292const char ** u_map_enum_values(const struct _u_map * u_map);
1293
1302int u_map_has_key(const struct _u_map * u_map, const char * key);
1303
1312int u_map_has_value(const struct _u_map * u_map, const char * value);
1313
1323int u_map_has_value_binary(const struct _u_map * u_map, const char * value, size_t length);
1324
1333int u_map_has_key_case(const struct _u_map * u_map, const char * key);
1334
1343int u_map_has_value_case(const struct _u_map * u_map, const char * value);
1344
1353int u_map_put(struct _u_map * u_map, const char * key, const char * value);
1354
1366int u_map_put_binary(struct _u_map * u_map, const char * key, const char * value, uint64_t offset, size_t length);
1367
1375ssize_t u_map_get_length(const struct _u_map * u_map, const char * key);
1376
1384ssize_t u_map_get_case_length(const struct _u_map * u_map, const char * key);
1385
1393const char * u_map_get(const struct _u_map * u_map, const char * key);
1394
1402const char * u_map_get_case(const struct _u_map * u_map, const char * key);
1403
1411int u_map_remove_from_key(struct _u_map * u_map, const char * key);
1412
1420int u_map_remove_from_key_case(struct _u_map * u_map, const char * key);
1421
1429int u_map_remove_from_value(struct _u_map * u_map, const char * value);
1430
1438int u_map_remove_from_value_case(struct _u_map * u_map, const char * value);
1439
1447int u_map_remove_from_value_binary(struct _u_map * u_map, const char * key, size_t length);
1448
1455int u_map_remove_at(struct _u_map * u_map, const int index);
1456
1463struct _u_map * u_map_copy(const struct _u_map * source);
1464
1472int u_map_copy_into(struct _u_map * dest, const struct _u_map * source);
1473
1480int u_map_count(const struct _u_map * source);
1481
1487int u_map_empty(struct _u_map * u_map);
1488
1499#ifndef U_DISABLE_WEBSOCKET
1500
1501/**********************************
1502 * Websocket functions declarations
1503 **********************************/
1504
1505#define U_WEBSOCKET_USER_AGENT "Ulfius Websocket Client Framework"
1506
1507#define U_WEBSOCKET_MAGIC_STRING "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
1508#define U_WEBSOCKET_UPGRADE_VALUE "websocket"
1509#define U_WEBSOCKET_BAD_REQUEST_BODY "Error in websocket handshake, wrong parameters"
1510#define U_WEBSOCKET_USEC_WAIT 50
1511#define WEBSOCKET_MAX_CLOSE_TRY 10
1512
1513#define U_WEBSOCKET_BIT_FIN 0x80
1514#define U_WEBSOCKET_MASK 0x80
1515#define U_WEBSOCKET_LEN_MASK 0x7F
1516#define U_WEBSOCKET_OPCODE_CONTINUE 0x00
1517#define U_WEBSOCKET_OPCODE_TEXT 0x01
1518#define U_WEBSOCKET_OPCODE_BINARY 0x02
1519#define U_WEBSOCKET_OPCODE_CLOSE 0x08
1520#define U_WEBSOCKET_OPCODE_PING 0x09
1521#define U_WEBSOCKET_OPCODE_PONG 0x0A
1522#define U_WEBSOCKET_OPCODE_CLOSED 0xFD
1523#define U_WEBSOCKET_OPCODE_ERROR 0xFE
1524#define U_WEBSOCKET_OPCODE_NONE 0xFF
1525
1526#define U_WEBSOCKET_NONE 0
1527#define U_WEBSOCKET_SERVER 1
1528#define U_WEBSOCKET_CLIENT 2
1529
1530#define U_WEBSOCKET_STATUS_OPEN 0
1531#define U_WEBSOCKET_STATUS_CLOSE 1
1532#define U_WEBSOCKET_STATUS_ERROR 2
1533
1534#define U_WEBSOCKET_RSV1 0x40
1535#define U_WEBSOCKET_RSV2 0x20
1536#define U_WEBSOCKET_RSV3 0x10
1537
1538#define WEBSOCKET_RESPONSE_HTTP 0x0001
1539#define WEBSOCKET_RESPONSE_UPGRADE 0x0002
1540#define WEBSOCKET_RESPONSE_CONNECTION 0x0004
1541#define WEBSOCKET_RESPONSE_ACCEPT 0x0008
1542#define WEBSOCKET_RESPONSE_PROTCOL 0x0010
1543#define WEBSOCKET_RESPONSE_EXTENSION 0x0020
1544
1545#define WEBSOCKET_DEFLATE_CHUNK_SIZE 32768
1546#define WEBSOCKET_DEFLATE_WINDOWS_BITS 15
1547
1548#define U_WEBSOCKET_KEEP_NONE 0x00
1549#define U_WEBSOCKET_KEEP_INCOMING 0x01
1550#define U_WEBSOCKET_KEEP_OUTCOMING 0x10
1551
1555struct _websocket_deflate_context {
1556 z_stream infstream;
1557 z_stream defstream;
1558 int deflate_mask;
1559 int inflate_mask;
1560 unsigned int server_no_context_takeover;
1561 unsigned int client_no_context_takeover;
1562 unsigned int server_max_window_bits;
1563 unsigned int client_max_window_bits;
1564};
1565
1570struct _websocket_extension {
1571 char * extension_server;
1572 char * extension_client;
1573 uint8_t rsv;
1574 int (* websocket_extension_message_out_perform)(const uint8_t opcode,
1575 const uint64_t data_len_in,
1576 const char * data_in,
1577 uint64_t * data_len_out,
1578 char ** data_out,
1579 const uint64_t fragment_len,
1580 void * user_data,
1581 void * context);
1582 void * websocket_extension_message_out_perform_user_data;
1583 int (* websocket_extension_message_in_perform)(const uint8_t opcode,
1584 const uint64_t data_len_in,
1585 const char * data_in,
1586 uint64_t * data_len_out,
1587 char ** data_out,
1588 const uint64_t fragment_len,
1589 void * user_data,
1590 void * context);
1591 void * websocket_extension_message_in_perform_user_data;
1592 int (* websocket_extension_server_match)(const char * extension_client,
1593 const char ** extension_client_list,
1594 char ** extension_server,
1595 void * user_data,
1596 void ** context);
1597 void * websocket_extension_server_match_user_data;
1598 int (* websocket_extension_client_match)(const char * extension_server,
1599 void * user_data,
1600 void ** context);
1601 void * websocket_extension_client_match_user_data;
1602 void (* websocket_extension_free_context)(void * user_data,
1603 void * context);
1604 void * websocket_extension_free_context_user_data;
1605 int enabled;
1606 void * context;
1607};
1608
1615struct _websocket_manager {
1616#ifndef U_DISABLE_WS_MESSAGE_LIST
1617 struct _websocket_message_list * message_list_incoming; /* !< list of incoming messages */
1618 struct _websocket_message_list * message_list_outcoming; /* !< list of outcoming messages */
1619 int keep_messages; /* !< keep incoming and/or outcoming messages, flags available are U_WEBSOCKET_KEEP_INCOMING, U_WEBSOCKET_KEEP_OUTCOMING, U_WEBSOCKET_KEEP_NONE, default is U_WEBSOCKET_KEEP_INCOMING|U_WEBSOCKET_KEEP_OUTCOMING */
1620#endif
1621 int connected; /* !< flag to know if the websocket is connected or not */
1622 int ping_sent; /* !< flag to know if the websocket has sent a ping frame or not, before receiving a pong */
1623 int close_flag; /* !< flag to set before closing a websocket */
1624 MHD_socket mhd_sock; /* !< reference to libmicrohttpd's socket for websocket server */
1625 int tcp_sock; /* !< tcp socket for websocket client */
1626 int tls; /* !< set to 1 if the websocket is in a TLS socket */
1627 gnutls_session_t gnutls_session; /* !< GnuTLS session for websocket client */
1628 gnutls_certificate_credentials_t xcred; /* !< certificate credential used by GnuTLS */
1629 char * protocol; /* !< websocket protocol */
1630 char * extensions; /* !< websocket extension */
1631 pthread_mutex_t read_lock; /* !< mutex to read data in the socket */
1632 pthread_mutex_t write_lock; /* !< mutex to write data in the socket */
1633 pthread_mutex_t status_lock; /* !< mutex to broadcast new status */
1634 pthread_cond_t status_cond; /* !< condition to broadcast new status */
1635 struct pollfd fds_in;
1636 struct pollfd fds_out;
1637 int type;
1638 int rsv_expected;
1639 struct _pointer_list * websocket_extension_list;
1640};
1641
1647struct _websocket_message {
1648 time_t datestamp; /* !< date stamp of the message */
1649 uint8_t rsv; /* !< flags RSV1-3 of the message */
1650 uint8_t opcode; /* !< opcode for the message (string or binary) */
1651 uint8_t has_mask; /* !< does the message contain a mask? */
1652 uint8_t mask[4]; /* !< mask used if any */
1653 size_t data_len; /* !< length of the data */
1654 char * data; /* !< message data */
1655 size_t fragment_len; /* !< length of the fragment, 0 if not fragmented */
1656 uint8_t fin; /* !< flag fin (end of fragmented message) */
1657};
1658
1659#ifndef U_DISABLE_WS_MESSAGE_LIST
1663struct _websocket_message_list {
1664 struct _websocket_message ** list; /* !< messages list */
1665 size_t len; /* !< message list length */
1666};
1667#endif
1668
1673struct _websocket {
1674 struct _u_instance * instance; /* !< reference to the ulfius instance if any */
1675 struct _u_request * request; /* !< refrence to the ulfius request of any */
1676 void (* websocket_manager_callback) (const struct _u_request * request, /* !< reference to a function called after the websocket handshake */
1677 struct _websocket_manager * websocket_manager,
1678 void * websocket_manager_user_data);
1679 void * websocket_manager_user_data; /* !< a user-defined reference that will be available in websocket_manager_callback */
1680 void (* websocket_incoming_message_callback) (const struct _u_request * request, /* !< reference to a function called each time a message arrives */
1681 struct _websocket_manager * websocket_manager,
1682 const struct _websocket_message * message,
1683 void * websocket_incoming_user_data);
1684 void * websocket_incoming_user_data; /* !< a user-defined reference that will be available in websocket_incoming_message_callback */
1685 void (* websocket_onclose_callback) (const struct _u_request * request, /* !< reference to a function called after the websocket connection ends */
1686 struct _websocket_manager * websocket_manager,
1687 void * websocket_onclose_user_data);
1688 void * websocket_onclose_user_data; /* !< a user-defined reference that will be available in websocket_onclose_callback */
1689 struct _websocket_manager * websocket_manager; /* !< refrence to the websocket manager if any */
1690 struct MHD_UpgradeResponseHandle * urh; /* !< reference used by libmicrohttpd to upgrade the connection */
1691};
1692
1696struct _websocket_client_handler {
1697 struct _websocket * websocket; /* !< the websocket to use */
1698 struct _u_response * response; /* !< the response attached to the websocket */
1699};
1700
1701/********************************/
1703/********************************/
1704
1714int ulfius_websocket_send_message(struct _websocket_manager * websocket_manager,
1715 const uint8_t opcode,
1716 const uint64_t data_len,
1717 const char * data);
1718
1730int ulfius_websocket_send_fragmented_message(struct _websocket_manager * websocket_manager,
1731 const uint8_t opcode,
1732 const uint64_t data_len,
1733 const char * data,
1734 const uint64_t fragment_len);
1735
1736#ifndef U_DISABLE_JANSSON
1743int ulfius_websocket_send_json_message(struct _websocket_manager * websocket_manager,
1744 json_t * j_message);
1745
1752json_t * ulfius_websocket_parse_json_message(const struct _websocket_message * message, json_error_t * json_error);
1753#endif
1754
1755#ifndef U_DISABLE_WS_MESSAGE_LIST
1765struct _websocket_message * ulfius_websocket_pop_first_message(struct _websocket_message_list * message_list);
1766#endif
1767
1772void ulfius_clear_websocket_message(struct _websocket_message * message);
1773
1774/********************************/
1776/********************************/
1777
1792int ulfius_set_websocket_response(struct _u_response * response,
1793 const char * websocket_protocol,
1794 const char * websocket_extensions,
1795 void (* websocket_manager_callback) (const struct _u_request * request,
1796 struct _websocket_manager * websocket_manager,
1797 void * websocket_manager_user_data),
1798 void * websocket_manager_user_data,
1799 void (* websocket_incoming_message_callback) (const struct _u_request * request,
1800 struct _websocket_manager * websocket_manager,
1801 const struct _websocket_message * message,
1802 void * websocket_incoming_user_data),
1803 void * websocket_incoming_user_data,
1804 void (* websocket_onclose_callback) (const struct _u_request * request,
1805 struct _websocket_manager * websocket_manager,
1806 void * websocket_onclose_user_data),
1807 void * websocket_onclose_user_data);
1808
1826 const char * extension_server,
1827 uint8_t rsv,
1828 int (* websocket_extension_message_out_perform)(const uint8_t opcode,
1829 const uint64_t data_len_in,
1830 const char * data_in,
1831 uint64_t * data_len_out,
1832 char ** data_out,
1833 const uint64_t fragment_len,
1834 void * user_data,
1835 void * context),
1836 void * websocket_extension_message_out_perform_user_data,
1837 int (* websocket_extension_message_in_perform)(const uint8_t opcode,
1838 const uint64_t data_len_in,
1839 const char * data_in,
1840 uint64_t * data_len_out,
1841 char ** data_out,
1842 const uint64_t fragment_len,
1843 void * user_data,
1844 void * context),
1845 void * websocket_extension_message_in_perform_user_data,
1846 int (* websocket_extension_server_match)(const char * extension_client,
1847 const char ** extension_client_list,
1848 char ** extension_server,
1849 void * user_data,
1850 void ** context),
1851 void * websocket_extension_server_match_user_data,
1852 void (* websocket_extension_free_context)(void * user_data,
1853 void * context),
1854 void * websocket_extension_free_context_user_data);
1855
1870int websocket_extension_message_out_deflate(const uint8_t opcode,
1871 const uint64_t data_len_in,
1872 const char * data_in,
1873 uint64_t * data_len_out,
1874 char ** data_out,
1875 const uint64_t fragment_len,
1876 void * user_data,
1877 void * context);
1878
1892int websocket_extension_message_in_inflate(const uint8_t opcode,
1893 const uint64_t data_len_in,
1894 const char * data_in,
1895 uint64_t * data_len_out,
1896 char ** data_out,
1897 const uint64_t fragment_len,
1898 void * user_data,
1899 void * context);
1900
1907void websocket_extension_deflate_free_context(void * user_data, void * context);
1908
1918int websocket_extension_server_match_deflate(const char * extension_client, const char ** extension_client_list, char ** extension_server, void * user_data, void ** context);
1919
1929
1939int ulfius_websocket_send_close_signal(struct _websocket_manager * websocket_manager);
1940
1948int ulfius_websocket_status(struct _websocket_manager * websocket_manager);
1949
1958int ulfius_websocket_wait_close(struct _websocket_manager * websocket_manager, unsigned int timeout);
1959
1960/********************************/
1962/********************************/
1963
1978 void (* websocket_manager_callback) (const struct _u_request * request,
1979 struct _websocket_manager * websocket_manager,
1980 void * websocket_manager_user_data),
1981 void * websocket_manager_user_data,
1982 void (* websocket_incoming_message_callback) (const struct _u_request * request,
1983 struct _websocket_manager * websocket_manager,
1984 const struct _websocket_message * message,
1985 void * websocket_incoming_user_data),
1986 void * websocket_incoming_user_data,
1987 void (* websocket_onclose_callback) (const struct _u_request * request,
1988 struct _websocket_manager * websocket_manager,
1989 void * websocket_onclose_user_data),
1990 void * websocket_onclose_user_data,
1991 struct _websocket_client_handler * websocket_client_handler,
1992 struct _u_response * response);
1993
2009int ulfius_add_websocket_client_extension_message_perform(struct _websocket_client_handler * websocket_client_handler,
2010 const char * extension,
2011 uint8_t rsv,
2012 int (* websocket_extension_message_out_perform)(const uint8_t opcode,
2013 const uint64_t data_len_in,
2014 const char * data_in,
2015 uint64_t * data_len_out,
2016 char ** data_out,
2017 const uint64_t fragment_len,
2018 void * user_data,
2019 void * context),
2020 void * websocket_extension_message_out_perform_user_data,
2021 int (* websocket_extension_message_in_perform)(const uint8_t opcode,
2022 const uint64_t data_len_in,
2023 const char * data_in,
2024 uint64_t * data_len_out,
2025 char ** data_out,
2026 const uint64_t fragment_len,
2027 void * user_data,
2028 void * context),
2029 void * websocket_extension_message_in_perform_user_data,
2030 int (* websocket_extension_client_match)(const char * extension_server,
2031 void * user_data,
2032 void ** context),
2033 void * websocket_extension_client_match_user_data,
2034 void (* websocket_extension_free_context)(void * user_data,
2035 void * context),
2036 void * websocket_extension_free_context_user_data);
2037
2045int websocket_extension_client_match_deflate(const char * extension_server, void * user_data, void ** context);
2046
2054int ulfius_add_websocket_client_deflate_extension(struct _websocket_client_handler * websocket_client_handler);
2055
2061int ulfius_websocket_client_connection_send_close_signal(struct _websocket_client_handler * websocket_client_handler);
2062
2068int ulfius_websocket_client_connection_close(struct _websocket_client_handler * websocket_client_handler);
2069
2076int ulfius_websocket_client_connection_status(struct _websocket_client_handler * websocket_client_handler);
2077
2086int ulfius_websocket_client_connection_wait_close(struct _websocket_client_handler * websocket_client_handler, unsigned int timeout);
2087
2097int ulfius_set_websocket_request(struct _u_request * request,
2098 const char * url,
2099 const char * websocket_protocol,
2100 const char * websocket_extensions);
2101
2102#endif
2103
2105#define ULFIUS_URL_SEPARATOR "/"
2106#define ULFIUS_HTTP_ENCODING_JSON "application/json"
2107#define ULFIUS_HTTP_HEADER_CONTENT "Content-Type"
2108#define ULFIUS_HTTP_NOT_FOUND_BODY "Resource not found"
2109#define ULFIUS_HTTP_ERROR_BODY "Server Error"
2110
2111#define ULFIUS_COOKIE_ATTRIBUTE_EXPIRES "Expires"
2112#define ULFIUS_COOKIE_ATTRIBUTE_MAX_AGE "Max-Age"
2113#define ULFIUS_COOKIE_ATTRIBUTE_DOMAIN "Domain"
2114#define ULFIUS_COOKIE_ATTRIBUTE_PATH "Path"
2115#define ULFIUS_COOKIE_ATTRIBUTE_SECURE "Secure"
2116#define ULFIUS_COOKIE_ATTRIBUTE_HTTPONLY "HttpOnly"
2117
2118#define ULFIUS_POSTBUFFERSIZE 65536
2119
2120#define U_STATUS_STOP 0
2121#define U_STATUS_RUNNING 1
2122#define U_STATUS_ERROR 2
2123
2124#ifndef U_DISABLE_WEBSOCKET
2125
2129struct _websocket_handle {
2130 char * websocket_protocol; /* !< protocol for the websocket */
2131 char * websocket_extensions; /* !< extensions for the websocket */
2132 void (* websocket_manager_callback) (const struct _u_request * request, /* !< callback function for working with the websocket */
2133 struct _websocket_manager * websocket_manager,
2134 void * websocket_manager_user_data);
2135 void * websocket_manager_user_data; /* !< user-defined data that will be handled to websocket_manager_callback */
2136 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 */
2137 struct _websocket_manager * websocket_manager,
2138 const struct _websocket_message * message,
2139 void * websocket_incoming_user_data);
2140 void * websocket_incoming_user_data; /* !< user-defined data that will be handled to websocket_incoming_message_callback */
2141 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 */
2142 struct _websocket_manager * websocket_manager,
2143 void * websocket_onclose_user_data);
2144 void * websocket_onclose_user_data; /* !< user-defined data that will be handled to websocket_onclose_callback */
2145 int rsv_expected;
2146 struct _pointer_list * websocket_extension_list;
2147};
2148
2152struct _websocket_handler {
2153 pthread_mutex_t websocket_active_lock; /* !< mutex to change nb_websocket_active value */
2154 size_t nb_websocket_active; /* !< number of active websocket */
2155 struct _websocket ** websocket_active; /* !< array of active websocket */
2156 pthread_mutex_t websocket_close_lock; /* !< mutex to broadcast close signal */
2157 pthread_cond_t websocket_close_cond; /* !< condition to broadcast close signal */
2158 int pthread_init;
2159};
2160
2161#endif // U_DISABLE_WEBSOCKET
2162
2173#ifndef U_DISABLE_GNUTLS
2181char * ulfius_export_client_certificate_pem(const struct _u_request * request);
2182
2190int ulfius_import_client_certificate_pem(struct _u_request * request, const char * str_cert);
2191
2192#endif // U_DISABLE_GNUTLS
2193
2198#ifdef __cplusplus
2199}
2200#endif
2201
2202#endif // __ULFIUS_H__
char * ulfius_export_client_certificate_pem(const struct _u_request *request)
Definition u_request.c:1008
int ulfius_import_client_certificate_pem(struct _u_request *request, const char *str_cert)
Definition u_request.c:1032
u_option
Definition ulfius.h:145
@ U_OPT_POST_BODY_PARAMETER_REMOVE
Remove from map containing the post body variables (if available), expected option value type: const ...
Definition ulfius.h:170
@ U_OPT_CHECK_PROXY_CERTIFICATE
check proxy certificate and hostname, default true, used by ulfius_send_http_request,...
Definition ulfius.h:155
@ U_OPT_CLIENT_KEY_PASSWORD
password to unlock client key file, available only if GnuTLS support is enabled, expected option valu...
Definition ulfius.h:179
@ U_OPT_STATUS
HTTP response status code (200, 404, 500, etc), expected option value type: long.
Definition ulfius.h:181
@ U_OPT_FOLLOW_REDIRECT
follow url redirections, used by ulfius_send_http_request, expected option value type: int
Definition ulfius.h:157
@ U_OPT_COOKIE_PARAMETER
Add to the map containing the cookie variables, expected option value type: const char *,...
Definition ulfius.h:165
@ U_OPT_TIMEOUT
connection timeout used by ulfius_send_http_request, default is 0 or Timeout in seconds to close the ...
Definition ulfius.h:159
@ U_OPT_AUTH_BASIC_USER
basic authentication username, expected option value type: const char *
Definition ulfius.h:160
@ U_OPT_CA_PATH
specify a path to CA certificates instead of system path, used by ulfius_send_http_request,...
Definition ulfius.h:158
@ U_OPT_AUTH_REALM
realm to send to the client response on authenticationb failed, expected option value type: const cha...
Definition ulfius.h:182
@ 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:148
@ U_OPT_HEADER_PARAMETER_REMOVE
Remove from map containing the header variables, expected option value type: const char *.
Definition ulfius.h:168
@ U_OPT_CLIENT_CERT_FILE
path to client certificate file for sending http requests with certificate authentication,...
Definition ulfius.h:177
@ U_OPT_CLIENT_KEY_FILE
path to client key file for sending http requests with certificate authentication,...
Definition ulfius.h:178
@ 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:174
@ U_OPT_HTTP_PROXY
proxy address to use for outgoing connections, used by ulfius_send_http_request, expected option valu...
Definition ulfius.h:149
@ U_OPT_COOKIE_PARAMETER_REMOVE
Remove from map containing the cookie variables, expected option value type: const char *.
Definition ulfius.h:169
@ U_OPT_HTTP_VERB
http method (GET, POST, PUT, DELETE, etc.), expected option value type: const char *
Definition ulfius.h:147
@ U_OPT_NONE
Empty option to complete a ulfius_set_request_properties or ulfius_set_request_properties.
Definition ulfius.h:146
@ U_OPT_BINARY_BODY
Set a raw body to the request or the reponse, expected option value type: const char *,...
Definition ulfius.h:171
@ U_OPT_AUTH_BASIC_PASSWORD
basic authentication password, expected option value type: const char *
Definition ulfius.h:161
@ U_OPT_SHARED_DATA
any data shared between callback functions, must be allocated and freed by the callback functions,...
Definition ulfius.h:183
@ 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:167
@ U_OPT_CHECK_SERVER_CERTIFICATE
check server certificate and hostname, default true, used by ulfius_send_http_request,...
Definition ulfius.h:153
@ 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:166
@ U_OPT_CHECK_PROXY_CERTIFICATE_FLAG
check certificate peer and or proxy hostname if check_proxy_certificate is enabled,...
Definition ulfius.h:156
@ U_OPT_STRING_BODY
Set a char * body to the request or the reponse, expected option value type: const char *.
Definition ulfius.h:172
@ U_OPT_URL_PARAMETER
Add to the map containing the url variables, both from the route and the ?key=value variables,...
Definition ulfius.h:163
@ U_OPT_HEADER_PARAMETER
Add to the map containing the header variables, expected option value type: const char *,...
Definition ulfius.h:164
@ U_OPT_AUTH_BASIC
basic authentication user, then password, expected option value type: const char *,...
Definition ulfius.h:162
@ U_OPT_HTTP_URL_APPEND
append char * value to the current url, expected option value type: const char *
Definition ulfius.h:184
@ U_OPT_CHECK_SERVER_CERTIFICATE_FLAG
check certificate peer and or server hostname if check_server_certificate is enabled,...
Definition ulfius.h:154
void ulfius_clean_endpoint_list(struct _u_endpoint *endpoint_list)
Definition ulfius.c:1394
int ulfius_add_endpoint_list(struct _u_instance *u_instance, const struct _u_endpoint **u_endpoint_list)
Definition ulfius.c:1445
int ulfius_add_endpoint(struct _u_instance *u_instance, const struct _u_endpoint *u_endpoint)
Definition ulfius.c:1405
int ulfius_remove_endpoint(struct _u_instance *u_instance, const struct _u_endpoint *u_endpoint)
Definition ulfius.c:1462
int ulfius_copy_endpoint(struct _u_endpoint *dest, const struct _u_endpoint *source)
Definition ulfius.c:1336
const struct _u_endpoint * ulfius_empty_endpoint(void)
Definition ulfius.c:1516
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:1568
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:1545
struct _u_endpoint * ulfius_duplicate_endpoint_list(const struct _u_endpoint *endpoint_list)
Definition ulfius.c:1358
int ulfius_equals_endpoints(const struct _u_endpoint *endpoint1, const struct _u_endpoint *endpoint2)
Definition ulfius.c:1527
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:1581
void ulfius_clean_endpoint(struct _u_endpoint *endpoint)
Definition ulfius.c:1379
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:1028
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:267
int ulfius_send_http_request_with_limit(const struct _u_request *request, struct _u_response *response, size_t response_body_limit, size_t max_header)
Definition u_send_request.c:230
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:824
int ulfius_send_http_request(const struct _u_request *request, struct _u_response *response)
Definition u_send_request.c:192
int ulfius_send_http_streaming_request_max_header(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, size_t max_header)
Definition u_send_request.c:281
void mhd_request_completed(void *cls, struct MHD_Connection *connection, void **con_cls, enum MHD_RequestTerminationCode toe)
Definition ulfius.c:307
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:1732
void ulfius_clean_instance(struct _u_instance *u_instance)
Definition ulfius.c:1624
int ulfius_start_framework_with_mhd_options(struct _u_instance *u_instance, unsigned int mhd_flags, struct MHD_OptionItem *mhd_ops)
Definition ulfius.c:1274
int ulfius_stop_framework(struct _u_instance *u_instance)
Definition ulfius.c:1301
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:1232
int ulfius_start_framework(struct _u_instance *u_instance)
Definition ulfius.c:1166
void * ulfius_uri_logger(void *cls, const char *uri)
Definition ulfius.c:207
int ulfius_start_secure_framework(struct _u_instance *u_instance, const char *key_pem, const char *cert_pem)
Definition ulfius.c:1183
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:1604
void ulfius_global_close(void)
Definition ulfius.c:1930
int ulfius_global_init(void)
Definition ulfius.c:1906
void u_free(void *data)
Definition ulfius.c:1746
int ulfius_add_header_to_response(struct _u_response *response, const char *key, const char *value)
Definition u_response.c:717
int ulfius_set_empty_body_request(struct _u_request *request)
Definition u_request.c:751
int ulfius_set_string_body_response(struct _u_response *response, const unsigned int status, const char *body)
Definition u_response.c:516
int ulfius_set_string_body_request(struct _u_request *request, const char *string_body)
Definition u_request.c:704
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:534
int ulfius_set_binary_body_request(struct _u_request *request, const char *binary_body, const size_t length)
Definition u_request.c:726
int ulfius_set_empty_body_response(struct _u_response *response, const unsigned int status)
Definition u_response.c:555
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:569
int u_map_init(struct _u_map *u_map)
Definition u_map.c:32
int u_map_remove_from_value_binary(struct _u_map *u_map, const char *key, size_t length)
Definition u_map.c:296
int u_map_remove_from_key(struct _u_map *u_map, const char *key)
Definition u_map.c:246
int u_map_clean(struct _u_map *u_map)
Definition u_map.c:70
int u_map_remove_at(struct _u_map *u_map, const int index)
Definition u_map.c:342
const char * u_map_get(const struct _u_map *u_map, const char *key)
Definition u_map.c:377
int u_map_remove_from_value_case(struct _u_map *u_map, const char *value)
Definition u_map.c:319
ssize_t u_map_get_case_length(const struct _u_map *u_map, const char *key)
Definition u_map.c:447
int u_map_remove_from_key_case(struct _u_map *u_map, const char *key)
Definition u_map.c:269
const char * u_map_get_case(const struct _u_map *u_map, const char *key)
Definition u_map.c:419
const char ** u_map_enum_values(const struct _u_map *u_map)
Definition u_map.c:116
const char ** u_map_enum_keys(const struct _u_map *u_map)
Definition u_map.c:112
int u_map_has_value(const struct _u_map *u_map, const char *value)
Definition u_map.c:132
int u_map_has_value_case(const struct _u_map *u_map, const char *value)
Definition u_map.c:407
int u_map_clean_enum(char **array)
Definition u_map.c:98
int u_map_clean_full(struct _u_map *u_map)
Definition u_map.c:89
int u_map_has_key_case(const struct _u_map *u_map, const char *key)
Definition u_map.c:395
ssize_t u_map_get_length(const struct _u_map *u_map, const char *key)
Definition u_map.c:433
int u_map_empty(struct _u_map *u_map)
Definition u_map.c:516
int u_map_copy_into(struct _u_map *dest, const struct _u_map *source)
Definition u_map.c:489
int u_map_put(struct _u_map *u_map, const char *key, const char *value)
Definition u_map.c:148
int u_map_has_value_binary(const struct _u_map *u_map, const char *value, size_t length)
Definition u_map.c:136
int u_map_has_key(const struct _u_map *u_map, const char *key)
Definition u_map.c:120
int u_map_remove_from_value(struct _u_map *u_map, const char *value)
Definition u_map.c:292
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:156
int u_map_count(const struct _u_map *source)
Definition u_map.c:507
struct _u_map * u_map_copy(const struct _u_map *source)
Definition u_map.c:461
char * ulfius_url_decode(const char *str)
Definition ulfius.c:1877
char * ulfius_url_encode(const char *str)
Definition ulfius.c:1843
Contains all informations needed for an endpoint.
Definition ulfius.h:299
int(* callback_function)(const struct _u_request *request, struct _u_response *response, void *user_data)
Definition ulfius.h:304
void * user_data
Definition ulfius.h:307
unsigned int priority
Definition ulfius.h:303
char * http_method
Definition ulfius.h:300
char * url_format
Definition ulfius.h:302
char * url_prefix
Definition ulfius.h:301
Contains the needed data for an ulfius instance to work.
Definition ulfius.h:316
int status
Definition ulfius.h:318
size_t max_post_param_size
Definition ulfius.h:331
struct MHD_Daemon * mhd_daemon
Definition ulfius.h:317
int allowed_post_processor
Definition ulfius.h:349
unsigned int port
Definition ulfius.h:319
unsigned int timeout
Definition ulfius.h:325
size_t max_post_body_size
Definition ulfius.h:332
struct sockaddr_in * bind_address
Definition ulfius.h:323
void * file_upload_cls
Definition ulfius.h:343
struct _u_map * default_headers
Definition ulfius.h:330
int check_utf8
Definition ulfius.h:345
struct sockaddr_in6 * bind_address6
Definition ulfius.h:324
struct _u_endpoint * endpoint_list
Definition ulfius.h:328
int nb_endpoints
Definition ulfius.h:326
struct _u_endpoint * default_endpoint
Definition ulfius.h:329
void * websocket_handler
Definition ulfius.h:333
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:334
char * default_auth_realm
Definition ulfius.h:327
int mhd_response_copy_data
Definition ulfius.h:344
int use_client_cert_auth
Definition ulfius.h:347
Definition ulfius.h:204
int nb_values
Definition ulfius.h:205
size_t * lengths
Definition ulfius.h:208
char ** keys
Definition ulfius.h:206
char ** values
Definition ulfius.h:207
definition of the parameters available in a struct _u_request
Definition ulfius.h:233
unsigned long timeout
Definition ulfius.h:248
int check_server_certificate_flag
Definition ulfius.h:243
int follow_redirect
Definition ulfius.h:246
char * auth_basic_password
Definition ulfius.h:251
char * http_protocol
Definition ulfius.h:234
int check_proxy_certificate_flag
Definition ulfius.h:245
char * client_key_password
Definition ulfius.h:263
void * binary_body
Definition ulfius.h:256
gnutls_x509_crt_t client_cert
Definition ulfius.h:260
struct _u_map * map_cookie
Definition ulfius.h:254
size_t binary_body_length
Definition ulfius.h:257
struct _u_map * map_header
Definition ulfius.h:253
int check_server_certificate
Definition ulfius.h:242
struct sockaddr * client_address
Definition ulfius.h:249
char * ca_path
Definition ulfius.h:247
struct _u_map * map_post_body
Definition ulfius.h:255
int check_proxy_certificate
Definition ulfius.h:244
char * client_key_file
Definition ulfius.h:262
char * url_path
Definition ulfius.h:237
char * auth_basic_user
Definition ulfius.h:250
char * http_verb
Definition ulfius.h:235
unsigned int callback_position
Definition ulfius.h:258
char * proxy
Definition ulfius.h:238
char * http_url
Definition ulfius.h:236
struct _u_map * map_url
Definition ulfius.h:252
char * client_cert_file
Definition ulfius.h:261
definition of the parameters available in a struct _u_response
Definition ulfius.h:273
char * protocol
Definition ulfius.h:275
size_t stream_block_size
Definition ulfius.h:285
void * stream_user_data
Definition ulfius.h:286
ssize_t(* stream_callback)(void *stream_user_data, uint64_t offset, char *out_buf, size_t max)
Definition ulfius.h:282
void * websocket_handle
Definition ulfius.h:287
uint64_t stream_size
Definition ulfius.h:284
size_t binary_body_length
Definition ulfius.h:281
struct _u_map * map_header
Definition ulfius.h:276
long status
Definition ulfius.h:274
unsigned int nb_cookies
Definition ulfius.h:277
unsigned int timeout
Definition ulfius.h:290
struct _u_cookie * map_cookie
Definition ulfius.h:278
char * auth_realm
Definition ulfius.h:279
void(* stream_callback_free)(void *stream_user_data)
Definition ulfius.h:283
void(* free_shared_data)(void *shared_data)
Definition ulfius.h:289
void * binary_body
Definition ulfius.h:280
void * shared_data
Definition ulfius.h:288
Definition ulfius.h:359
struct _u_request * request
Definition ulfius.h:364
struct _u_map map_url_initial
Definition ulfius.h:366
struct _u_instance * u_instance
Definition ulfius.h:360
size_t max_post_param_size
Definition ulfius.h:365
struct MHD_PostProcessor * post_processor
Definition ulfius.h:361
int callback_first_iteration
Definition ulfius.h:363
int has_post_processor
Definition ulfius.h:362
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:2040
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:1881
int ulfius_websocket_client_connection_send_close_signal(struct _websocket_client_handler *websocket_client_handler)
Definition u_websocket.c:2761
int ulfius_websocket_send_close_signal(struct _websocket_manager *websocket_manager)
Definition u_websocket.c:2278
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:2118
int ulfius_add_websocket_client_deflate_extension(struct _websocket_client_handler *websocket_client_handler)
Definition u_websocket.c:2752
int ulfius_websocket_client_connection_wait_close(struct _websocket_client_handler *websocket_client_handler, unsigned int timeout)
Definition u_websocket.c:2815
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:2438
int ulfius_websocket_client_connection_status(struct _websocket_client_handler *websocket_client_handler)
Definition u_websocket.c:2801
json_t * ulfius_websocket_parse_json_message(const struct _websocket_message *message, json_error_t *json_error)
Definition u_websocket.c:1614
int ulfius_websocket_wait_close(struct _websocket_manager *websocket_manager, unsigned int timeout)
Definition u_websocket.c:2307
int ulfius_websocket_status(struct _websocket_manager *websocket_manager)
Definition u_websocket.c:2293
int ulfius_websocket_send_json_message(struct _websocket_manager *websocket_manager, json_t *j_message)
Definition u_websocket.c:1594
struct _websocket_message * ulfius_websocket_pop_first_message(struct _websocket_message_list *message_list)
Definition u_websocket.c:1629
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:2524
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:1950
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:1834
int ulfius_add_websocket_deflate_extension(struct _u_response *response)
Definition u_websocket.c:2266
void websocket_extension_deflate_free_context(void *user_data, void *context)
Definition u_websocket.c:2259
int ulfius_websocket_client_connection_close(struct _websocket_client_handler *websocket_client_handler)
Definition u_websocket.c:2774
int ulfius_set_websocket_request(struct _u_request *request, const char *url, const char *websocket_protocol, const char *websocket_extensions)
Definition u_websocket.c:2396
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:1582
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:1482
int websocket_extension_client_match_deflate(const char *extension_server, void *user_data, void **context)
Definition u_websocket.c:2641
void ulfius_clear_websocket_message(struct _websocket_message *message)
Definition u_websocket.c:1652