httpapitest Fixing test 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
56 /* Exported functions */
57 static cmd_export_t cmds[] = {
58         {"test_http_connect", (cmd_function)w_testcurl_connect, 3, fixup_testcurl_connect,
59                 fixup_free_testcurl_connect,
60                 REQUEST_ROUTE|ONREPLY_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE},
61 };
62
63
64 /* Exported parameters */
65 static param_export_t params[] = {
66         {"test_connection", PARAM_INT, &default_connection_timeout},
67         {0, 0, 0}
68 };
69
70 /* Module interface */
71 struct module_exports exports = {
72         "httpapitest",
73         DEFAULT_DLFLAGS, /* dlopen flags */
74         cmds,      /* Exported functions */
75         params,    /* Exported parameters */
76         0,         /* exported statistics */
77         0,      /* exported MI functions */
78         0,         /* exported pseudo-variables */
79         0,         /* extra processes */
80         mod_init,  /* module initialization function */
81         0,         /* response function*/
82         destroy,   /* destroy function */
83         child_init /* per-child init function */
84 };
85
86 /* Module initialization function */
87 static int mod_init(void)
88 {
89         
90         LM_DBG("init httpapitest module\n");
91         httpc_api_t httpapi;
92
93         if (httpc_load_api(&httpapi) != 0) {
94                 LM_ERR("Can not bind to http_client API \n");
95                 return -1;
96         }
97
98         LM_DBG("**** init httpapitest module done.\n");
99         return 0;
100 }
101
102
103 /* Child initialization function */
104 static int child_init(int rank)
105 {       
106         if (rank==PROC_INIT || rank==PROC_MAIN || rank==PROC_TCP_MAIN) {
107                 return 0; /* do nothing for the main process */
108         }
109
110         return 0;
111 }
112
113
114 static void destroy(void)
115 {
116         ;
117 }
118
119
120
121 /* Fixup functions */
122
123
124 /*
125  * Fix curl_connect params: connection(string/pvar) url (string that may contain pvars) and
126  * result (writable pvar).
127  */
128 static int fixup_testcurl_connect(void** param, int param_no)
129 {
130
131         if (param_no == 1) {
132                 /* We want char * strings */
133                 return 0;
134         }
135         /* URL and data may contain pvar */
136         if (param_no == 2) {
137                 return fixup_spve_null(param, 1);
138         }
139         if (param_no == 3) {
140                 if (fixup_pvar_null(param, 1) != 0) {
141                         LM_ERR("failed to fixup result pvar\n");
142                         return -1;
143                 }
144                 if (((pv_spec_t *)(*param))->setf == NULL) {
145                         LM_ERR("result pvar is not writeble\n");
146                         return -1;
147                 }
148                 return 0;
149         }
150
151         LM_ERR("invalid parameter number <%d>\n", param_no);
152         return -1;
153 }
154
155 /*
156  * Free testcurl_connect params.
157  */
158 static int fixup_free_testcurl_connect(void** param, int param_no)
159 {
160         if (param_no == 1) {
161                 /* Char strings don't need freeing */
162                 return 0;
163         }
164         if (param_no == 2) {
165                 return fixup_free_spve_null(param, 1);
166         }
167
168         if (param_no == 3) {
169                 return fixup_free_pvar_null(param, 1);
170         }
171         
172         LM_ERR("invalid parameter number <%d>\n", param_no);
173         return -1;
174 }
175
176 /*
177  * Wrapper for Curl_connect (GET)
178  */
179 static int w_testcurl_connect(struct sip_msg* _m, char* _con, char * _url, char* _result) {
180
181         str con = {NULL,0};
182         str url = {NULL,0};
183         str result = {NULL,0};
184         pv_spec_t *dst;
185         pv_value_t val;
186         int ret = 0;
187
188         if (_con == NULL || _url == NULL || _result == NULL) {
189                 LM_ERR("Invalid parameter\n");
190                 return -1;
191         }
192         con.s = _con;
193         con.len = strlen(con.s);
194
195         if (get_str_fparam(&url, _m, (gparam_p)_url) != 0) {
196                 LM_ERR("_url has no value\n");
197                 return -1;
198         }
199
200         LM_DBG("**** Curl Connection %s URL %s Result var %s\n", _con, _url, _result);
201
202         ret = curl_con_query_url(_m, &con, &url, &result, NULL, NULL);
203
204         val.rs = result;
205         val.flags = PV_VAL_STR;
206         dst = (pv_spec_t *)_result;
207         dst->setf(_m, &dst->pvp, (int)EQ_T, &val);
208
209         if (result.s != NULL)
210                 pkg_free(result.s);
211
212         return ret;
213 }