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  #ifndef POLLRDHUP
50  #define POLLRDHUP 0x2000
51  #endif
52 #endif
53 
54 #include <pthread.h>
55 #include <microhttpd.h>
56 
57 #if defined(_WIN32) && !defined(U_DISABLE_WEBSOCKET)
58  #define U_DISABLE_WEBSOCKET
59 #endif
60 
61 #if (MHD_VERSION < 0x00095300) && !defined(U_DISABLE_WEBSOCKET)
62  #define U_DISABLE_WEBSOCKET
63 #endif
64 
66 #include <orcania.h>
67 
69 #ifndef U_DISABLE_YDER
70  #include <yder.h>
71 #else
72 
73 #define Y_LOG_MODE_NONE 0
74 #define Y_LOG_MODE_CONSOLE 0
75 #define Y_LOG_MODE_SYSLOG 0
76 #define Y_LOG_MODE_FILE 0
77 #define Y_LOG_MODE_JOURNALD 0
78 #define Y_LOG_MODE_CALLBACK 0
79 #define Y_LOG_MODE_CURRENT 0
80 
81 #define Y_LOG_LEVEL_NONE 0
82 #define Y_LOG_LEVEL_DEBUG 0
83 #define Y_LOG_LEVEL_INFO 0
84 #define Y_LOG_LEVEL_WARNING 0
85 #define Y_LOG_LEVEL_ERROR 0
86 #define Y_LOG_LEVEL_CURRENT 0
87 
88 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);
89 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);
90 void y_log_message(const unsigned long type, const char * message, ...);
91 int y_close_logs();
92 #endif
93 
94 #ifndef U_DISABLE_JANSSON
95 #include <jansson.h>
96 #endif
97 
103 #define ULFIUS_STREAM_BLOCK_SIZE_DEFAULT 1024
104 #define U_STREAM_END MHD_CONTENT_READER_END_OF_STREAM
105 #define U_STREAM_ERROR MHD_CONTENT_READER_END_WITH_ERROR
106 #define U_STREAM_SIZE_UNKOWN MHD_SIZE_UNKNOWN
107 
108 #define U_OK 0
109 #define U_ERROR 1
110 #define U_ERROR_MEMORY 2
111 #define U_ERROR_PARAMS 3
112 #define U_ERROR_LIBMHD 4
113 #define U_ERROR_LIBCURL 5
114 #define U_ERROR_NOT_FOUND 6
115 #define U_ERROR_DISCONNECTED 7
116 
117 #define U_CALLBACK_CONTINUE 0
118 #define U_CALLBACK_COMPLETE 1
119 #define U_CALLBACK_UNAUTHORIZED 2
120 #define U_CALLBACK_ERROR 3
121 
122 #define U_COOKIE_SAME_SITE_NONE 0
123 #define U_COOKIE_SAME_SITE_STRICT 1
124 #define U_COOKIE_SAME_SITE_LAX 2
125 
126 #define U_USE_IPV4 0x0001
127 #define U_USE_IPV6 0x0010
128 #define U_USE_ALL (U_USE_IPV4|U_USE_IPV6)
129 
130 #define U_SSL_VERIFY_PEER 0x0001
131 #define U_SSL_VERIFY_HOSTNAME 0x0010
132 
133 
137 typedef enum {
142 #if MHD_VERSION >= 0x00095208
143  U_OPT_NETWORK_TYPE = 4,
144 #endif
164 #ifndef U_DISABLE_JANSSON
166 #endif
167 #ifndef U_DISABLE_GNUTLS
171 #endif
175 } u_option;
176 
181 /*************
182  * Structures
183  *************/
184 
194 struct _u_map {
195  int nb_values; /* !< Values count */
196  char ** keys; /* !< Array of keys */
197  char ** values; /* !< Array of values */
198  size_t * lengths; /* !< Lengths of each values */
199 };
200 
205 struct _u_cookie {
206  char * key; /* !< key if the cookie */
207  char * value; /* !< value of the cookie */
208  char * expires; /* !< expiration date of the cookie */
209  unsigned int max_age; /* !< duration of the cookie in seconds */
210  char * domain; /* !< domain for the cookie */
211  char * path; /* !< url path for the cookie */
212  int secure; /* !< flag to set cookie secure or not */
213  int http_only; /* !< flag to set cookie for HTTP connections only or not */
214  int same_site; /* !< flag to set same_site option to the cookie */
215 };
216 
223 struct _u_request {
224  char * http_protocol; /* !< http protocol used (1.0 or 1.1) */
225  char * http_verb; /* !< http method (GET, POST, PUT, DELETE, etc.) */
226  char * http_url; /* !< full url used to call this callback function or full url to call when used in a ulfius_send_http_request */
227  char * url_path; /* !< url path only used to call this callback function (ex, if http_url is /path/?param=1, url_path is /path/) */
228  char * proxy; /* !<proxy address to use for outgoing connections, used by ulfius_send_http_request */
229 #if MHD_VERSION >= 0x00095208
230  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 */
231 #endif
232  int check_server_certificate; /* !< check server certificate and hostname, default true, used by ulfius_send_http_request */
233  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 */
234  int check_proxy_certificate; /* !< check proxy certificate and hostname, default true, used by ulfius_send_http_request, requires libcurl >= 7.52 */
235  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 */
236  int follow_redirect; /* !< follow url redirections, used by ulfius_send_http_request */
237  char * ca_path; /* !< specify a path to CA certificates instead of system path, used by ulfius_send_http_request */
238  unsigned long timeout; /* !< connection timeout used by ulfius_send_http_request, default is 0 */
239  struct sockaddr * client_address; /* !< IP address of the client */
240  char * auth_basic_user; /* !< basic authentication username */
241  char * auth_basic_password; /* !< basic authentication password */
242  struct _u_map * map_url; /* !< map containing the url variables, both from the route and the ?key=value variables */
243  struct _u_map * map_header; /* !< map containing the header variables */
244  struct _u_map * map_cookie; /* !< map containing the cookie variables */
245  struct _u_map * map_post_body; /* !< map containing the post body variables (if available) */
246  void * binary_body; /* !< raw body */
247  size_t binary_body_length; /* !< length of raw body */
248  unsigned int callback_position; /* !< position of the current callback function in the callback list, starts at 0 */
249 #ifndef U_DISABLE_GNUTLS
250  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 */
251  char * client_cert_file; /* !< path to client certificate file for sending http requests with certificate authentication, available only if GnuTLS support is enabled */
252  char * client_key_file; /* !< path to client key file for sending http requests with certificate authentication, available only if GnuTLS support is enabled */
253  char * client_key_password; /* !< password to unlock client key file, available only if GnuTLS support is enabled */
254 #endif
255 };
256 
263 struct _u_response {
264  long status; /* !< HTTP status code (200, 404, 500, etc) */
265  char * protocol; /* !< HTTP Protocol sent */
266  struct _u_map * map_header; /* !< map containing the header variables */
267  unsigned int nb_cookies; /* !< number of cookies sent */
268  struct _u_cookie * map_cookie; /* !< array of cookies sent */
269  char * auth_realm; /* !< realm to send to the client on authenticationb failed */
270  void * binary_body; /* !< raw binary content */
271  size_t binary_body_length; /* !< length of the binary_body */
272  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 */
273  void (* stream_callback_free) (void * stream_user_data); /* !< callback function to free data allocated for streaming */
274  uint64_t stream_size; /* !< size of the streamed data (U_STREAM_SIZE_UNKOWN if unknown) */
275  size_t stream_block_size; /* !< size of each block to be streamed, set according to your system */
276  void * stream_user_data; /* !< user defined data that will be available in your callback stream functions */
277  void * websocket_handle; /* !< handle for websocket extension */
278  void * shared_data; /* !< any data shared between callback functions, must be allocated and freed by the callback functions */
279  unsigned int timeout; /* !< Timeout in seconds to close the connection because of inactivity between the client and the server */
280 };
281 
288 struct _u_endpoint {
289  char * http_method; /* !< http verb (GET, POST, PUT, etc.) in upper case */
290  char * url_prefix; /* !< prefix for the url (optional) */
291  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 */
292  unsigned int priority; /* !< endpoint priority in descending order (0 is the higher priority) */
293  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. */
294  struct _u_response * response,
295  void * user_data);
296  void * user_data; /* !< pointer to a data or a structure that will be available in callback_function */
297 };
298 
305 struct _u_instance {
306  struct MHD_Daemon * mhd_daemon; /* !< pointer to the libmicrohttpd daemon */
307  int status; /* !< status of the current instance, status are U_STATUS_STOP, U_STATUS_RUNNING or U_STATUS_ERROR */
308  unsigned int port; /* !< port number to listen to */
309 #if MHD_VERSION >= 0x00095208
310  unsigned short network_type; /* !< Listen to ipv4 and or ipv6 connections, values available are U_USE_ALL, U_USE_IPV4 or U_USE_IPV6 */
311 #endif
312  struct sockaddr_in * bind_address; /* !< ipv4 address to listen to (optional) */
313  struct sockaddr_in6 * bind_address6; /* !< ipv6 address to listen to (optional) */
314  unsigned int timeout; /* !< Timeout to close the connection because of inactivity between the client and the server */
315  int nb_endpoints; /* !< Number of available endpoints */
316  char * default_auth_realm; /* !< Default realm on authentication error */
317  struct _u_endpoint * endpoint_list; /* !< List of available endpoints */
318  struct _u_endpoint * default_endpoint; /* !< Default endpoint if no other endpoint match the current url */
319  struct _u_map * default_headers; /* !< Default headers that will be added to all response->map_header */
320  size_t max_post_param_size; /* !< maximum size for a post parameter, 0 means no limit, default 0 */
321  size_t max_post_body_size; /* !< maximum size for the entire post body, 0 means no limit, default 0 */
322  void * websocket_handler; /* !< handler for the websocket structure */
323  int (* file_upload_callback) (const struct _u_request * request, /* !< callback function to manage file upload by blocks */
324  const char * key,
325  const char * filename,
326  const char * content_type,
327  const char * transfer_encoding,
328  const char * data,
329  uint64_t off,
330  size_t size,
331  void * cls);
332  void * file_upload_cls; /* !< any pointer to pass to the file_upload_callback function */
333  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 */
334  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 */
335 #ifndef U_DISABLE_GNUTLS
336  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 */
337 #endif
338 };
339 
349  struct MHD_PostProcessor * post_processor;
352  struct _u_request * request;
355 };
356 
357 /**********************************
358  * Instance functions declarations
359  **********************************/
360 
371 void u_free(void * data);
372 
393 int ulfius_init_instance(struct _u_instance * u_instance, unsigned int port, struct sockaddr_in * bind_address, const char * default_auth_realm);
394 
395 #if MHD_VERSION >= 0x00095208
396 
407 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);
408 #endif
409 
416 void ulfius_clean_instance(struct _u_instance * u_instance);
417 
425 int ulfius_start_framework(struct _u_instance * u_instance);
426 
436 int ulfius_start_secure_framework(struct _u_instance * u_instance, const char * key_pem, const char * cert_pem);
437 
438 #ifndef U_DISABLE_GNUTLS
439 
450 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);
451 #endif
452 
471 int ulfius_start_framework_with_mhd_options(struct _u_instance * u_instance, unsigned int mhd_flags, struct MHD_OptionItem * options);
472 
476 void mhd_request_completed (void *cls, struct MHD_Connection *connection, void **con_cls, enum MHD_RequestTerminationCode toe);
477 void * ulfius_uri_logger (void * cls, const char * uri);
478 
486 int ulfius_stop_framework(struct _u_instance * u_instance);
487 
509  int (* file_upload_callback) (const struct _u_request * request,
510  const char * key,
511  const char * filename,
512  const char * content_type,
513  const char * transfer_encoding,
514  const char * data,
515  uint64_t off,
516  size_t size,
517  void * cls),
518  void * cls);
519 
530 /***********************************
531  * Endpoints functions declarations
532  ***********************************/
533 
541 int ulfius_add_endpoint(struct _u_instance * u_instance, const struct _u_endpoint * u_endpoint);
542 
560 int ulfius_add_endpoint_by_val(struct _u_instance * u_instance,
561  const char * http_method,
562  const char * url_prefix,
563  const char * url_format,
564  unsigned int priority,
565  int (* callback_function)(const struct _u_request * request, // Input parameters (set by the framework)
566  struct _u_response * response, // Output parameters (set by the user)
567  void * user_data),
568  void * user_data);
569 
577 int ulfius_add_endpoint_list(struct _u_instance * u_instance, const struct _u_endpoint ** u_endpoint_list);
578 
588 int ulfius_remove_endpoint(struct _u_instance * u_instance, const struct _u_endpoint * u_endpoint);
589 
605 int ulfius_set_default_endpoint(struct _u_instance * u_instance,
606  int (* callback_function)(const struct _u_request * request, struct _u_response * response, void * user_data),
607  void * user_data);
608 
621 int ulfius_remove_endpoint_by_val(struct _u_instance * u_instance, const char * http_method, const char * url_prefix, const char * url_format);
622 
627 const struct _u_endpoint * ulfius_empty_endpoint();
628 
636 int ulfius_copy_endpoint(struct _u_endpoint * dest, const struct _u_endpoint * source);
637 
645 struct _u_endpoint * ulfius_duplicate_endpoint_list(const struct _u_endpoint * endpoint_list);
646 
652 void ulfius_clean_endpoint(struct _u_endpoint * endpoint);
653 
659 void ulfius_clean_endpoint_list(struct _u_endpoint * endpoint_list);
660 
668 int ulfius_equals_endpoints(const struct _u_endpoint * endpoint1, const struct _u_endpoint * endpoint2);
669 
680 #ifndef U_DISABLE_CURL
681 /********************************************
682  * Requests/Responses functions declarations
683  ********************************************/
684 
692 int ulfius_send_http_request(const struct _u_request * request, struct _u_response * response);
693 
704 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);
705 
724 int ulfius_send_smtp_email(const char * host,
725  const int port,
726  const int use_tls,
727  const int verify_certificate,
728  const char * user,
729  const char * password,
730  const char * from,
731  const char * to,
732  const char * cc,
733  const char * bcc,
734  const char * subject,
735  const char * mail_body);
736 
756 int ulfius_send_smtp_rich_email(const char * host,
757  const int port,
758  const int use_tls,
759  const int verify_certificate,
760  const char * user,
761  const char * password,
762  const char * from,
763  const char * to,
764  const char * cc,
765  const char * bcc,
766  const char * content_type,
767  const char * subject,
768  const char * mail_body);
769 #endif
770 
795 int ulfius_add_cookie_to_response(struct _u_response * response, const char * key, const char * value, const char * expires, const unsigned int max_age,
796  const char * domain, const char * path, const int secure, const int http_only);
797 
816 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,
817  const char * domain, const char * path, const int secure, const int http_only, const int same_site);
818 
837 int ulfius_add_header_to_response(struct _u_response * response, const char * key, const char * value);
838 
846 int ulfius_set_string_body_request(struct _u_request * request, const char * string_body);
847 
856 int ulfius_set_binary_body_request(struct _u_request * request, const char * binary_body, const size_t length);
857 
864 int ulfius_set_empty_body_request(struct _u_request * request);
865 
874 int ulfius_set_string_body_response(struct _u_response * response, const unsigned int status, const char * body);
875 
885 int ulfius_set_binary_body_response(struct _u_response * response, const unsigned int status, const char * body, const size_t length);
886 
894 int ulfius_set_empty_body_response(struct _u_response * response, const unsigned int status);
895 
918 int ulfius_set_stream_response(struct _u_response * response,
919  const unsigned int status,
920  ssize_t (* stream_callback) (void * stream_user_data, uint64_t offset, char * out_buf, size_t max),
921  void (* stream_callback_free) (void * stream_user_data),
922  uint64_t stream_size,
923  size_t stream_block_size,
924  void * stream_user_data);
925 
942 int ulfius_init_request(struct _u_request * request);
943 
952 int ulfius_clean_request(struct _u_request * request);
953 
960 int ulfius_clean_request_full(struct _u_request * request);
961 
969 int ulfius_copy_request(struct _u_request * dest, const struct _u_request * source);
970 
976 int ulfius_set_request_properties(struct _u_request * request, ...);
977 
984 int ulfius_init_response(struct _u_response * response);
985 
994 int ulfius_clean_response(struct _u_response * response);
995 
1002 int ulfius_clean_response_full(struct _u_response * response);
1003 
1011 int ulfius_copy_response(struct _u_response * dest, const struct _u_response * source);
1012 
1019 int ulfius_clean_cookie(struct _u_cookie * cookie);
1020 
1027 int ulfius_copy_cookie(struct _u_cookie * dest, const struct _u_cookie * source);
1028 
1035 struct _u_request * ulfius_duplicate_request(const struct _u_request * request);
1036 
1043 struct _u_response * ulfius_duplicate_response(const struct _u_response * response);
1044 
1050 int ulfius_set_response_properties(struct _u_response * response, ...);
1051 
1070 char * ulfius_url_decode(const char * str);
1071 
1080 char * ulfius_url_encode(const char * str);
1081 
1092 #ifndef U_DISABLE_JANSSON
1093 
1103 json_t * ulfius_get_json_body_request(const struct _u_request * request, json_error_t * json_error);
1104 
1112 int ulfius_set_json_body_request(struct _u_request * request, json_t * j_body);
1113 
1124 json_t * ulfius_get_json_body_response(struct _u_response * response, json_error_t * json_error);
1125 
1133 int ulfius_set_json_body_response(struct _u_response * response, const unsigned int status, const json_t * j_body);
1134 #endif
1135 
1146 /************************************************************************
1147  * _u_map declarations *
1148  * _u_map is a simple map structure that handles sets of key/value maps *
1149  ************************************************************************/
1150 
1157 int u_map_init(struct _u_map * u_map);
1158 
1164 int u_map_clean(struct _u_map * u_map);
1165 
1171 int u_map_clean_full(struct _u_map * u_map);
1172 
1178 int u_map_clean_enum(char ** array);
1179 
1185 const char ** u_map_enum_keys(const struct _u_map * u_map);
1186 
1192 const char ** u_map_enum_values(const struct _u_map * u_map);
1193 
1202 int u_map_has_key(const struct _u_map * u_map, const char * key);
1203 
1212 int u_map_has_value(const struct _u_map * u_map, const char * value);
1213 
1223 int u_map_has_value_binary(const struct _u_map * u_map, const char * value, size_t length);
1224 
1233 int u_map_has_key_case(const struct _u_map * u_map, const char * key);
1234 
1243 int u_map_has_value_case(const struct _u_map * u_map, const char * value);
1244 
1253 int u_map_put(struct _u_map * u_map, const char * key, const char * value);
1254 
1266 int u_map_put_binary(struct _u_map * u_map, const char * key, const char * value, uint64_t offset, size_t length);
1267 
1275 ssize_t u_map_get_length(const struct _u_map * u_map, const char * key);
1276 
1284 ssize_t u_map_get_case_length(const struct _u_map * u_map, const char * key);
1285 
1293 const char * u_map_get(const struct _u_map * u_map, const char * key);
1294 
1302 const char * u_map_get_case(const struct _u_map * u_map, const char * key);
1303 
1311 int u_map_remove_from_key(struct _u_map * u_map, const char * key);
1312 
1320 int u_map_remove_from_key_case(struct _u_map * u_map, const char * key);
1321 
1329 int u_map_remove_from_value(struct _u_map * u_map, const char * value);
1330 
1338 int u_map_remove_from_value_case(struct _u_map * u_map, const char * value);
1339 
1347 int u_map_remove_from_value_binary(struct _u_map * u_map, const char * key, size_t length);
1348 
1355 int u_map_remove_at(struct _u_map * u_map, const int index);
1356 
1363 struct _u_map * u_map_copy(const struct _u_map * source);
1364 
1372 int u_map_copy_into(struct _u_map * dest, const struct _u_map * source);
1373 
1380 int u_map_count(const struct _u_map * source);
1381 
1387 int u_map_empty(struct _u_map * u_map);
1388 
1399 #ifndef U_DISABLE_WEBSOCKET
1400 
1401 /**********************************
1402  * Websocket functions declarations
1403  **********************************/
1404 
1405 #define U_WEBSOCKET_USER_AGENT "Ulfius Websocket Client Framework"
1406 
1407 #define U_WEBSOCKET_MAGIC_STRING "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
1408 #define U_WEBSOCKET_UPGRADE_VALUE "websocket"
1409 #define U_WEBSOCKET_BAD_REQUEST_BODY "Error in websocket handshake, wrong parameters"
1410 #define U_WEBSOCKET_USEC_WAIT 50
1411 #define WEBSOCKET_MAX_CLOSE_TRY 10
1412 
1413 #define U_WEBSOCKET_BIT_FIN 0x80
1414 #define U_WEBSOCKET_MASK 0x80
1415 #define U_WEBSOCKET_LEN_MASK 0x7F
1416 #define U_WEBSOCKET_OPCODE_CONTINUE 0x00
1417 #define U_WEBSOCKET_OPCODE_TEXT 0x01
1418 #define U_WEBSOCKET_OPCODE_BINARY 0x02
1419 #define U_WEBSOCKET_OPCODE_CLOSE 0x08
1420 #define U_WEBSOCKET_OPCODE_PING 0x09
1421 #define U_WEBSOCKET_OPCODE_PONG 0x0A
1422 #define U_WEBSOCKET_OPCODE_CLOSED 0xFD
1423 #define U_WEBSOCKET_OPCODE_ERROR 0xFE
1424 #define U_WEBSOCKET_OPCODE_NONE 0xFF
1425 
1426 #define U_WEBSOCKET_NONE 0
1427 #define U_WEBSOCKET_SERVER 1
1428 #define U_WEBSOCKET_CLIENT 2
1429 
1430 #define U_WEBSOCKET_STATUS_OPEN 0
1431 #define U_WEBSOCKET_STATUS_CLOSE 1
1432 #define U_WEBSOCKET_STATUS_ERROR 2
1433 
1434 #define WEBSOCKET_RESPONSE_HTTP 0x0001
1435 #define WEBSOCKET_RESPONSE_UPGRADE 0x0002
1436 #define WEBSOCKET_RESPONSE_CONNECTION 0x0004
1437 #define WEBSOCKET_RESPONSE_ACCEPT 0x0008
1438 #define WEBSOCKET_RESPONSE_PROTCOL 0x0010
1439 #define WEBSOCKET_RESPONSE_EXTENSION 0x0020
1440 
1447 struct _websocket_manager {
1448  struct _websocket_message_list * message_list_incoming; /* !< list of incoming messages */
1449  struct _websocket_message_list * message_list_outcoming; /* !< list of outcoming messages */
1450  int connected; /* !< flag to know if the websocket is connected or not */
1451  int close_flag; /* !< flag to set before closing a websocket */
1452  MHD_socket mhd_sock; /* !< reference to libmicrohttpd's socket for websocket server */
1453  int tcp_sock; /* !< tcp socket for websocket client */
1454  int tls; /* !< set to 1 if the websocket is in a TLS socket */
1455  gnutls_session_t gnutls_session; /* !< GnuTLS session for websocket client */
1456  gnutls_certificate_credentials_t xcred; /* !< certificate credential used by GnuTLS */
1457  char * protocol; /* !< websocket protocol */
1458  char * extensions; /* !< websocket extension */
1459  pthread_mutex_t read_lock; /* !< mutex to read data in the socket */
1460  pthread_mutex_t write_lock; /* !< mutex to write data in the socket */
1461  pthread_mutex_t status_lock; /* !< mutex to broadcast new status */
1462  pthread_cond_t status_cond; /* !< condition to broadcast new status */
1463  struct pollfd fds;
1464  int type;
1465 };
1466 
1472 struct _websocket_message {
1473  time_t datestamp; /* !< date stamp of the message */
1474  uint8_t opcode; /* !< opcode for the message (string or binary) */
1475  uint8_t has_mask; /* !< does the message contain a mask? */
1476  uint8_t mask[4]; /* !< mask used if any */
1477  size_t data_len; /* !< length of the data */
1478  char * data; /* !< message data */
1479 };
1480 
1484 struct _websocket_message_list {
1485  struct _websocket_message ** list; /* !< messages list */
1486  size_t len; /* !< message list length */
1487 };
1488 
1493 struct _websocket {
1494  struct _u_instance * instance; /* !< reference to the ulfius instance if any */
1495  struct _u_request * request; /* !< refrence to the ulfius request of any */
1496  void (* websocket_manager_callback) (const struct _u_request * request, /* !< reference to a function called after the websocket handshake */
1497  struct _websocket_manager * websocket_manager,
1498  void * websocket_manager_user_data);
1499  void * websocket_manager_user_data; /* !< a user-defined reference that will be available in websocket_manager_callback */
1500  void (* websocket_incoming_message_callback) (const struct _u_request * request, /* !< reference to a function called each time a message arrives */
1501  struct _websocket_manager * websocket_manager,
1502  const struct _websocket_message * message,
1503  void * websocket_incoming_user_data);
1504  void * websocket_incoming_user_data; /* !< a user-defined reference that will be available in websocket_incoming_message_callback */
1505  void (* websocket_onclose_callback) (const struct _u_request * request, /* !< reference to a function called after the websocket connection ends */
1506  struct _websocket_manager * websocket_manager,
1507  void * websocket_onclose_user_data);
1508  void * websocket_onclose_user_data; /* !< a user-defined reference that will be available in websocket_onclose_callback */
1509  struct _websocket_manager * websocket_manager; /* !< refrence to the websocket manager if any */
1510  struct MHD_UpgradeResponseHandle * urh; /* !< reference used by libmicrohttpd to upgrade the connection */
1511 };
1512 
1516 struct _websocket_client_handler {
1517  struct _websocket * websocket; /* !< the websocket to use */
1518  struct _u_response * response; /* !< the response attached to the websocket */
1519 };
1520 
1521 /********************************/
1523 /********************************/
1524 
1534 int ulfius_websocket_send_message(struct _websocket_manager * websocket_manager,
1535  const uint8_t opcode,
1536  const uint64_t data_len,
1537  const char * data);
1538 
1550 int ulfius_websocket_send_fragmented_message(struct _websocket_manager * websocket_manager,
1551  const uint8_t opcode,
1552  const uint64_t data_len,
1553  const char * data,
1554  const uint64_t fragment_len);
1555 
1565 struct _websocket_message * ulfius_websocket_pop_first_message(struct _websocket_message_list * message_list);
1566 
1571 void ulfius_clear_websocket_message(struct _websocket_message * message);
1572 
1573 /********************************/
1575 /********************************/
1576 
1591 int ulfius_set_websocket_response(struct _u_response * response,
1592  const char * websocket_protocol,
1593  const char * websocket_extensions,
1594  void (* websocket_manager_callback) (const struct _u_request * request,
1595  struct _websocket_manager * websocket_manager,
1596  void * websocket_manager_user_data),
1597  void * websocket_manager_user_data,
1598  void (* websocket_incoming_message_callback) (const struct _u_request * request,
1599  struct _websocket_manager * websocket_manager,
1600  const struct _websocket_message * message,
1601  void * websocket_incoming_user_data),
1602  void * websocket_incoming_user_data,
1603  void (* websocket_onclose_callback) (const struct _u_request * request,
1604  struct _websocket_manager * websocket_manager,
1605  void * websocket_onclose_user_data),
1606  void * websocket_onclose_user_data);
1607 
1617 int ulfius_websocket_send_close_signal(struct _websocket_manager * websocket_manager);
1618 
1626 int ulfius_websocket_status(struct _websocket_manager * websocket_manager);
1627 
1636 int ulfius_websocket_wait_close(struct _websocket_manager * websocket_manager, unsigned int timeout);
1637 
1638 /********************************/
1640 /********************************/
1641 
1656  void (* websocket_manager_callback) (const struct _u_request * request,
1657  struct _websocket_manager * websocket_manager,
1658  void * websocket_manager_user_data),
1659  void * websocket_manager_user_data,
1660  void (* websocket_incoming_message_callback) (const struct _u_request * request,
1661  struct _websocket_manager * websocket_manager,
1662  const struct _websocket_message * message,
1663  void * websocket_incoming_user_data),
1664  void * websocket_incoming_user_data,
1665  void (* websocket_onclose_callback) (const struct _u_request * request,
1666  struct _websocket_manager * websocket_manager,
1667  void * websocket_onclose_user_data),
1668  void * websocket_onclose_user_data,
1669  struct _websocket_client_handler * websocket_client_handler,
1670  struct _u_response * response);
1676 int ulfius_websocket_client_connection_send_close_signal(struct _websocket_client_handler * websocket_client_handler);
1677 
1683 int ulfius_websocket_client_connection_close(struct _websocket_client_handler * websocket_client_handler);
1684 
1691 int ulfius_websocket_client_connection_status(struct _websocket_client_handler * websocket_client_handler);
1692 
1701 int ulfius_websocket_client_connection_wait_close(struct _websocket_client_handler * websocket_client_handler, unsigned int timeout);
1702 
1712 int ulfius_set_websocket_request(struct _u_request * request,
1713  const char * url,
1714  const char * websocket_protocol,
1715  const char * websocket_extensions);
1716 
1717 #endif
1718 
1720 #define ULFIUS_URL_SEPARATOR "/"
1721 #define ULFIUS_HTTP_ENCODING_JSON "application/json"
1722 #define ULFIUS_HTTP_HEADER_CONTENT "Content-Type"
1723 #define ULFIUS_HTTP_NOT_FOUND_BODY "Resource not found"
1724 #define ULFIUS_HTTP_ERROR_BODY "Server Error"
1725 
1726 #define ULFIUS_COOKIE_ATTRIBUTE_EXPIRES "Expires"
1727 #define ULFIUS_COOKIE_ATTRIBUTE_MAX_AGE "Max-Age"
1728 #define ULFIUS_COOKIE_ATTRIBUTE_DOMAIN "Domain"
1729 #define ULFIUS_COOKIE_ATTRIBUTE_PATH "Path"
1730 #define ULFIUS_COOKIE_ATTRIBUTE_SECURE "Secure"
1731 #define ULFIUS_COOKIE_ATTRIBUTE_HTTPONLY "HttpOnly"
1732 
1733 #define ULFIUS_POSTBUFFERSIZE 65536
1734 
1735 #define U_STATUS_STOP 0
1736 #define U_STATUS_RUNNING 1
1737 #define U_STATUS_ERROR 2
1738 
1739 #ifndef U_DISABLE_WEBSOCKET
1740 
1744 struct _websocket_handle {
1745  char * websocket_protocol; /* !< protocol for the websocket */
1746  char * websocket_extensions; /* !< extensions for the websocket */
1747  void (* websocket_manager_callback) (const struct _u_request * request, /* !< callback function for working with the websocket */
1748  struct _websocket_manager * websocket_manager,
1749  void * websocket_manager_user_data);
1750  void * websocket_manager_user_data; /* !< user-defined data that will be handled to websocket_manager_callback */
1751  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 */
1752  struct _websocket_manager * websocket_manager,
1753  const struct _websocket_message * message,
1754  void * websocket_incoming_user_data);
1755  void * websocket_incoming_user_data; /* !< user-defined data that will be handled to websocket_incoming_message_callback */
1756  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 */
1757  struct _websocket_manager * websocket_manager,
1758  void * websocket_onclose_user_data);
1759  void * websocket_onclose_user_data; /* !< user-defined data that will be handled to websocket_onclose_callback */
1760 };
1761 
1765 struct _websocket_handler {
1766  size_t nb_websocket_active; /* !< number of active websocket */
1767  struct _websocket ** websocket_active; /* !< array of active websocket */
1768  pthread_mutex_t websocket_close_lock; /* !< mutex to broadcast close signal */
1769  pthread_cond_t websocket_close_cond; /* !< condition to broadcast close signal */
1770  int pthread_init;
1771 };
1772 
1773 #endif // U_DISABLE_WEBSOCKET
1774 
1785 #ifndef U_DISABLE_GNUTLS
1786 /*
1787  * ulfius_export_client_certificate_pem
1788  * Exports the client certificate using PEM format
1789  * @param request struct _u_request used
1790  * @return the certificate in PEM format
1791  * returned value must be u_free'd after use
1792  */
1793 char * ulfius_export_client_certificate_pem(const struct _u_request * request);
1794 
1795 /*
1796  * ulfius_import_client_certificate_pem
1797  * Imports the client certificate using PEM format
1798  * @param request struct _u_request used
1799  * @param str_cert client certificate in PEM format
1800  * @return U_OK on success
1801  */
1802 int ulfius_import_client_certificate_pem(struct _u_request * request, const char * str_cert);
1803 
1804 #endif // U_DISABLE_GNUTLS
1805 
1810 #ifdef __cplusplus
1811 }
1812 #endif
1813 
1814 #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:150
_u_instance::endpoint_list
struct _u_endpoint * endpoint_list
Definition: ulfius.h:317
connection_info_struct
Definition: ulfius.h:347
ulfius_stop_framework
int ulfius_stop_framework(struct _u_instance *u_instance)
Definition: ulfius.c:1112
u_map_init
int u_map_init(struct _u_map *u_map)
Definition: u_map.c:38
u_map_empty
int u_map_empty(struct _u_map *u_map)
Definition: u_map.c:627
_u_instance::mhd_response_copy_data
int mhd_response_copy_data
Definition: ulfius.h:333
u_map_has_key
int u_map_has_key(const struct _u_map *u_map, const char *key)
Definition: u_map.c:143
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:173
_u_request::proxy
char * proxy
Definition: ulfius.h:228
u_map_get_case
const char * u_map_get_case(const struct _u_map *u_map, const char *key)
Definition: u_map.c:505
ulfius_equals_endpoints
int ulfius_equals_endpoints(const struct _u_endpoint *endpoint1, const struct _u_endpoint *endpoint2)
Definition: ulfius.c:1364
_u_response::stream_size
uint64_t stream_size
Definition: ulfius.h:274
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:1399
U_OPT_AUTH_BASIC_USER
@ U_OPT_AUTH_BASIC_USER
basic authentication username, expected option value type: const char *
Definition: ulfius.h:152
_u_instance::file_upload_cls
void * file_upload_cls
Definition: ulfius.h:332
_u_request::url_path
char * url_path
Definition: ulfius.h:227
_u_map
Definition: ulfius.h:194
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:543
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:154
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:168
_u_instance::mhd_daemon
struct MHD_Daemon * mhd_daemon
Definition: ulfius.h:306
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:976
u_map_enum_values
const char ** u_map_enum_values(const struct _u_map *u_map)
Definition: u_map.c:134
ulfius_clean_instance
void ulfius_clean_instance(struct _u_instance *u_instance)
Definition: ulfius.c:1524
_u_map::values
char ** values
Definition: ulfius.h:197
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:145
_u_response::auth_realm
char * auth_realm
Definition: ulfius.h:269
u_map_copy_into
int u_map_copy_into(struct _u_map *dest, const struct _u_map *source)
Definition: u_map.c:592
connection_info_struct::has_post_processor
int has_post_processor
Definition: ulfius.h:350
ulfius_url_decode
char * ulfius_url_decode(const char *str)
Definition: ulfius.c:1784
_u_instance::port
unsigned int port
Definition: ulfius.h:308
ulfius_uri_logger
void * ulfius_uri_logger(void *cls, const char *uri)
Definition: ulfius.c:201
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:1634
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:569
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:147
_u_response::timeout
unsigned int timeout
Definition: ulfius.h:279
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:159
_u_response::stream_callback
ssize_t(* stream_callback)(void *stream_user_data, uint64_t offset, char *out_buf, size_t max)
Definition: ulfius.h:272
_u_endpoint
Contains all informations needed for an endpoint.
Definition: ulfius.h:288
_u_instance::default_auth_realm
char * default_auth_realm
Definition: ulfius.h:316
u_map_get
const char * u_map_get(const struct _u_map *u_map, const char *key)
Definition: u_map.c:448
ulfius_add_endpoint_list
int ulfius_add_endpoint_list(struct _u_instance *u_instance, const struct _u_endpoint **u_endpoint_list)
Definition: ulfius.c:1265
_u_instance::websocket_handler
void * websocket_handler
Definition: ulfius.h:322
_u_instance::bind_address
struct sockaddr_in * bind_address
Definition: ulfius.h:312
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:471
_u_instance::timeout
unsigned int timeout
Definition: ulfius.h:314
ulfius_import_client_certificate_pem
int ulfius_import_client_certificate_pem(struct _u_request *request, const char *str_cert)
Definition: u_request.c:892
connection_info_struct::callback_first_iteration
int callback_first_iteration
Definition: ulfius.h:351
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:149
u_map_clean
int u_map_clean(struct _u_map *u_map)
Definition: u_map.c:75
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:592
ulfius_start_framework
int ulfius_start_framework(struct _u_instance *u_instance)
Definition: ulfius.c:959
_u_map::nb_values
int nb_values
Definition: ulfius.h:195
_u_request::client_key_file
char * client_key_file
Definition: ulfius.h:252
_u_request::check_server_certificate_flag
int check_server_certificate_flag
Definition: ulfius.h:233
ulfius_websocket_client_connection_close
int ulfius_websocket_client_connection_close(struct _websocket_client_handler *websocket_client_handler)
Definition: u_websocket.c:1675
_u_request::callback_position
unsigned int callback_position
Definition: ulfius.h:248
_u_instance::default_endpoint
struct _u_endpoint * default_endpoint
Definition: ulfius.h:318
u_map_put
int u_map_put(struct _u_map *u_map, const char *key, const char *value)
Definition: u_map.c:186
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:174
U_OPT_STATUS
@ U_OPT_STATUS
HTTP response status code (200, 404, 500, etc), expected option value type: long.
Definition: ulfius.h:172
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:169
_u_request::timeout
unsigned long timeout
Definition: ulfius.h:238
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:162
_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:323
_u_instance::use_client_cert_auth
int use_client_cert_auth
Definition: ulfius.h:336
_u_response::binary_body_length
size_t binary_body_length
Definition: ulfius.h:271
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:1750
_u_request::follow_redirect
int follow_redirect
Definition: ulfius.h:236
u_map_enum_keys
const char ** u_map_enum_keys(const struct _u_map *u_map)
Definition: u_map.c:126
connection_info_struct::u_instance
struct _u_instance * u_instance
Definition: ulfius.h:348
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:160
u_map_has_value_case
int u_map_has_value_case(const struct _u_map *u_map, const char *value)
Definition: u_map.c:488
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:153
_u_request::auth_basic_user
char * auth_basic_user
Definition: ulfius.h:240
u_map_remove_from_key
int u_map_remove_from_key(struct _u_map *u_map, const char *key)
Definition: u_map.c:292
mhd_request_completed
void mhd_request_completed(void *cls, struct MHD_Connection *connection, void **con_cls, enum MHD_RequestTerminationCode toe)
Definition: ulfius.c:278
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:1101
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:1146
_u_request::map_url
struct _u_map * map_url
Definition: ulfius.h:242
ulfius_websocket_status
int ulfius_websocket_status(struct _websocket_manager *websocket_manager)
Definition: u_websocket.c:1413
_u_map::keys
char ** keys
Definition: ulfius.h:196
_u_response::websocket_handle
void * websocket_handle
Definition: ulfius.h:277
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:1025
ulfius_set_empty_body_response
int ulfius_set_empty_body_response(struct _u_response *response, const unsigned int status)
Definition: u_response.c:618
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:200
_u_endpoint::priority
unsigned int priority
Definition: ulfius.h:292
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:163
_u_endpoint::url_prefix
char * url_prefix
Definition: ulfius.h:290
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:148
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:319
_u_response::stream_block_size
size_t stream_block_size
Definition: ulfius.h:275
ulfius_websocket_send_close_signal
int ulfius_websocket_send_close_signal(struct _websocket_manager *websocket_manager)
Definition: u_websocket.c:1399
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:1499
ulfius_clean_endpoint
void ulfius_clean_endpoint(struct _u_endpoint *endpoint)
Definition: ulfius.c:1185
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:156
_u_response
definition of the parameters available in a struct _u_response
Definition: ulfius.h:263
_u_request::map_cookie
struct _u_map * map_cookie
Definition: ulfius.h:244
_u_request::check_proxy_certificate_flag
int check_proxy_certificate_flag
Definition: ulfius.h:235
_u_request::check_server_certificate
int check_server_certificate
Definition: ulfius.h:232
_u_instance::check_utf8
int check_utf8
Definition: ulfius.h:334
_u_instance::default_headers
struct _u_map * default_headers
Definition: ulfius.h:319
_u_request::client_cert
gnutls_x509_crt_t client_cert
Definition: ulfius.h:250
_u_instance::nb_endpoints
int nb_endpoints
Definition: ulfius.h:315
_u_response::protocol
char * protocol
Definition: ulfius.h:265
_u_request::check_proxy_certificate
int check_proxy_certificate
Definition: ulfius.h:234
ulfius_clean_endpoint_list
void ulfius_clean_endpoint_list(struct _u_endpoint *endpoint_list)
Definition: ulfius.c:1200
_u_request::binary_body_length
size_t binary_body_length
Definition: ulfius.h:247
_u_response::stream_user_data
void * stream_user_data
Definition: ulfius.h:276
ulfius_websocket_pop_first_message
struct _websocket_message * ulfius_websocket_pop_first_message(struct _websocket_message_list *message_list)
Definition: u_websocket.c:1158
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:354
_u_request::map_header
struct _u_map * map_header
Definition: ulfius.h:243
u_map_clean_full
int u_map_clean_full(struct _u_map *u_map)
Definition: u_map.c:95
_u_endpoint::http_method
char * http_method
Definition: ulfius.h:289
_u_map::lengths
size_t * lengths
Definition: ulfius.h:198
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:170
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:158
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:1712
u_map_count
int u_map_count(const struct _u_map *source)
Definition: u_map.c:614
U_OPT_HTTP_VERB
@ U_OPT_HTTP_VERB
http method (GET, POST, PUT, DELETE, etc.), expected option value type: const char *
Definition: ulfius.h:139
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:1345
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:1085
U_OPT_NONE
@ U_OPT_NONE
Empty option to complete a ulfius_set_request_properties or ulfius_set_request_properties.
Definition: ulfius.h:138
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:157
_u_instance::status
int status
Definition: ulfius.h:307
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:784
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:1457
ulfius_add_endpoint
int ulfius_add_endpoint(struct _u_instance *u_instance, const struct _u_endpoint *u_endpoint)
Definition: ulfius.c:1218
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:1434
_u_request::map_post_body
struct _u_map * map_post_body
Definition: ulfius.h:245
ulfius_clear_websocket_message
void ulfius_clear_websocket_message(struct _websocket_message *message)
Definition: u_websocket.c:1180
ulfius_remove_endpoint
int ulfius_remove_endpoint(struct _u_instance *u_instance, const struct _u_endpoint *u_endpoint)
Definition: ulfius.c:1291
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:1501
_u_response::map_header
struct _u_map * map_header
Definition: ulfius.h:266
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:381
u_map_remove_from_value
int u_map_remove_from_value(struct _u_map *u_map, const char *value)
Definition: u_map.c:346
_u_request::http_protocol
char * http_protocol
Definition: ulfius.h:224
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:639
_u_request
definition of the parameters available in a struct _u_request
Definition: ulfius.h:223
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:141
_u_response::nb_cookies
unsigned int nb_cookies
Definition: ulfius.h:267
u_option
u_option
Definition: ulfius.h:137
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:161
connection_info_struct::request
struct _u_request * request
Definition: ulfius.h:352
ulfius_duplicate_endpoint_list
struct _u_endpoint * ulfius_duplicate_endpoint_list(const struct _u_endpoint *endpoint_list)
Definition: ulfius.c:1164
_u_endpoint::user_data
void * user_data
Definition: ulfius.h:296
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:155
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:146
_u_instance::bind_address6
struct sockaddr_in6 * bind_address6
Definition: ulfius.h:313
_u_request::http_verb
char * http_verb
Definition: ulfius.h:225
u_map_clean_enum
int u_map_clean_enum(char **array)
Definition: u_map.c:108
_u_request::client_cert_file
char * client_cert_file
Definition: ulfius.h:251
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:151
u_map_remove_at
int u_map_remove_at(struct _u_map *u_map, const int index)
Definition: u_map.c:408
_u_response::stream_callback_free
void(* stream_callback_free)(void *stream_user_data)
Definition: ulfius.h:273
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:189
connection_info_struct::map_url_initial
struct _u_map map_url_initial
Definition: ulfius.h:354
_u_request::binary_body
void * binary_body
Definition: ulfius.h:246
_u_request::http_url
char * http_url
Definition: ulfius.h:226
_u_instance
Contains the needed data for an ulfius instance to work.
Definition: ulfius.h:305
_u_request::client_key_password
char * client_key_password
Definition: ulfius.h:253
_u_request::auth_basic_password
char * auth_basic_password
Definition: ulfius.h:241
u_map_copy
struct _u_map * u_map_copy(const struct _u_map *source)
Definition: u_map.c:562
_u_response::map_cookie
struct _u_cookie * map_cookie
Definition: ulfius.h:268
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:1546
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:165
_u_request::client_address
struct sockaddr * client_address
Definition: ulfius.h:239
_u_instance::max_post_param_size
size_t max_post_param_size
Definition: ulfius.h:320
u_map_get_length
ssize_t u_map_get_length(const struct _u_map *u_map, const char *key)
Definition: u_map.c:524
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:169
ulfius_copy_endpoint
int ulfius_copy_endpoint(struct _u_endpoint *dest, const struct _u_endpoint *source)
Definition: ulfius.c:1142
u_free
void u_free(void *data)
Definition: ulfius.c:1662
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:140
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:1662
u_map_has_value
int u_map_has_value(const struct _u_map *u_map, const char *value)
Definition: u_map.c:160
_u_request::ca_path
char * ca_path
Definition: ulfius.h:237
_u_response::binary_body
void * binary_body
Definition: ulfius.h:270
_u_response::shared_data
void * shared_data
Definition: ulfius.h:278
connection_info_struct::post_processor
struct MHD_PostProcessor * post_processor
Definition: ulfius.h:349
_u_response::status
long status
Definition: ulfius.h:264
connection_info_struct::max_post_param_size
size_t max_post_param_size
Definition: ulfius.h:353
ulfius_send_http_request
int ulfius_send_http_request(const struct _u_request *request, struct _u_response *response)
Definition: u_send_request.c:157
ulfius_websocket_wait_close
int ulfius_websocket_wait_close(struct _websocket_manager *websocket_manager, unsigned int timeout)
Definition: u_websocket.c:1427
ulfius_empty_endpoint
const struct _u_endpoint * ulfius_empty_endpoint()
Definition: ulfius.c:1349
_u_instance::max_post_body_size
size_t max_post_body_size
Definition: ulfius.h:321
_u_endpoint::callback_function
int(* callback_function)(const struct _u_request *request, struct _u_response *response, void *user_data)
Definition: ulfius.h:293
ulfius_websocket_client_connection_status
int ulfius_websocket_client_connection_status(struct _websocket_client_handler *websocket_client_handler)
Definition: u_websocket.c:1698
_u_endpoint::url_format
char * url_format
Definition: ulfius.h:291