From 14b554f620ee1d09164d59f7ac725d58fa77378d Mon Sep 17 00:00:00 2001
From: Arie Peterson <arie@greenhost.nl>
Date: Tue, 13 Jun 2017 14:28:20 +0200
Subject: [PATCH] Add includes and libraries

---
 includes/orcania.h          |  215 ++++++
 includes/ulfius.h           | 1224 +++++++++++++++++++++++++++++++++++
 includes/yder.h             |   60 ++
 libraries/liborcania.so     |  Bin 0 -> 18648 bytes
 libraries/liborcania.so.1.1 |  Bin 0 -> 18648 bytes
 libraries/libulfius.so      |  Bin 0 -> 63088 bytes
 libraries/libulfius.so.2.1  |  Bin 0 -> 63088 bytes
 libraries/libyder.so        |  Bin 0 -> 11408 bytes
 libraries/libyder.so.2.0    |  Bin 0 -> 11408 bytes
 9 files changed, 1499 insertions(+)
 create mode 100644 includes/orcania.h
 create mode 100644 includes/ulfius.h
 create mode 100644 includes/yder.h
 create mode 100755 libraries/liborcania.so
 create mode 100755 libraries/liborcania.so.1.1
 create mode 100755 libraries/libulfius.so
 create mode 100755 libraries/libulfius.so.2.1
 create mode 100755 libraries/libyder.so
 create mode 100755 libraries/libyder.so.2.0

