httpapitest Actually use the API function :-)
[sip-router] / test / mod_httpapitest / httpapitest.c
1 /*
2  * http_client API test Module
3  * Copyright (C) 2015-2016 Edvina AB, Olle E. Johansson
4  *
5  * This file is part of Kamailio, a free SIP server.
6  *
7  * Kamailio is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version
11  *
12  * Kamailio is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License 
18  * along with this program; if not, write to the Free Software 
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
20  *
21  */
22
23 /*! \file
24  * \brief  Kamailio http_client :: The test module
25  *         Not compiled by default
26  * \ingroup http_client
27  */
28
29 #include "../../modules/http_client/curl_api.h"
30
31 #include "../../mod_fix.h"
32 #include "../../sr_module.h"
33 #include "../../ut.h"
34 #include "../../resolve.h"
35 #include "../../locking.h"
36 #include "../../config.h"
37 #include "../../lvalue.h"
38
39 MODULE_VERSION
40
41 /* Module parameter variables */
42 str             default_http_conn = STR_NULL;           /*!< Default connection to test */
43
44 /* Module management function prototypes */
45 static int mod_init(void);
46 static int child_init(int);
47 static void destroy(void);
48
49 /* Fixup functions to be defined later */
50 static int fixup_testcurl_connect(void** param, int param_no);
51 static int fixup_free_testcurl_connect(void** param, int param_no);
52 static int fixup_testcurl_connect_post(void** param, int param_no);
53 static int fixup_free_testcurl_connect_post(void** param, int param_no);
54 static int w_testcurl_connect(struct sip_msg* _m, char* _con, char * _url, char* _result);
55 static httpc_api_t httpapi;
56
57 /* Exported functions */
58 static cmd_export_t cmds[] = {
59         {"test_http_connect", (cmd_function)w_testcurl_connect, 3, fixup_testcurl_connect,
60                 fixup_free_testcurl_connect,
61                 REQUEST_ROUTE|ONREPLY_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE},
62 };
63
64
65 /* Exported parameters */
66 static param_export_t params[] = {
67         {"test_connection", PARAM_INT, &default_connection_timeout},
68         {0, 0, 0}
69 };
70
71 /* Module interface */
72 struct module_exports exports = {
73         "httpapitest",
74         DEFAULT_DLFLAGS, /* dlopen flags */
75         cmds,      /* Exported functions */
76         params,    /* Exported parameters */
77         0,         /* exported statistics */
78         0,      /* exported MI functions */
79         0,         /* exported pseudo-variables */
80         0,         /* extra processes */
81         mod_init,  /* module initialization function */
82         0,         /* response function*/
83         destroy,   /* destroy function */
84         child_init /* per-child init function */
85 };
86
87
88 /* Module initialization function */
89 static int mod_init(void)
90 {
91         
92         LM_DBG("init httpapitest module\n");
93
94         if (httpc_load_api(&httpapi) != 0) {
95                 LM_ERR("Can not bind to http_client API \n");
96                 return -1;
97         }
98
99         LM_DBG("**** init httpapitest module done.\n");
100         return 0;
101 }
102
103
104 /* Child initialization function */
105 static int child_init(int rank)
106 {       
107         if (rank==PROC_INIT || rank==PROC_MAIN || rank==PROC_TCP_MAIN) {
108                 return 0; /* do nothing for the main process */
109         }
110
111         return 0;
112 }
113
114
115 static void destroy(void)
116 {
117         ;
118 }
119
120
121
122 /* Fixup functions */
123
124
125 /*
126  * Fix curl_connect params: connection(string/pvar) url (string that may contain pvars) and
127  * result (writable pvar).
128  */
129 static int fixup_testcurl_connect(void** param, int param_no)
130 {
131
132         if (param_no == 1) {
133                 /* We want char * strings */
134                 return 0;
135         }
136         /* URL and data may contain pvar */
137         if (param_no == 2) {
138                 return fixup_spve_null(param, 1);
139         }
140         if (param_no == 3) {
141                 if (fixup_pvar_null(param, 1) != 0) {
142                         LM_ERR("failed to fixup result pvar\n");
143                         return -1;
144                 }
145                 if (((pv_spec_t *)(*param))->setf == NULL) {
146                         LM_ERR("result pvar is not writeble\n");
147                         return -1;
148                 }
149                 return 0;
150         }
151
152         LM_ERR("invalid parameter number <%d>\n", param_no);
153         return -1;
154 }
155
156 /*
157  * Free testcurl_connect params.
158  */
159 static int fixup_free_testcurl_connect(void** param, int param_no)
160 {
161         if (param_no == 1) {
162                 /* Char strings don't need freeing */
163                 return 0;
164         }
165         if (param_no == 2) {
166                 return fixup_free_spve_null(param, 1);
167         }
168
169         if (param_no == 3) {
170                 return fixup_free_pvar_null(param, 1);
171         }
172         
173         LM_ERR("invalid parameter number <%d>\n", param_no);
174         return -1;
175 }
176
177 /*
178  * Wrapper for Curl_connect (GET)
179  */
180 static int w_testcurl_connect(struct sip_msg* _m, char* _con, char * _url, char* _result) {
181
182         str con = {NULL,0};
183         str url = {NULL,0};
184         str result = {NULL,0};
185         pv_spec_t *dst;
186         pv_value_t val;
187         int ret = 0;
188
189         if (_con == NULL || _url == NULL || _result == NULL) {
190                 LM_ERR("Invalid parameter\n");
191                 return -1;
192         }
193         con.s = _con;
194         con.len = strlen(con.s);
195
196         if (get_str_fparam(&url, _m, (gparam_p)_url) != 0) {
197                 LM_ERR("_url has no value\n");
198                 return -1;
199         }
200
201         LM_DBG("**** Curl Connection %s URL %s Result var %s\n", _con, _url, _result);
202
203         
204         /* API    http_connect(msg, connection, url, result, content_type, post) */
205         ret = httpapi.http_connect(_m, &con, &url, &result, NULL, NULL);
206
207         val.rs = result;
208         val.flags = PV_VAL_STR;
209         dst = (pv_spec_t *)_result;
210         dst->setf(_m, &dst->pvp, (int)EQ_T, &val);
211
212         if (result.s != NULL)
213                 pkg_free(result.s);
214
215         return ret;
216 }