http_async_client: add parameters to enable/set tcp keepalive
[sip-router] / src / modules / http_async_client / async_http.h
1 /**
2  * Copyright 2016 (C) Federico Cabiddu <federico.cabiddu@gmail.com>
3  * Copyright 2016 (C) Giacomo Vacca <giacomo.vacca@gmail.com>
4  * Copyright 2016 (C) Orange - Camille Oudot <camille.oudot@orange.com>
5  *
6  * This file is part of Kamailio, a free SIP server.
7  *
8  * This file is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version
12  *
13  *
14  * This file is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22  *
23  */
24
25 /*! \file
26  * \brief  Kamailio http_async_client :: Async HTTP
27  * \ingroup http_async_client
28  */
29
30
31 #ifndef _ASYNC_HTTP_
32 #define _ASYNC_HTTP_
33
34 #define RC_AVP_NAME "http_rc"
35 #define RC_AVP_NAME_LENGTH 7
36 #define RB_AVP_NAME "http_rb"
37 #define RB_AVP_NAME_LENGTH 7
38 #define ERROR_AVP_NAME "http_error"
39 #define ERROR_AVP_NAME_LENGTH 10
40 #define MAX_ID_LEN 32
41 #define MAX_CBNAME_LEN  64
42
43 #include <curl/curl.h>
44 #include <event2/event.h>
45
46 #include "../../core/pvar.h"
47
48 #include "http_multi.h"
49
50 extern int num_workers;
51
52 extern int http_timeout; /* query timeout in ms */
53 extern int tcp_keepalive; 
54 extern int tcp_ka_idle; 
55 extern int tcp_ka_interval; 
56
57 extern struct sip_msg *ah_reply;
58 extern str ah_error;
59
60 extern int tls_verify_host;
61 extern int tls_verify_peer;
62 extern char* tls_client_cert;
63 extern char* tls_client_key;
64 extern char* tls_ca_path;
65
66 extern unsigned int default_authmethod;
67
68 typedef struct async_http_worker {
69         int notication_socket[2];
70         struct event_base *evbase;
71         struct event *socket_event;
72         struct http_m_global *g;
73 } async_http_worker_t;
74
75 extern async_http_worker_t *workers;
76
77 typedef enum {
78         AH_METH_DEFAULT = 0,
79         AH_METH_GET, AH_METH_POST, AH_METH_PUT, AH_METH_DELETE
80 } async_http_method_t;
81
82 struct header_list {
83         char ** t;
84         int len;
85 };
86
87 struct query_params {
88         async_http_method_t method:3;
89         unsigned int tls_verify_peer:1;
90         unsigned int tls_verify_host:1;
91         unsigned int suspend_transaction:1; /* (create and) suspend the current transaction */
92         unsigned int call_route:1;          /* call script route on reply */
93
94         unsigned int timeout;
95         struct header_list headers;
96         char* tls_client_cert;
97         char* tls_client_key;
98         char* tls_ca_path;
99         str body;
100
101         unsigned int authmethod;
102         char* username;
103         char* password;
104         unsigned int tcp_keepalive;
105         unsigned int tcp_ka_idle;
106         unsigned int tcp_ka_interval;
107 };
108
109 extern struct query_params ah_params;
110
111 typedef struct async_query {
112         str query;
113         char id[MAX_ID_LEN+1];
114         unsigned int tindex;
115         unsigned int tlabel;
116         struct query_params query_params;
117         char cbname[MAX_CBNAME_LEN];
118         int cbname_len;
119 } async_query_t;
120
121 int async_http_init_sockets(async_http_worker_t *worker);
122 int async_http_init_worker(int prank, async_http_worker_t* worker);
123 void async_http_run_worker(async_http_worker_t* worker);
124
125 int async_send_query(sip_msg_t *msg, str *query, str *cbname);
126 int async_push_query(async_query_t *aq);
127
128 void notification_socket_cb(int fd, short event, void *arg);
129 int init_socket(async_http_worker_t* worker);
130 void async_http_cb(struct http_m_reply *reply, void *param);
131 void init_query_params(struct query_params*);
132 void set_query_params(struct query_params*);
133
134 int header_list_add(struct header_list *hl, str* hdr);
135 int query_params_set_method(struct query_params *qp, str *meth);
136
137 static inline void free_async_query(async_query_t *aq)
138 {
139         if (!aq)
140                 return;
141         LM_DBG("freeing query %p\n", aq);
142         if (aq->query.s && aq->query.len) {
143                 shm_free(aq->query.s);
144                 aq->query.s=0;
145                 aq->query.len=0;
146         }
147
148         if(aq->query_params.headers.t) {
149                 while(aq->query_params.headers.len--)
150                         shm_free(aq->query_params.headers.t[aq->query_params.headers.len]);
151                 shm_free(aq->query_params.headers.t);
152         }
153
154         if (aq->query_params.tls_client_cert) {
155                 shm_free(aq->query_params.tls_client_cert);
156                 aq->query_params.tls_client_cert = NULL;
157         }
158
159         if (aq->query_params.tls_client_key) {
160                 shm_free(aq->query_params.tls_client_key);
161                 aq->query_params.tls_client_key = NULL;
162         }
163
164         if (aq->query_params.tls_ca_path) {
165                 shm_free(aq->query_params.tls_ca_path);
166                 aq->query_params.tls_ca_path = NULL;
167         }
168
169         if (aq->query_params.body.s && aq->query_params.body.len > 0) {
170                 shm_free(aq->query_params.body.s);
171                 aq->query_params.body.s = NULL;
172                 aq->query_params.body.len = 0;
173         }
174
175         if (aq->query_params.username) {
176                 shm_free(aq->query_params.username);
177                 aq->query_params.username = NULL;
178         }
179
180         if (aq->query_params.password) {
181                 shm_free(aq->query_params.password);
182                 aq->query_params.password = NULL;
183         }
184
185         shm_free(aq);
186 }
187
188 #endif