doubango/tinyHTTP/include/thttp.h
c732d49e
 /*
 * Copyright (C) 2010-2011 Mamadou Diop.
 *
 * Contact: Mamadou Diop <diopmamadou(at)doubango[dot]org>
 *	
 * This file is part of Open Source Doubango Framework.
 *
 * DOUBANGO is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *	
 * DOUBANGO 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 DOUBANGO.
 *
 */
 /**@file thttp.h
  * @brief HTTP (RFC 2616) and HTTP basic/digest authetication (RFC 2617) implementations.
  *
  * @author Mamadou Diop <diopmamadou(at)doubango[dot]org>
  *
 
  */
 #ifndef TINYHTTP_THTTP_H
 #define TINYHTTP_THTTP_H
 
 #include "tinyhttp_config.h"
 
 #include "tinyhttp/thttp_event.h"
 #include "tinyhttp/thttp_session.h"
 
 #include "tnet_transport.h"
 
 /**@def THTTP_STACK_SET_NULL()
 * Ends stack parameters. Must always be the last one.
 */
 
 /**@def THTTP_STACK_SET_LOCAL_IP(STR)
 * Sets local IP address to bind to. By default, the stack will bind to "0.0.0.0" or "::" depending on
 * whether IPv4 is used or not (IPv6). 
 * This is a helper macro for @ref thttp_stack_create and @ref thttp_stack_set.
 * @param IP_STR The IP address (const char*).
 *
 * @code
 * thttp_stack_create(callback, 
 *	THTTP_STACK_SET_LOCAL_IP("192.168.0.15"),
 *	THTTP_STACK_SET_NULL());
 * @endcode
 *
 * @sa @ref THTTP_STACK_SET_LOCAL_PORT<br>@ref thttp_stack_create<br>@ref thttp_stack_set
 */
 /**@def THTTP_STACK_SET_LOCAL_PORT(PORT_INT)
 * Sets local Port to bind to. By default, the stack will bind to a random port.
 * This is a helper macro for @ref thttp_stack_create and @ref thttp_stack_set.
 * @param PORT_INT The Port (int32_t).
 *
 * @code
 * thttp_stack_create(callback, 
 *	THTTP_STACK_SET_LOCAL_PORT(1234),
 *	THTTP_STACK_SET_NULL());
 * @endcode
 * @sa @ref THTTP_STACK_SET_LOCAL_IP<br>@ref thttp_stack_create<br>@ref thttp_stack_set
 */
 
 /**@def THTTP_STACK_SET_TLS_CERTS(CA_FILE_STR, PUB_FILE_STR, PRIV_FILE_STR)
 * Sets TLS certificates (Mutual Authentication). Not mandatory.
 * This is a helper macro for @ref thttp_stack_create and @ref thttp_stack_set.
 * @param CA_FILE_STR Path to the Certification Authority File.
 * @param PUB_FILE_STR Path to the Public key file.
 * @param PRIV_FILE_STR Path to the Private key file.
 *
 * @code
 * thttp_stack_create(callback, 
 *	THTTP_STACK_SET_TLS_CERTS("C:\\tls\\ca.pki-crt.pem", "C:\\tls\\pub-crt.pem", "C:\\tls\\priv-key.pem"),
 *	THTTP_STACK_SET_NULL());
 * @endcode
 */
 
 THTTP_BEGIN_DECLS
 
 typedef enum thttp_stack_param_type_e
 {
 	thttp_pname_null = 0,
 #define THTTP_STACK_SET_NULL()																thttp_pname_null
 
 	/* Network */
 	thttp_pname_local_ip,
 	thttp_pname_local_port,
 	thttp_pname_proxy,
 #define THTTP_STACK_SET_LOCAL_IP(IP_STR)														thttp_pname_local_ip, (const char*)IP_STR
 #define THTTP_STACK_SET_LOCAL_PORT(PORT_INT)													thttp_pname_local_port, (int)PORT_INT
 #define THTTP_STACK_SET_PROXY(IP_STR, PORT_INT)													thttp_pname_proxy, (const char*)IP_STR, (int)PORT_INT
 
 	/* Modes */
 	thttp_pname_mode_client,
 	thttp_pname_mode_server,
 #define THTTP_STACK_SET_MODE_CLIENT()												thttp_pname_mode_client
 #define THTTP_STACK_SET_MODE_SERVER()												thttp_pname_mode_server
 
 	/* TLS */
 	thttp_pname_tls_enabled,
 #define THTTP_STACK_SET_TLS_ENABLED(ENABLED_BOOL)									thttp_pname_tls_enabled, (tsk_bool_t)ENABLED_BOOL
 	thttp_pname_tls_certs_verify,
 #define THTTP_STACK_SET_TLS_CERTS_VERIFY(CERTS_VERIFY_BOOL)							thttp_pname_tls_certs_verify, (tsk_bool_t)CERTS_VERIFY_BOOL
 	thttp_pname_tls_certs,
 #define THTTP_STACK_SET_TLS_CERTS(CA_FILE_STR, PUB_FILE_STR, PRIV_FILE_STR)			thttp_pname_tls_certs, (const char*)CA_FILE_STR, (const char*)PUB_FILE_STR, (const char*)PRIV_FILE_STR
 
 	/* User Data */
 	thttp_pname_userdata,
 #define THTTP_STACK_SET_USERDATA(USERDATA_PTR)	thttp_pname_userdata, (const void*)USERDATA_PTR
 
 }
 thttp_stack_param_type_t;
 
 typedef enum thttp_stack_mode_e
 {
 	thttp_stack_mode_none,
 	thttp_stack_mode_client = (0x01 << 0),
 	thttp_stack_mode_server = (0x01 << 1),
 	thttp_stack_mode_hybrid = (thttp_stack_mode_client | thttp_stack_mode_server)
 }
 thttp_stack_mode_t;
 
 /** HTTP/HTTPS Stack.
 */
 typedef struct thttp_stack_s
 {
 	TSK_DECLARE_OBJECT;
 
 	tsk_bool_t started;
 	enum thttp_stack_mode_e mode;
 	thttp_stack_callback_f callback;
 
 	/* Network */
 	char* local_ip;
 	int local_port;
 	char* proxy_ip;
 	int proxy_port;
 	tnet_transport_t *transport;
 
 	/* TLS */
 	struct {
 		tsk_bool_t enabled;
 		tsk_bool_t verify;
 		char* ca;
 		char* pbk;
 		char* pvk;
 	}tls;
 
 	thttp_sessions_L_t* sessions;
 	
 	const void* userdata;
 
 	TSK_DECLARE_SAFEOBJ;
 }
 thttp_stack_t;
 
 TINYHTTP_API thttp_stack_handle_t *thttp_stack_create(thttp_stack_callback_f callback, ...);
 TINYHTTP_API int thttp_stack_start(thttp_stack_handle_t *self);
 TINYHTTP_API int thttp_stack_set(thttp_stack_handle_t *self, ...);
 TINYHTTP_API const void* thttp_stack_get_userdata(thttp_stack_handle_t *self);
 TINYHTTP_API int thttp_stack_stop(thttp_stack_handle_t *self);
 
 TINYHTTP_GEXTERN const tsk_object_def_t *thttp_stack_def_t;
 
 THTTP_END_DECLS
 
 #endif /* TINYHTTP_THTTP_H */