diff --git a/includes/orcania.h b/includes/orcania.h
new file mode 100644
index 0000000..c1f3599
--- /dev/null
+++ b/includes/orcania.h
@@ -0,0 +1,215 @@
+/**
+ * 
+ * Orcania library
+ * 
+ * Different functions for different purposes but that can be shared between
+ * other projects
+ * 
+ */
+
+#ifndef __ORCANIA_H__
+#define __ORCANIA_H__
+
+#ifndef U_DISABLE_JANSSON
+#include <jansson.h>
+#endif
+
+#define ORCANIA_VERSION 1.1
+/**
+ * char * str_replace(const char * source, char * old, char * new)
+ * replace all occurences of old by new in the string source
+ * return a char * with the new value
+ * return NULL on error
+ * returned value must be free'd after use
+ */
+char * str_replace(const char * source, const char * str_old, const char * str_new);
+
+/**
+ * o_strdup
+ * a modified strdup function that don't crash when source is NULL, instead return NULL
+ * Returned value must be free'd after use
+ */
+char * o_strdup(const char * source);
+
+/**
+ * o_strndup
+ * a modified strndup function that don't crash when source is NULL, instead return NULL
+ * Returned value must be free'd after use
+ */
+char * o_strndup(const char * source, size_t len);
+
+/**
+ * o_strcmp
+ * a modified strcmp function that don't crash when p1 is NULL or p2 us NULL
+ */
+int o_strcmp(const char * p1, const char * p2);
+
+/**
+ * o_strncmp
+ * a modified strncmp function that don't crash when p1 is NULL or p2 us NULL
+ */
+int o_strncmp(const char * p1, const char * p2, size_t n);
+
+/**
+ * o_strcpy
+ * a modified strcpy function that don't crash when p1 is NULL or p2 us NULL
+ */
+char * o_strcpy(char * p1, const char * p2);
+
+/**
+ * o_strncpy
+ * a modified strncpy function that don't crash when p1 is NULL or p2 us NULL
+ */
+char * o_strncpy(char * p1, const char * p2, size_t n);
+
+/**
+ * o_strcasecmp
+ * a modified strcasecmp function that don't crash when p1 is NULL or p2 us NULL
+ */
+int o_strcasecmp(const char * p1, const char * p2);
+
+/**
+ * o_strncasecmp
+ * a modified strncasecmp function that don't crash when p1 is NULL or p2 us NULL
+ */
+int o_strncasecmp(const char * p1, const char * p2, size_t n);
+
+/**
+ * o_strstr
+ * a modified strstr function that don't crash when haystack is NULL or needle us NULL
+ */
+char * o_strstr(const char * haystack, const char * needle);
+
+/**
+ * o_strnstr
+ * a modified strnstr function that don't crash when haystack is NULL or needle us NULL
+ */
+char * o_strnstr(const char * haystack, const char * needle, size_t len);
+
+/**
+ * o_strcasestr
+ * a modified strcasestr function that don't crash when haystack is NULL or needle us NULL
+ */
+char * o_strcasestr(const char * haystack, const char * needle);
+
+/**
+ * o_strchr
+ * a modified strchr function that don't crash when haystack is NULL
+ */
+char * o_strchr(const char * haystack, int c);
+
+/**
+ * o_strrchr
+ * a modified strrchr function that don't crash when haystack is NULL
+ */
+char * o_strrchr(const char * haystack, int c);
+
+/**
+ * o_strlen
+ * a modified version of strlen that don't crash when s is NULL
+ */
+size_t o_strlen(const char * s);
+
+/**
+ * char * msprintf(const char * message, ...)
+ * Implementation of sprintf that return a malloc'd char * with the string construction
+ * because life is too short to use 3 lines instead of 1
+ * but don't forget to free the returned value after use!
+ */
+char * msprintf(const char * message, ...);
+
+/**
+ * Split a string into an array of strings using separator string
+ * return the number of elements to be returned, 0 on error
+ * if return_array is not NULL, set the returned array in it
+ * return_array is an array of char * ending with a NULL value
+ * return_array must be free'd after use
+ * you can use free_string_array to free return_array
+ */
+int split_string(const char * string, const char * separator, char *** return_array);
+
+/**
+ * Clean an array of strings
+ */
+void free_string_array(char ** array);
+
+/**
+ * Check if an array of string has a specified value
+ */
+int string_array_has_value(const char ** array, const char * needle);
+
+/**
+ * Check if an array of string has a specified trimmed value
+ */
+int string_array_has_trimmed_value(const char ** array, const char * needle);
+
+/**
+ * Remove string of beginning and ending whitespaces
+ */
+char * trimwhitespace(char * str);
+
+#ifndef U_DISABLE_JANSSON
+/**
+ * json_t * json_search(json_t * haystack, json_t * needle)
+ * jansson library addon
+ * This function could be removed if y pull request is accepted in jansson official repository:
+ * https://github.com/akheron/jansson/pull/265
+ * Look for an occurence of needle within haystack
+ * If needle is present in haystack, return the reference to the json_t * that is equal to needle
+ * If needle is not found, return NULL
+ */
+json_t * json_search(json_t * haystack, json_t * needle);
+
+/**
+ * Check if the result json object has a "result" element that is equal to value
+ */
+int check_result_value(json_t * result, const int value);
+#endif
+
+/**
+ * Memory functions
+ */
+/* C89 allows these to be macros */
+#undef malloc
+#undef realloc
+#undef free
+
+typedef void *(*o_malloc_t)(size_t);
+typedef void *(*o_realloc_t)(void *, size_t);
+typedef void (*o_free_t)(void *);
+
+void * o_malloc(size_t size);
+void * o_realloc(void * ptr, size_t size);
+void o_free(void * ptr);
+void o_set_alloc_funcs(o_malloc_t malloc_fn, o_realloc_t realloc_fn, o_free_t free_fn);
+void o_get_alloc_funcs(o_malloc_t * malloc_fn, o_realloc_t * realloc_fn, o_free_t * free_fn);
+
+/**
+ * Base64 encode and decode functions
+ */
+
+/**
+ * o_base64_encode - Base64 encode
+ * @src: Data to be encoded
+ * @len: Length of the data to be encoded
+ * @out: Pointer to output variable
+ * @out_len: Pointer to output length variable
+ * Returns: 1 on success, 0 on failure
+ *
+ * The nul terminator is not included in out_len.
+ */
+int o_base64_encode(const unsigned char * src, size_t len, unsigned char * out, size_t * out_len);
+
+/**
+ * o_base64_decode - Base64 decode
+ * @src: Data to be decoded
+ * @len: Length of the data to be decoded
+ * @out: Pointer to output variable
+ * @out_len: Pointer to output length variable
+ * Returns: 1 on success, 0 on failure
+ *
+ * The nul terminator is not included in out_len.
+ */
+int o_base64_decode(const unsigned char *src, size_t len, unsigned char * out, size_t * out_len);
+
+#endif
diff --git a/includes/ulfius.h b/includes/ulfius.h
new file mode 100644
index 0000000..f7da3eb
--- /dev/null
+++ b/includes/ulfius.h
@@ -0,0 +1,1224 @@
+/**
+ * 
+ * Ulfius Framework
+ * 
+ * REST framework library
+ * 
+ * ulfius.h: public structures and functions declarations
+ * 
+ * Copyright 2015-2017 Nicolas Mora <mail@babelouest.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation;
+ * version 2.1 of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+ * 
+ */
+
+#ifndef __ULFIUS_H__
+#define __ULFIUS_H__
+
+/** External dependencies **/
+#include <sys/poll.h>
+#include <microhttpd.h>
+
+#if (MHD_VERSION < 0x00095300) && !defined(U_DISABLE_WEBSOCKET)
+  #define U_DISABLE_WEBSOCKET
+#endif
+
+/** Angharad libraries **/
+#include <yder.h>
+#include <orcania.h>
+
+#ifndef U_DISABLE_JANSSON
+#include <jansson.h>
+#endif
+
+#define ULFIUS_STREAM_BLOCK_SIZE_DEFAULT 1024
+#define U_STREAM_END MHD_CONTENT_READER_END_OF_STREAM
+#define U_STREAM_ERROR MHD_CONTENT_READER_END_WITH_ERROR
+#define U_STREAM_SIZE_UNKOWN MHD_SIZE_UNKNOWN
+
+#define U_OK                 0 // No error
+#define U_ERROR              1 // Error
+#define U_ERROR_MEMORY       2 // Error in memory allocation
+#define U_ERROR_PARAMS       3 // Error in input parameters
+#define U_ERROR_LIBMHD       4 // Error in libmicrohttpd execution
+#define U_ERROR_LIBCURL      5 // Error in libcurl execution
+#define U_ERROR_NOT_FOUND    6 // Something was not found
+
+#define ULFIUS_VERSION 2.1
+
+#define U_CALLBACK_CONTINUE     0
+#define U_CALLBACK_COMPLETE     1
+#define U_CALLBACK_UNAUTHORIZED 2
+#define U_CALLBACK_ERROR        3
+
+/*************
+ * Structures
+ *************/
+
+/**
+ * struct _u_map
+ */
+struct _u_map {
+  int      nb_values;
+  char  ** keys;
+  char  ** values;
+  size_t * lengths;
+};
+
+/**
+ * struct _u_cookie
+ * the structure containing the response cookie parameters
+ */
+struct _u_cookie {
+  char * key;
+  char * value;
+  char * expires;
+  uint   max_age;
+  char * domain;
+  char * path;
+  int    secure;
+  int    http_only;
+};
+
+/**
+ * 
+ * Structure of request parameters
+ * 
+ * Contains request data
+ * http_protocol:             http protocol used (1.0 or 1.1)
+ * http_verb:                 http method (GET, POST, PUT, DELETE, etc.), use '*' to match all http methods
+ * http_url:                  url used to call this callback function or full url to call when used in a ulfius_send_http_request
+ * proxy:                     proxy address to use for outgoing connections, used by ulfius_send_http_request
+ * check_server_certificate:  do not check server certificate and hostname if false (default true), used by ulfius_send_http_request
+ * timeout                    connection timeout used by ulfius_send_http_request, default is 0
+ * client_address:            IP address of the client
+ * auth_basic_user:           basic authtication username
+ * auth_basic_password:       basic authtication password
+ * map_url:                   map containing the url variables, both from the route and the ?key=value variables
+ * map_header:                map containing the header variables
+ * map_cookie:                map containing the cookie variables
+ * map_post_body:             map containing the post body variables (if available)
+ * binary_body:               pointer to raw body
+ * binary_body_length:        length of raw body
+ * 
+ */
+struct _u_request {
+  char *               http_protocol;
+  char *               http_verb;
+  char *               http_url;
+	char *               proxy;
+  int                  check_server_certificate;
+  long                 timeout;
+  struct sockaddr *    client_address;
+  char *               auth_basic_user;
+  char *               auth_basic_password;
+  struct _u_map *      map_url;
+  struct _u_map *      map_header;
+  struct _u_map *      map_cookie;
+  struct _u_map *      map_post_body;
+  void *               binary_body;
+  size_t               binary_body_length;
+};
+
+/**
+ * 
+ * Structure of response parameters
+ * 
+ * Contains response data that must be set by the user
+ * status:                              HTTP status code (200, 404, 500, etc)
+ * protocol:                            HTTP Protocol sent
+ * map_header:                          map containing the header variables
+ * nb_cookies:                          number of cookies sent
+ * map_cookie:                          array of cookies sent
+ * auth_realm:                          realm to send to the client on authenticationb failed
+ * binary_body:                         a void * containing a raw binary content
+ * binary_body_length:                  the length of the binary_body
+ * stream_callback:                     callback function to stream data in response body
+ * stream_callback_free:                callback function to free data allocated for streaming
+ * stream_size:                         size of the streamed data (U_STREAM_SIZE_UNKOWN if unknown)
+ * stream_block_size:                   size of each block to be streamed, set according to your system
+ * stream_user_data:                    user defined data that will be available in your callback stream functions
+ * websocket_handle:                    handle for websocket extension
+ * shared_data:                         any data shared between callback functions, must be allocated and freed by the callback functions
+ * 
+ */
+struct _u_response {
+  long               status;
+  char             * protocol;
+  struct _u_map    * map_header;
+  unsigned int       nb_cookies;
+  struct _u_cookie * map_cookie;
+  char             * auth_realm;
+  void             * binary_body;
+  size_t             binary_body_length;
+  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;
+  void             * websocket_handle;
+  void *             shared_data;
+};
+
+/**
+ * 
+ * Structure of an endpoint
+ * 
+ * Contains all informations needed for an endpoint
+ * http_method:       http verb (GET, POST, PUT, etc.) in upper case
+ * url_prefix:        prefix for the url (optional)
+ * 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
+ * priority:          endpoint priority in descending order (0 is the higher priority)
+ * callback_function: a pointer to a function that will be executed each time the endpoint is called
+ *                    you must declare the function as described.
+ * user_data:         a pointer to a data or a structure that will be available in callback_function
+ * 
+ */
+struct _u_endpoint {
+  char * http_method;
+  char * url_prefix;
+  char * url_format;
+  uint   priority;
+  int (* callback_function)(const struct _u_request * request, // Input parameters (set by the framework)
+                            struct _u_response * response,     // Output parameters (set by the user)
+                            void * user_data);
+  void * user_data;
+};
+
+/**
+ * 
+ * Structure of an instance
+ * 
+ * Contains the needed data for an ulfius instance to work
+ * 
+ * mhd_daemon:            pointer to the libmicrohttpd daemon
+ * status:                status of the current instance, status are U_STATUS_STOP, U_STATUS_RUNNING or U_STATUS_ERROR
+ * port:                  port number to listen to
+ * bind_address:          ip address to listen to (optional)
+ * nb_endpoints:          Number of available endpoints
+ * default_auth_realm:    Default realm on authentication error
+ * endpoint_list:         List of available endpoints
+ * default_endpoint:      Default endpoint if no other endpoint match the current url
+ * default_headers:       Default headers that will be added to all response->map_header
+ * max_post_param_size:   maximum size for a post parameter, 0 means no limit, default 0
+ * max_post_body_size:    maximum size for the entire post body, 0 means no limit, default 0
+ * 
+ */
+struct _u_instance {
+  struct MHD_Daemon          *  mhd_daemon;
+  int                           status;
+  uint                          port;
+  struct sockaddr_in          * bind_address;
+  int                           nb_endpoints;
+  char                        * default_auth_realm;
+  struct _u_endpoint          * endpoint_list;
+  struct _u_endpoint          * default_endpoint;
+  struct _u_map               * default_headers;
+  size_t                        max_post_param_size;
+  size_t                        max_post_body_size;
+  void                        * websocket_handler;
+};
+
+/**
+ * Structures used to facilitate data manipulations (internal)
+ */
+struct connection_info_struct {
+  struct MHD_PostProcessor * post_processor;
+  int                        has_post_processor;
+  int                        callback_first_iteration;
+  struct _u_request *        request;
+  size_t                     max_post_param_size;
+  struct _u_map              map_url_initial;
+};
+
+/**********************************
+ * Instance functions declarations
+ **********************************/
+
+/**
+ * ulfius_init_instance
+ * 
+ * Initialize a struct _u_instance * with default values
+ * return U_OK on success
+ */
+int ulfius_init_instance(struct _u_instance * u_instance, uint port, struct sockaddr_in * bind_address, const char * default_auth_realm);
+
+/**
+ * ulfius_clean_instance
+ * 
+ * Clean memory allocated by a struct _u_instance *
+ */
+void ulfius_clean_instance(struct _u_instance * u_instance);
+
+/**
+ * ulfius_start_framework
+ * Initializes the framework and run the webservice based on the parameters given
+ * 
+ * u_instance:    pointer to a struct _u_instance that describe its port and bind address
+ * return U_OK on success
+ */
+int ulfius_start_framework(struct _u_instance * u_instance);
+
+/**
+ * ulfius_start_secure_framework
+ * Initializes the framework and run the webservice based on the parameters given using an HTTPS connection
+ * 
+ * u_instance:    pointer to a struct _u_instance that describe its port and bind address
+ * key_pem:       private key for the server
+ * cert_pem:      server certificate
+ * return U_OK on success
+ */
+int ulfius_start_secure_framework(struct _u_instance * u_instance, const char * key_pem, const char * cert_pem);
+
+/**
+ * ulfius_stop_framework
+ * 
+ * Stop the webservice
+ * u_instance:    pointer to a struct _u_instance that describe its port and bind address
+ * return U_OK on success
+ */
+int ulfius_stop_framework(struct _u_instance * u_instance);
+
+/***********************************
+ * Endpoints functions declarations
+ ***********************************/
+
+/**
+ * Add a struct _u_endpoint * to the specified u_instance
+ * Can be done during the execution of the webservice for injection
+ * u_instance: pointer to a struct _u_instance that describe its port and bind address
+ * u_endpoint: pointer to a struct _u_endpoint that will be copied in the u_instance endpoint_list
+ * return U_OK on success
+ */
+int ulfius_add_endpoint(struct _u_instance * u_instance, const struct _u_endpoint * u_endpoint);
+
+/**
+ * Add a struct _u_endpoint * to the specified u_instance with its values specified
+ * Can be done during the execution of the webservice for injection
+ * u_instance: pointer to a struct _u_instance that describe its port and bind address
+ * http_method:       http verb (GET, POST, PUT, etc.) in upper case
+ * url_prefix:        prefix for the url (optional)
+ * 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
+ * priority:          endpoint priority in descending order (0 is the higher priority)
+ * callback_function: a pointer to a function that will be executed each time the endpoint is called
+ *                    you must declare the function as described.
+ * user_data:         a pointer to a data or a structure that will be available in callback_function
+ * return U_OK on success
+ */
+int ulfius_add_endpoint_by_val(struct _u_instance * u_instance,
+                               const char * http_method,
+                               const char * url_prefix,
+                               const char * url_format,
+                               uint priority,
+                               int (* callback_function)(const struct _u_request * request, // Input parameters (set by the framework)
+                                                         struct _u_response * response,     // Output parameters (set by the user)
+                                                         void * user_data),
+                               void * user_data);
+
+/**
+ * Add a struct _u_endpoint * list to the specified u_instance
+ * Can be done during the execution of the webservice for injection
+ * u_instance: pointer to a struct _u_instance that describe its port and bind address
+ * u_endpoint_list: pointer to an array of struct _u_endpoint ending with a ulfius_empty_endpoint() that will be copied in the u_instance endpoint_list
+ * return U_OK on success
+ */
+int ulfius_add_endpoint_list(struct _u_instance * u_instance, const struct _u_endpoint ** u_endpoint_list);
+
+/**
+ * Remove a struct _u_endpoint * from the specified u_instance
+ * Can be done during the execution of the webservice for injection
+ * u_instance: pointer to a struct _u_instance that describe its port and bind address
+ * u_endpoint: pointer to a struct _u_endpoint that will be removed in the u_instance endpoint_list
+ * The parameters _u_endpoint.http_method, _u_endpoint.url_prefix and _u_endpoint.url_format are strictly compared for the match
+ * If no endpoint is found, return U_ERROR_NOT_FOUND
+ * return U_OK on success
+ */
+int ulfius_remove_endpoint(struct _u_instance * u_instance, const struct _u_endpoint * u_endpoint);
+
+/**
+ * ulfius_set_default_endpoint
+ * Set the default endpoint
+ * This endpoint will be called if no endpoint match the url called
+ * u_instance: pointer to a struct _u_instance that describe its port and bind address
+ * auth_function:     a pointer to a function that will be executed prior to the callback for authentication
+ *                    you must declare the function as described.
+ * auth_data:         a pointer to a data or a structure that will be available in auth_function
+ * auth_realm:        realm value for authentication
+ * callback_function: a pointer to a function that will be executed each time the endpoint is called
+ *                    you must declare the function as described.
+ * user_data:         a pointer to a data or a structure that will be available in callback_function
+ * to remove a default endpoint, call ulfius_set_default_endpoint with NULL parameter for callback_function
+ * return U_OK on success
+ */
+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);
+
+/**
+ * Remove a struct _u_endpoint * from the specified u_instance
+ * using the specified values used to identify an endpoint
+ * Can be done during the execution of the webservice for injection
+ * u_instance: pointer to a struct _u_instance that describe its port and bind address
+ * http_method: http_method used by the endpoint
+ * url_prefix: url_prefix used by the endpoint
+ * url_format: url_format used by the endpoint
+ * The parameters _u_endpoint.http_method, _u_endpoint.url_prefix and _u_endpoint.url_format are strictly compared for the match
+ * If no endpoint is found, return U_ERROR_NOT_FOUND
+ * return U_OK on success
+ */
+int ulfius_remove_endpoint_by_val(struct _u_instance * u_instance, const char * http_method, const char * url_prefix, const char * url_format);
+
+/**
+ * ulfius_empty_endpoint
+ * return an empty endpoint that goes at the end of an endpoint list
+ */
+const struct _u_endpoint * ulfius_empty_endpoint();
+
+/**
+ * ulfius_copy_endpoint
+ * return a copy of an endpoint with duplicate values
+ */
+int ulfius_copy_endpoint(struct _u_endpoint * dest, const struct _u_endpoint * source);
+
+/**
+ * u_copy_endpoint_list
+ * return a copy of an endpoint list with duplicate values
+ * returned value must be free'd after use
+ */
+struct _u_endpoint * ulfius_duplicate_endpoint_list(const struct _u_endpoint * endpoint_list);
+
+/**
+ * ulfius_clean_endpoint
+ * free allocated memory by an endpoint
+ */
+void ulfius_clean_endpoint(struct _u_endpoint * endpoint);
+
+/**
+ * ulfius_clean_endpoint_list
+ * free allocated memory by an endpoint list
+ */
+void ulfius_clean_endpoint_list(struct _u_endpoint * endpoint_list);
+
+/**
+ * ulfius_equals_endpoints
+ * Compare 2 endpoints and return true if their method, prefix and format are the same or if both are NULL
+ */
+int ulfius_equals_endpoints(const struct _u_endpoint * endpoint1, const struct _u_endpoint * endpoint2);
+
+#ifndef U_DISABLE_CURL
+/********************************************
+ * Requests/Responses functions declarations
+ ********************************************/
+
+/**
+ * ulfius_send_http_request
+ * Send a HTTP request and store the result into a _u_response
+ * return U_OK on success
+ */
+int ulfius_send_http_request(const struct _u_request * request, struct _u_response * response);
+
+/**
+ * ulfius_send_http_streaming_request
+ * Send a HTTP request and store the result into a _u_response
+ * Except for the body which will be available using write_body_function in the write_body_data
+ * return U_OK on success
+ */
+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);
+
+/**
+ * ulfius_send_smtp_email
+ * Send an email using libcurl
+ * email is plain/text and UTF8 charset
+ * host: smtp server host name
+ * port: tcp port number (optional, 0 for default)
+ * use_tls: true if the connection is tls secured
+ * verify_certificate: true if you want to disable the certificate verification on a tls server
+ * user: connection user name (optional, NULL: no user name)
+ * password: connection password (optional, NULL: no password)
+ * from: from address (mandatory)
+ * to: to recipient address (mandatory)
+ * cc: cc recipient address (optional, NULL: no cc)
+ * bcc: bcc recipient address (optional, NULL: no bcc)
+ * subject: email subject (mandatory)
+ * mail_body: email body (mandatory)
+ * return U_OK on success
+ */
+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);
+#endif
+
+/**
+ * ulfius_add_cookie_to_header
+ * add a cookie to the cookie map
+ * return U_OK on success
+ */
+int ulfius_add_cookie_to_response(struct _u_response * response, const char * key, const char * value, const char * expires, const uint max_age, 
+                      const char * domain, const char * path, const int secure, const int http_only);
+
+/**
+ * ulfius_add_header_to_response
+ * add a header to the response
+ * return U_OK on success
+ */
+int ulfius_add_header_to_response(struct _u_response * response, const char * key, const char * value);
+
+/**
+ * ulfius_set_string_body_response
+ * Add a string body to a response
+ * body must end with a '\0' character
+ * return U_OK on success
+ */
+int ulfius_set_string_body_response(struct _u_response * response, const uint status, const char * body);
+
+/**
+ * ulfius_set_binary_body_response
+ * Add a binary body to a response
+ * return U_OK on success
+ */
+int ulfius_set_binary_body_response(struct _u_response * response, const uint status, const char * body, const size_t length);
+
+/**
+ * ulfius_set_empty_body_response
+ * Set an empty response with only a status
+ * return U_OK on success
+ */
+int ulfius_set_empty_body_response(struct _u_response * response, const uint status);
+
+/**
+ * ulfius_set_stream_response
+ * Set an stream response with a status
+ * return U_OK on success
+ */
+int ulfius_set_stream_response(struct _u_response * response, 
+                                const uint 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);
+
+/**
+ * ulfius_init_request
+ * Initialize a request structure by allocating inner elements
+ * return U_OK on success
+ */
+int ulfius_init_request(struct _u_request * request);
+
+/**
+ * ulfius_clean_request
+ * clean the specified request's inner elements
+ * user must free the parent pointer if needed after clean
+ * or use ulfius_clean_request_full
+ * return U_OK on success
+ */
+int ulfius_clean_request(struct _u_request * request);
+
+/**
+ * ulfius_clean_request_full
+ * clean the specified request and all its elements
+ * return U_OK on success
+ */
+int ulfius_clean_request_full(struct _u_request * request);
+
+/**
+ * ulfius_init_response
+ * Initialize a response structure by allocating inner elements
+ * return U_OK on success
+ */
+int ulfius_init_response(struct _u_response * response);
+
+/**
+ * ulfius_clean_response
+ * clean the specified response's inner elements
+ * user must free the parent pointer if needed after clean
+ * or use ulfius_clean_response_full
+ * return U_OK on success
+ */
+int ulfius_clean_response(struct _u_response * response);
+
+/**
+ * ulfius_clean_response_full
+ * clean the specified response and all its elements
+ * return U_OK on success
+ */
+int ulfius_clean_response_full(struct _u_response * response);
+
+/**
+ * ulfius_copy_response
+ * Copy the source response elements into the des response
+ * return U_OK on success
+ */
+int ulfius_copy_response(struct _u_response * dest, const struct _u_response * source);
+
+/**
+ * ulfius_clean_cookie
+ * clean the cookie's elements
+ * return U_OK on success
+ */
+int ulfius_clean_cookie(struct _u_cookie * cookie);
+
+/**
+ * Copy the cookie source elements into dest elements
+ * return U_OK on success
+ */
+int ulfius_copy_cookie(struct _u_cookie * dest, const struct _u_cookie * source);
+
+/**
+ * create a new request based on the source elements
+ * returned value must be cleaned after use
+ */
+struct _u_request * ulfius_duplicate_request(const struct _u_request * request);
+
+/**
+ * create a new response based on the source elements
+ * return value must be cleaned after use
+ */
+struct _u_response * ulfius_duplicate_response(const struct _u_response * response);
+
+#ifndef U_DISABLE_JANSSON
+/**
+ * ulfius_get_json_body_request
+ * Get JSON structure from the request body if the request is valid
+ */
+json_t * ulfius_get_json_body_request(const struct _u_request * request, json_error_t * json_error);
+
+/**
+ * ulfius_set_json_body_request
+ * Add a json_t body to a request
+ * return U_OK on success
+ */
+int ulfius_set_json_body_request(struct _u_request * request, json_t * body);
+
+/**
+ * ulfius_set_json_body_response
+ * Add a json_t body to a response
+ * return U_OK on success
+ */
+int ulfius_set_json_body_response(struct _u_response * response, const uint status, const json_t * body);
+
+/**
+ * ulfius_get_json_body_response
+ * Get JSON structure from the response body if the request is valid
+ */
+json_t * ulfius_get_json_body_response(struct _u_response * response, json_error_t * json_error);
+#endif
+
+/************************************************************************
+ * _u_map declarations                                                  *  
+ * _u_map is a simple map structure that handles sets of key/value maps *
+ ************************************************************************/
+
+/**
+ * initialize a struct _u_map
+ * this function MUST be called after a declaration or allocation
+ * return U_OK on success
+ */
+int u_map_init(struct _u_map * map);
+
+/**
+ * free the struct _u_map's inner components
+ * return U_OK on success
+ */
+int u_map_clean(struct _u_map * u_map);
+
+/**
+ * free the struct _u_map and its components
+ * return U_OK on success
+ */
+int u_map_clean_full(struct _u_map * u_map);
+
+/**
+ * free an enum return by functions u_map_enum_keys or u_map_enum_values
+ * return U_OK on success
+ */
+int u_map_clean_enum(char ** array);
+
+/**
+ * returns an array containing all the keys in the struct _u_map
+ * return an array of char * ending with a NULL element
+ */
+const char ** u_map_enum_keys(const struct _u_map * u_map);
+
+/**
+ * returns an array containing all the values in the struct _u_map
+ * return an array of char * ending with a NULL element
+ */
+const char ** u_map_enum_values(const struct _u_map * u_map);
+
+/**
+ * return true if the sprcified u_map contains the specified key
+ * false otherwise
+ * search is case sensitive
+ */
+int u_map_has_key(const struct _u_map * u_map, const char * key);
+
+/**
+ * return true if the sprcified u_map contains the specified value
+ * false otherwise
+ * search is case sensitive
+ */
+int u_map_has_value(const struct _u_map * u_map, const char * value);
+
+/**
+ * return true if the sprcified u_map contains the specified value up until the specified length
+ * false otherwise
+ * search is case sensitive
+ */
+int u_map_has_value_binary(const struct _u_map * u_map, const char * value, size_t length);
+
+/**
+ * return true if the sprcified u_map contains the specified key
+ * false otherwise
+ * search is case insensitive
+ */
+int u_map_has_key_case(const struct _u_map * u_map, const char * key);
+
+/**
+ * return true if the sprcified u_map contains the specified value
+ * false otherwise
+ * search is case insensitive
+ */
+int u_map_has_value_case(const struct _u_map * u_map, const char * value);
+
+/**
+ * add the specified key/value pair into the specified u_map
+ * if the u_map already contains a pair with the same key, replace the value
+ * return U_OK on success
+ */
+int u_map_put(struct _u_map * u_map, const char * key, const char * value);
+
+/**
+ * add the specified key/binary value pair into the specified u_map
+ * if the u_map already contains a pair with the same key,
+ * replace the value at the specified offset with the specified length
+ * return U_OK on success
+ */
+int u_map_put_binary(struct _u_map * u_map, const char * key, const char * value, uint64_t offset, size_t length);
+
+/**
+ * get the value length corresponding to the specified key in the u_map
+ * return -1 if no match found
+ * search is case sensitive
+ */
+ssize_t u_map_get_length(const struct _u_map * u_map, const char * key);
+
+/**
+ * get the value length corresponding to the specified key in the u_map
+ * return -1 if no match found
+ * search is case insensitive
+ */
+ssize_t u_map_get_case_length(const struct _u_map * u_map, const char * key);
+
+/**
+ * get the value corresponding to the specified key in the u_map
+ * return NULL if no match found
+ * search is case sensitive
+ */
+const char * u_map_get(const struct _u_map * u_map, const char * key);
+
+/**
+ * get the value corresponding to the specified key in the u_map
+ * return NULL if no match found
+ * search is case insensitive
+ */
+const char * u_map_get_case(const struct _u_map * u_map, const char * key);
+
+/**
+ * remove an pair key/value that has the specified key
+ * return U_OK on success, U_NOT_FOUND if key was not found, error otherwise
+ */
+int u_map_remove_from_key(struct _u_map * u_map, const char * key);
+
+/**
+ * remove all pairs key/value that has the specified key (case insensitive search)
+ * return U_OK on success, U_NOT_FOUND if key was not found, error otherwise
+ */
+int u_map_remove_from_key_case(struct _u_map * u_map, const char * key);
+
+/**
+ * remove all pairs key/value that has the specified value
+ * return U_OK on success, U_NOT_FOUND if key was not found, error otherwise
+ */
+int u_map_remove_from_value(struct _u_map * u_map, const char * value);
+
+/**
+ * remove all pairs key/value that has the specified value (case insensitive search)
+ * return U_OK on success, U_NOT_FOUND if key was not found, error otherwise
+ */
+int u_map_remove_from_value_case(struct _u_map * u_map, const char * value);
+
+/**
+ * remove all pairs key/value that has the specified value up until the specified length
+ * return U_OK on success, U_NOT_FOUND if key was not found, error otherwise
+ */
+int u_map_remove_from_value_binary(struct _u_map * u_map, const char * key, size_t length);
+
+/**
+ * remove the pair key/value at the specified index
+ * return U_OK on success, U_NOT_FOUND if index is out of bound, error otherwise
+ */
+int u_map_remove_at(struct _u_map * u_map, const int index);
+
+/**
+ * Create an exact copy of the specified struct _u_map
+ * return a reference to the copy, NULL otherwise
+ * returned value must be free'd after use
+ */
+struct _u_map * u_map_copy(const struct _u_map * source);
+
+/**
+ * Copy all key/values pairs of source into dest
+ * If key is already present in dest, it's overwritten
+ * return U_OK on success, error otherwise
+ */
+int u_map_copy_into(struct _u_map * dest, const struct _u_map * source);
+
+/**
+ * Return the number of key/values pair in the specified struct _u_map
+ * Return -1 on error
+ */
+int u_map_count(const struct _u_map * source);
+
+/**
+ * Empty a struct u_map of all its elements
+ * return U_OK on success, error otherwise
+ */
+int u_map_empty(struct _u_map * u_map);
+
+#ifndef U_DISABLE_WEBSOCKET
+/**********************************
+ * Websocket functions declarations
+ **********************************/
+
+#define U_WEBSOCKET_MAGIC_STRING     "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
+#define U_WEBSOCKET_UPGRADE_VALUE    "websocket"
+#define U_WEBSOCKET_BAD_REQUEST_BODY "Error in websocket handshake, wrong parameters"
+#define U_WEBSOCKET_USEC_WAIT        50
+#define WEBSOCKET_MAX_CLOSE_TRY      10
+
+#define U_WEBSOCKET_BIT_FIN         0x80
+#define U_WEBSOCKET_HAS_MASK        0x80
+#define U_WEBSOCKET_LEN_MASK        0x7F
+#define U_WEBSOCKET_OPCODE_CONTINUE 0x00
+#define U_WEBSOCKET_OPCODE_TEXT     0x01
+#define U_WEBSOCKET_OPCODE_BINARY   0x01
+#define U_WEBSOCKET_OPCODE_CLOSE    0x08
+#define U_WEBSOCKET_OPCODE_PING     0x09
+#define U_WEBSOCKET_OPCODE_PONG     0x0A
+#define U_WEBSOCKET_OPCODE_CLOSED   0xFD
+#define U_WEBSOCKET_OPCODE_ERROR    0xFE
+#define U_WEBSOCKET_OPCODE_NONE     0xFF
+
+/**
+ * Websocket manager structure
+ * contains among other things the socket
+ * the status (open, closed), and the list of incoming and outcoming messages
+ * Used on public callback functions
+ */
+struct _websocket_manager {
+  struct _websocket_message_list * message_list_incoming;
+  struct _websocket_message_list * message_list_outcoming;
+  int connected;
+  int closing;
+  int manager_closed;
+  MHD_socket sock;
+  pthread_mutex_t read_lock;
+  pthread_mutex_t write_lock;
+  struct pollfd fds;
+};
+
+/**
+ * websocket message structure
+ * contains all the data of a websocket message
+ * and the timestamp of when it was sent of received
+ */
+struct _websocket_message {
+  time_t datestamp;
+  uint8_t opcode;
+  uint8_t has_mask;
+  uint8_t mask[4];
+  uint64_t data_len;
+  char * data;
+};
+
+struct _websocket_message_list {
+  struct _websocket_message ** list;
+  size_t len;
+};
+
+/**
+ * websocket structure
+ * contains all the data of the websocket
+ */
+struct _websocket {
+  struct _u_instance               * instance;
+  struct _u_request                * request;
+  char                             * websocket_protocol;
+  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;
+  int                                tls;
+  struct _websocket_manager        * websocket_manager;
+  struct MHD_UpgradeResponseHandle * urh;
+};
+
+/**
+ * Set a websocket in the response
+ * You must set at least websocket_manager_callback or websocket_incoming_message_callback
+ * @Parameters
+ * response: struct _u_response to send back the websocket initialization, mandatory
+ * websocket_protocol: list of protocols, separated by a comma, or NULL if all protocols are accepted
+ * websocket_extensions: list of extensions, separated by a comma, or NULL if all extensions are accepted
+ * websocket_manager_callback: callback function called right after the handshake acceptance, optional
+ * websocket_manager_user_data: any data that will be given to the websocket_manager_callback, optional
+ * websocket_incoming_message_callback: callback function called on each incoming complete message, optional
+ * websocket_incoming_user_data: any data that will be given to the websocket_incoming_message_callback, optional
+ * websocket_onclose_callback: callback function called right before closing the websocket, must be complete for the websocket to close
+ * websocket_onclose_user_data: any data that will be given to the websocket_onclose_callback, optional
+ * @Return value: U_OK on success
+ */
+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);
+
+/**
+ * Send a message in the websocket
+ * Return U_OK on success
+ */
+int ulfius_websocket_send_message(struct _websocket_manager * websocket_manager,
+                                  const uint8_t opcode,
+                                  const uint64_t data_len,
+                                  const char * data);
+
+/**
+ * Return the first message of the message list
+ * Return NULL if message_list has no message
+ * Returned value must be cleared after use
+ */
+struct _websocket_message * ulfius_websocket_pop_first_message(struct _websocket_message_list * message_list);
+
+/**
+ * Clear data of a websocket message
+ */
+void ulfius_clear_websocket_message(struct _websocket_message * message);
+
+#endif
+
+/**
+ * free data allocated by ulfius functions
+ */
+void u_free(void * data);
+
+/**********************************
+ * Internal functions declarations
+ **********************************/
+
+/**
+ * ulfius_validate_instance
+ * return true if u_instance has valid parameters, false otherwise
+ */
+int ulfius_validate_instance(const struct _u_instance * u_instance);
+/**
+ * ulfius_is_valid_endpoint
+ * return true if the endpoind has valid parameters
+ */
+int ulfius_is_valid_endpoint(const struct _u_endpoint * endpoint, int to_delete);
+
+/**
+ * ulfius_validate_endpoint_list
+ * return true if endpoint_list has valid parameters, false otherwise
+ */
+int ulfius_validate_endpoint_list(const struct _u_endpoint * endpoint_list, int nb_endpoints);
+
+/**
+ * ulfius_webservice_dispatcher
+ * function executed by libmicrohttpd every time an HTTP call is made
+ * return MHD_NO on error
+ */
+int ulfius_webservice_dispatcher (void *cls, struct MHD_Connection *connection,
+                                  const char *url, const char *method,
+                                  const char *version, const char *upload_data,
+                                  size_t *upload_data_size, void **con_cls);
+/**
+ * mhd_iterate_post_data
+ * function used to iterate post parameters
+ * return MHD_NO on error
+ */
+int mhd_iterate_post_data (void *coninfo_cls, enum MHD_ValueKind kind, const char *key,
+                      const char *filename, const char *content_type,
+                      const char *transfer_encoding, const char *data, uint64_t off,
+                      size_t size);
+
+/**
+ * mhd_request_completed
+ * function used to clean data allocated after a web call is complete
+ */
+void mhd_request_completed (void *cls, struct MHD_Connection *connection,
+                        void **con_cls, enum MHD_RequestTerminationCode toe);
+
+/**
+ * ulfius_split_url
+ * return an array of char based on the url words
+ * returned value must be u_free'd after use
+ */
+char ** ulfius_split_url(const char * prefix, const char * url);
+
+/**
+ * Sort an array of struct _u_endpoint * using bubble sort algorithm
+ */
+void sort_endpoint_list (struct _u_endpoint ** endpoint_list, int length);
+
+/**
+ * ulfius_endpoint_match
+ * return the endpoint array matching the url called with the proper http method
+ * the returned array always has its last value to NULL
+ * return NULL on memory error
+ */
+struct _u_endpoint ** ulfius_endpoint_match(const char * method, const char * url, struct _u_endpoint * endpoint_list);
+
+/**
+ * ulfius_url_format_match
+ * return true if splitted_url matches splitted_url_format
+ * false otherwise
+ */
+int ulfius_url_format_match(const char ** splitted_url, const char ** splitted_url_format);
+
+/**
+ * ulfius_parse_url
+ * fills map with the keys/values defined in the url that are described in the endpoint format url
+ * return U_OK on success
+ */
+int ulfius_parse_url(const char * url, const struct _u_endpoint * endpoint, struct _u_map * map);
+
+/**
+ * ulfius_set_response_header
+ * adds headers defined in the response_map_header to the response
+ * return the number of added headers, -1 on error
+ */
+int ulfius_set_response_header(struct MHD_Response * response, const struct _u_map * response_map_header);
+
+/**
+ * ulfius_set_response_cookie
+ * adds cookies defined in the response_map_cookie
+ * return the number of added headers, -1 on error
+ */
+int ulfius_set_response_cookie(struct MHD_Response * mhd_response, const struct _u_response * response);
+
+/**
+ * Add a cookie in the cookie map as defined in the RFC 6265
+ * Returned value must be u_free'd after use
+ */
+char * ulfius_get_cookie_header(const struct _u_cookie * cookie);
+
+/** Macro values **/
+#define ULFIUS_URL_SEPARATOR       "/"
+#define ULFIUS_HTTP_ENCODING_JSON  "application/json"
+#define ULFIUS_HTTP_HEADER_CONTENT "Content-Type"
+#define ULFIUS_HTTP_NOT_FOUND_BODY "Resource not found"
+#define ULFIUS_HTTP_ERROR_BODY     "Server Error"
+
+#define ULFIUS_COOKIE_ATTRIBUTE_EXPIRES  "Expires"
+#define ULFIUS_COOKIE_ATTRIBUTE_MAX_AGE  "Max-Age"
+#define ULFIUS_COOKIE_ATTRIBUTE_DOMAIN   "Domain"
+#define ULFIUS_COOKIE_ATTRIBUTE_PATH     "Path"
+#define ULFIUS_COOKIE_ATTRIBUTE_SECURE   "Secure"
+#define ULFIUS_COOKIE_ATTRIBUTE_HTTPONLY "HttpOnly"
+
+#define ULFIUS_POSTBUFFERSIZE 1024
+
+#define U_STATUS_STOP     0
+#define U_STATUS_RUNNING  1
+#define U_STATUS_ERROR    2
+
+#ifndef U_DISABLE_WEBSOCKET
+
+/**
+ * websocket_manager_callback:          callback function for working with the websocket
+ * websocket_manager_user_data:         user-defined data that will be handled to websocket_manager_callback
+ * websocket_incoming_message_callback: callback function that will be called every time a message arrives from the client in the websocket
+ * websocket_incoming_user_data:        user-defined data that will be handled to websocket_incoming_message_callback
+ * websocket_onclose_callback:          callback function that will be called if the websocket is open while the program calls ulfius_stop_framework
+ * websocket_onclose_user_data:         user-defined data that will be handled to websocket_onclose_callback
+ */
+struct _websocket_handle {
+  char             * websocket_protocol;
+  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;
+};
+
+struct _websocket_handler {
+  size_t                        nb_websocket_active;
+  struct _websocket          ** websocket_active;
+  pthread_mutex_t               websocket_close_lock;
+  pthread_cond_t                websocket_close_cond;
+  int                           pthread_init;
+};
+
+/**
+ * Websocket callback function for MHD
+ * Starts the websocket manager if set,
+ * then sets a listening message loop
+ * Complete the callback when the websocket is closed
+ * The websocket can be closed by the client, the manager, the program, or on network disconnect
+ */
+void ulfius_start_websocket_cb (void *cls,
+            struct MHD_Connection *connection,
+            void *con_cls,
+            const char *extra_in,
+            size_t extra_in_size,
+            MHD_socket sock,
+            struct MHD_UpgradeResponseHandle *urh);
+
+/**
+ * Workaround to make sure a message, as long as it can be is complete sent
+ */
+void ulfius_websocket_send_all(MHD_socket sock, const uint8_t * data, size_t len);
+
+/**
+ * Centralise socket reading in this function
+ * so if options or check must be done, it's done here instead of each read call
+ */
+size_t ulfius_websocket_recv_all(MHD_socket sock, uint8_t * data, size_t len);
+
+/**
+ * Generates a handhshake answer from the key given in parameter
+ */
+int ulfius_generate_handshake_answer(const char * key, char * out_digest);
+
+/**
+ * Close the websocket
+ */
+int ulfius_close_websocket(struct _websocket * websocket);
+
+/**
+ * Return a match list between two list of items
+ * If match is NULL, then return source duplicate
+ * Returned value must be u_free'd after use
+ */
+char * ulfius_check_list_match(const char * source, const char * match);
+
+/**
+ * Initialize a websocket message list
+ * Return U_OK on success
+ */
+int ulfius_init_websocket_message_list(struct _websocket_message_list * message_list);
+
+/**
+ * Clear data of a websocket message list
+ */
+void ulfius_clear_websocket_message_list(struct _websocket_message_list * message_list);
+
+/**
+ * Append a message in a message list
+ * Return U_OK on success
+ */
+int ulfius_push_websocket_message(struct _websocket_message_list * message_list, struct _websocket_message * message);
+
+/**
+ * Clear data of a websocket
+ */
+int ulfius_clear_websocket(struct _websocket * websocket);
+
+/**
+ * Clear data of a websocket_manager
+ */
+void ulfius_clear_websocket_manager(struct _websocket_manager * websocket_manager);
+
+/**
+ * Read and parse a new message from the websocket
+ * Return the opcode of the new websocket, U_WEBSOCKET_OPCODE_NONE if no message arrived, or U_WEBSOCKET_OPCODE_ERROR on error
+ * Sets the new message in the message variable if available
+ */
+int ulfius_read_incoming_message(struct _websocket_manager * websocket_manager, struct _websocket_message ** message);
+
+/**
+ * Run the websocket manager in a separated detached thread
+ */
+void * ulfius_thread_websocket_manager_run(void * args);
+
+/**
+ * Send a message in the websocket without lock
+ * Return U_OK on success
+ */
+int ulfius_websocket_send_message_nolock(struct _websocket_manager * websocket_manager,
+                                  const uint8_t opcode,
+                                  const uint64_t data_len,
+                                  const char * data);
+
+ /**
+ * Add a websocket in the list of active websockets of the instance
+ */
+int ulfius_instance_add_websocket_active(struct _u_instance * instance, struct _websocket * websocket);
+
+/**
+ * Remove a websocket from the list of active websockets of the instance
+ */
+int ulfius_instance_remove_websocket_active(struct _u_instance * instance, struct _websocket * websocket); 
+#endif // U_DISABLE_WEBSOCKET
+
+#endif // __ULFIUS_H__
diff --git a/includes/yder.h b/includes/yder.h
new file mode 100644
index 0000000..a2defa4
--- /dev/null
+++ b/includes/yder.h
@@ -0,0 +1,60 @@
+/**
+ * 
+ * Yder Framework
+ * 
+ * Logging framework library
+ * 
+ * yder.h: structures and functions declarations
+ * 
+ * Copyright 2015-2017 Nicolas Mora <mail@babelouest.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation;
+ * version 2.1 of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+ * 
+ */
+
+#ifndef __YDER_H__
+#define __YDER_H__
+
+#define YDER_VERSION 2.0
+
+#define Y_LOG_MODE_NONE    0x0000
+#define Y_LOG_MODE_CONSOLE 0x00F0
+#define Y_LOG_MODE_SYSLOG  0x0F00
+#define Y_LOG_MODE_FILE    0xF000
+#define Y_LOG_MODE_CURRENT 0xFFFF
+
+#define Y_LOG_LEVEL_NONE    0x0000
+#define Y_LOG_LEVEL_ERROR   0x000F
+#define Y_LOG_LEVEL_WARNING 0x00F0
+#define Y_LOG_LEVEL_INFO    0x0F00
+#define Y_LOG_LEVEL_DEBUG   0xF000
+#define Y_LOG_LEVEL_CURRENT 0xFFFF
+
+/**
+ * Initialize logging with mode and level parameters, specify a log file if needed
+ * Return true on success, false on error
+ */
+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);
+
+/**
+ * Close the logs
+ */
+int y_close_logs();
+
+/**
+ * Log a message using current parameters
+ */
+void y_log_message(const unsigned long type, const char * message, ...);
+
+#endif // __YDER_H__
diff --git a/libraries/liborcania.so b/libraries/liborcania.so
new file mode 100755
index 0000000000000000000000000000000000000000..e41e68d5d809996e5df81680ac48cb89549f71f8
GIT binary patch
literal 18648
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
I-`M{D0cmJ?djJ3c

literal 0
HcmV?d00001

diff --git a/libraries/liborcania.so.1.1 b/libraries/liborcania.so.1.1
new file mode 100755
index 0000000000000000000000000000000000000000..e41e68d5d809996e5df81680ac48cb89549f71f8
GIT binary patch
literal 18648
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
I-`M{D0cmJ?djJ3c

literal 0
HcmV?d00001

diff --git a/libraries/libulfius.so b/libraries/libulfius.so
new file mode 100755
index 0000000000000000000000000000000000000000..1f1731e0907d7bf1fbf51328565362fa510b4afc
GIT binary patch
literal 63088
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

literal 0
HcmV?d00001

diff --git a/libraries/libulfius.so.2.1 b/libraries/libulfius.so.2.1
new file mode 100755
index 0000000000000000000000000000000000000000..1f1731e0907d7bf1fbf51328565362fa510b4afc
GIT binary patch
literal 63088
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

literal 0
HcmV?d00001

diff --git a/libraries/libyder.so b/libraries/libyder.so
new file mode 100755
index 0000000000000000000000000000000000000000..623103e1ab2ff20bb9b4a740847b3f5c5fc8f374
GIT binary patch
literal 11408
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

literal 0
HcmV?d00001

diff --git a/libraries/libyder.so.2.0 b/libraries/libyder.so.2.0
new file mode 100755
index 0000000000000000000000000000000000000000..623103e1ab2ff20bb9b4a740847b3f5c5fc8f374
GIT binary patch
literal 11408
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

literal 0
HcmV?d00001

-- 
GitLab