SimpleLink CC32xx ATCommands Library
Simplifies the implementation of Internet connectivity
atcmd_http.c
1 /*
2  * Copyright (c) 2016, Texas Instruments Incorporated
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *
12  * * Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditions and the following disclaimer in the
14  * documentation and/or other materials provided with the distribution.
15  *
16  * * Neither the name of Texas Instruments Incorporated nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 //*****************************************************************************
34 // includes
35 //*****************************************************************************
36 #include <stdlib.h>
37 #include <stdio.h>
38 
39 /* TI-DRIVERS Header files */
40 #include <ti/drivers/net/wifi/simplelink.h>
41 #include <ti/net/http/httpclient.h>
42 #include <ti/net/utils/str_mpl.h>
43 
44 /* AT Header files */
45 #include <ti/net/atcmd/atcmd_defs.h>
46 #include <ti/net/atcmd/atcmd.h>
47 #include <ti/net/atcmd/atcmd_http.h>
48 #include <ti/net/atcmd/atcmd_gen.h>
49 #include <ti/net/atcmd/atcmd_event.h>
50 
51 #include <pthread.h>
52 
53 //*****************************************************************************
54 // defines
55 //*****************************************************************************
56 #define ATCMDHTTP_CONNECT_MAX_HOST_NAME (430)
57 
58 //*****************************************************************************
59 // typedefs
60 //*****************************************************************************
61 typedef struct _ATCmdHttp_Connect_t_
62 {
63  char *hostName;
64  uint32_t flags;
65  HTTPClient_extSecParams exSecParams;
66 }ATCmdHttp_Connect_t;
67 
68 typedef struct _ATCmdHttp_SendReq_t_
69 {
70  char *method;
71  char *requestURI;
72  uint32_t flags;
73  uint8_t bodyFormat;
74  uint32_t bodyLen;
75  char *body;
76 }ATCmdHttp_SendReq_t;
77 
78 typedef struct _ATCmdHttp_RespBody_t_
79 {
80  uint32_t index;
81  uint8_t moreDataflag;
82  uint8_t format;
83  uint32_t len;
84  char *body;
85 }ATCmdHttp_RespBody_t;
86 
87 typedef struct _ATCmdHttp_Header_t_
88 {
89  uint32_t index;
90  uint32_t option;
91  uint32_t flags;
92  uint8_t format;
93  uint32_t len;
94  void *value;
95 }ATCmdHttp_Header_t;
96 
97 typedef struct _ATCmdHttp_Opt_t_
98 {
99  uint32_t option;
100  uint32_t flags;
101  uint32_t len;
102  uint32_t value;
103 }ATCmdHttp_Opt_t;
104 
105 typedef struct _ATCmdHttp_Proxy_t_
106 {
107  SlNetSock_Addr_t addr;
108  int8_t padding[12];
109 }ATCmdHttp_Proxy_t;
110 
111 //*****************************************************************************
112 // global variables
113 //*****************************************************************************
114 HTTPClient_Handle ATCmdHttp_mapHanlde[SL_MAX_SOCKETS] = {0};
115 
116 //*****************************************************************************
117 // HTTP AT Commands Routines
118 //*****************************************************************************
119 
120 /*
121  Find available client index
122 */
123 int32_t ATCmdHttp_findAvailableIndex(void)
124 {
125  uint8_t index = 0;
126 
127  while ((ATCmdHttp_mapHanlde[index] != 0) && (index < SL_MAX_SOCKETS))
128  {
129  index++;
130  }
131  if (index == SL_MAX_SOCKETS)
132  {
133  return -1;
134  }
135  return index;
136 }
137 
138 /*
139  Parse client index and get the corresponding handle
140 */
141 HTTPClient_Handle ATCmdHttp_clientIndexParse(char **buff, uint32_t *index, char delim)
142 {
143  HTTPClient_Handle handle;
144 
145  /* Mode */
146  if (StrMpl_getVal(buff, index ,delim, STRMPL_FLAG_PARAM_SIZE_32) < 0)
147  {
148  return NULL;
149  }
150  if (*index >= SL_MAX_SOCKETS)
151  {
152  return NULL;
153  }
154  /* Get client handle */
155  handle = ATCmdHttp_mapHanlde[*index];
156 
157  return handle;
158 }
159 
160 
161 /*
162  Compose and send HTTP client create result.
163 */
164 int32_t ATCmdHttp_createResult(void *args, int32_t num, char *buff)
165 {
166 
167  StrMpl_setStr(ATCmd_httpCreateStr,&buff,ATCMD_DELIM_EVENT);
168  StrMpl_setVal(&num,&buff,ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_32|STRMPL_FLAG_PARAM_DEC|STRMPL_FLAG_PARAM_UNSIGNED);
169 
170  return 0;
171 }
172 
173 
174 /*
175  HTTP client create callback.
176 */
177 int32_t ATCmdHttp_createCallback(void *arg)
178 {
179  int16_t ret;
180  HTTPClient_Handle handle;
181  int32_t index;
182 
183  handle = HTTPClient_create(&ret, NULL);
184 
185  if(ret < 0)
186  {
187  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
188  return -1;
189  }
190  else
191  {
192  index = ATCmdHttp_findAvailableIndex();
193  if (index < 0)
194  {
195  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
196  return -1;
197  }
198  else
199  {
200  ATCmdHttp_mapHanlde[index] = handle;
201  ATCmd_commandResult(ATCmdHttp_createResult,NULL,index);
202  ATCmd_okResult();
203  }
204  }
205  return 0;
206 }
207 
208 /*
209  HTTP client destroy callback.
210 */
211 int32_t ATCmdHttp_destroyCallback(void *arg)
212 {
213  int32_t ret = 0;
214  uint32_t index;
215  HTTPClient_Handle handle;
216 
217  /* parse client index */
218  handle = ATCmdHttp_clientIndexParse((char **)&arg,&index,ATCMD_DELIM_TRM);
219  if (handle == NULL)
220  {
221  ATCmd_errorResult(ATCmd_errorParseStr,STRMPL_ERROR_WRONG_PARAM);
222  return -1;
223  }
224 
225  ret = HTTPClient_destroy(handle);
226 
227  if (ret < 0)
228  {
229  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
230  }
231  else
232  {
233  ATCmdHttp_mapHanlde[index] = 0;
234  ATCmd_okResult();
235  }
236  return ret;
237 }
238 
239 /*
240  Free allocated memory for HTTP client connect command
241 */
242 int32_t ATCmdHttp_connectFree(ATCmdHttp_Connect_t *params)
243 {
244 
245  if (params->hostName != NULL)
246  {
247  free(params->hostName);
248  }
249  if (params->exSecParams.clientCert != NULL)
250  {
251  free((void *)params->exSecParams.clientCert);
252  }
253  if (params->exSecParams.privateKey != NULL)
254  {
255  free((void *)params->exSecParams.privateKey);
256  }
257  if (params->exSecParams.rootCa != NULL)
258  {
259  free((void *)params->exSecParams.rootCa);
260  }
261 
262  return 0;
263 }
264 
265 /*
266  Parse HTTP client connect command.
267 */
268 int32_t ATCmdHttp_connectParse(char *buff, ATCmdHttp_Connect_t *params)
269 {
270  int32_t ret = 0;
271 
272  /* host name */
273  if ((ret = StrMpl_getAllocStr(&buff, &params->hostName, ATCMD_DELIM_ARG, ATCMDHTTP_CONNECT_MAX_HOST_NAME ,ATCmd_excludeDelimStr)) < 0)
274  {
275  return ret;
276  }
277 
278  /* flags */
279  if ((ret = StrMpl_getBitmaskListVal(ATCmd_httpConnectFlags, sizeof(ATCmd_httpConnectFlags)/sizeof(StrMpl_List_t), &buff, &params->flags, ATCMD_DELIM_ARG, ATCMD_DELIM_BIT, ATCmd_excludeDelimArray, STRMPL_FLAG_PARAM_SIZE_32)) < 0)
280  {
281  if (ret != STRMPL_ERROR_PARAM_MISSING)
282  {
283  return ret;
284  }
285  }
286  /* Private key */
287  if ((ret = StrMpl_getAllocStr(&buff, (char **)&params->exSecParams.privateKey, ATCMD_DELIM_ARG, 0xFF ,ATCmd_excludeDelimStr)) < 0)
288  {
289  if (ret != STRMPL_ERROR_PARAM_MISSING)
290  {
291  return ret;
292  }
293  }
294  /* Client certificate */
295  if ((ret = StrMpl_getAllocStr(&buff, (char **)&params->exSecParams.clientCert, ATCMD_DELIM_ARG, 0xFF ,ATCmd_excludeDelimStr)) < 0)
296  {
297  if (ret != STRMPL_ERROR_PARAM_MISSING)
298  {
299  return ret;
300  }
301  }
302  /* Root CA */
303  if ((ret = StrMpl_getAllocStr(&buff, (char **)&params->exSecParams.rootCa, ATCMD_DELIM_TRM, 0xFF ,ATCmd_excludeDelimStr)) < 0)
304  {
305  if (ret != STRMPL_ERROR_PARAM_MISSING)
306  {
307  return ret;
308  }
309  ret = 0;
310  }
311 
312  return ret;
313 }
314 
315 /*
316  HTTP client connect callback.
317 */
318 int32_t ATCmdHttp_connectCallback(void *arg)
319 {
320  int32_t ret = 0;
321  uint32_t index;
322  HTTPClient_Handle handle;
323  ATCmdHttp_Connect_t params;
324 
325  handle = ATCmdHttp_clientIndexParse((char **)&arg,&index,ATCMD_DELIM_ARG);
326  if (handle == NULL)
327  {
328  ATCmd_errorResult(ATCmd_errorParseStr,STRMPL_ERROR_WRONG_PARAM);
329  return -1;
330  }
331  memset(&params,0,sizeof(ATCmdHttp_Connect_t));
332  ret = ATCmdHttp_connectParse((char *)arg,&params);
333 
334  if(ret < 0)
335  {
336  ATCmd_errorResult(ATCmd_errorParseStr,ret);
337  ATCmdHttp_connectFree(&params);
338  return -1;
339  }
340  ret = HTTPClient_connect(handle,params.hostName,&params.exSecParams,params.flags);
341 
342  if (ret < 0)
343  {
344  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
345  }
346  else
347  {
348  ATCmd_okResult();
349  }
350 
351  ATCmdHttp_connectFree(&params);
352  return ret;
353 }
354 
355 /*
356  HTTP client disconnect callback.
357 */
359 {
360  int32_t ret = 0;
361  uint32_t index;
362  HTTPClient_Handle handle;
363 
364  handle = ATCmdHttp_clientIndexParse((char **)&arg,&index,ATCMD_DELIM_TRM);
365  if (handle == NULL)
366  {
367  ATCmd_errorResult(ATCmd_errorParseStr,STRMPL_ERROR_WRONG_PARAM);
368  return -1;
369  }
370  ret = HTTPClient_disconnect(handle);
371 
372  if (ret < 0)
373  {
374  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
375  }
376  else
377  {
378  ATCmd_okResult();
379  }
380 
381  return ret;
382 }
383 
384 /*
385  Free allocated memory for HTTP client send request command
386 */
387 int32_t ATCmdHttp_sendReqFree(ATCmdHttp_SendReq_t *params)
388 {
389  if (params->requestURI != NULL)
390  {
391  free(params->requestURI);
392  }
393 
394  if (params->body!= NULL)
395  {
396  free(params->body);
397  }
398 
399  return 0;
400 }
401 
402 
403 /*
404  Parse HTTP client send request command.
405 */
406 int32_t ATCmdHttp_sendReqParse(char *buff, ATCmdHttp_SendReq_t *params)
407 {
408  int32_t ret = 0;
409  uint16_t outputLen = 0;
410  uint32_t method;
411 
412  /* method */
413  if ((ret = StrMpl_getListVal(ATCmd_httpSendReqMethod, sizeof(ATCmd_httpSendReqMethod)/sizeof(StrMpl_List_t), &buff, &method, ATCMD_DELIM_ARG, STRMPL_FLAG_PARAM_SIZE_32)) < 0)
414  {
415  return ret;
416  }
417  switch (method)
418  {
419  case ATCMDHTTP_METHOD_GET:
420  params->method = (char *)HTTP_METHOD_GET;
421  break;
422  case ATCMDHTTP_METHOD_POST:
423  params->method = (char *)HTTP_METHOD_POST;
424  break;
425  case ATCMDHTTP_METHOD_HEAD:
426  params->method = (char *)HTTP_METHOD_HEAD;
427  break;
428  case ATCMDHTTP_METHOD_OPTIONS:
429  params->method = (char *)HTTP_METHOD_OPTIONS;
430  break;
431  case ATCMDHTTP_METHOD_PUT:
432  params->method = (char *)HTTP_METHOD_PUT;
433  break;
434  case ATCMDHTTP_METHOD_DELETE:
435  params->method = (char *)HTTP_METHOD_DELETE;
436  break;
437  case ATCMDHTTP_METHOD_CONNECT:
438  params->method = (char *)HTTP_METHOD_CONNECT;
439  break;
440  }
441  /* request URI */
442  if ((ret = StrMpl_getAllocStr(&buff, (char **)&(params->requestURI), ATCMD_DELIM_ARG, 0xFFFF ,ATCmd_excludeDelimStr)) < 0)
443  {
444  return ret;
445  }
446 
447  /* flags */
448  if ((ret = StrMpl_getBitmaskListVal(ATCmd_httpSendReqFlags, sizeof(ATCmd_httpSendReqFlags)/sizeof(StrMpl_List_t), &buff, &params->flags, ATCMD_DELIM_ARG, ATCMD_DELIM_BIT, ATCmd_excludeDelimArray, STRMPL_FLAG_PARAM_SIZE_32)) < 0)
449  {
450  if (ret != STRMPL_ERROR_PARAM_MISSING)
451  {
452  return ret;
453  }
454  }
455 
456  /* data format */
457  if ((ret = StrMpl_getVal(&buff, &params->bodyFormat , ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_8)) < 0)
458  {
459  if (ret != STRMPL_ERROR_PARAM_MISSING)
460  {
461  return ret;
462  }
463  params->bodyFormat = 0;
464  }
465 
466  /* data length */
467  if ((ret = StrMpl_getVal(&buff, &params->bodyLen, ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_32 )) < 0)
468  {
469  if ((ret != STRMPL_ERROR_PARAM_MISSING) ||
470  ((ret == STRMPL_ERROR_PARAM_MISSING) &&
471  ((params->method == HTTP_METHOD_POST) ||
472  (params->method == HTTP_METHOD_PUT))))
473  {
474  return ret;
475  }
476  params->bodyLen = 0;
477  ret = 0;
478  }
479 
480  if(params->bodyLen > 0)
481  {
482  /* data */
483  if (params->bodyFormat == ATCMD_DATA_FORMAT_BASE64)
484  {
485  /* convert length to binary length */
486  outputLen = StrMpl_getBase64DecBufSize((uint8_t *)buff,params->bodyLen);
487  params->body = malloc(outputLen);
488  if (params->body == NULL)
489  {
490  return -1;
491  }
492  if (StrMpl_decodeBase64((uint8_t *)buff, params->bodyLen, (uint8_t *)params->body, (uint32_t *)&outputLen) < 0)
493  {
494  return -1;
495  }
496  params->bodyLen = outputLen;
497  }
498  else
499  {
500  params->body = malloc(params->bodyLen);
501  if (params->body == NULL)
502  {
503  return -1;
504  }
505 
506  memcpy(params->body, buff, params->bodyLen);
507  }
508  }
509  return ret;
510 }
511 
512 /*
513  Compose and send HTTP client send request result.
514 */
515 int32_t ATCmdHttp_sendReqResult(void *args, int32_t num, char *buff)
516 {
517 
518  StrMpl_setStr(ATCmd_httpSendReqStr,&buff,ATCMD_DELIM_EVENT);
519  StrMpl_setVal(&num,&buff,ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_16|STRMPL_FLAG_PARAM_DEC|STRMPL_FLAG_PARAM_SIGNED);
520 
521  return 0;
522 }
523 
524 /*
525  HTTP client send request callback.
526 */
527 int32_t ATCmdHttp_sendReqCallback(void *arg)
528 {
529  int32_t ret = 0;
530  ATCmdHttp_SendReq_t params;
531  uint32_t index;
532  HTTPClient_Handle handle;
533 
534  handle = ATCmdHttp_clientIndexParse((char **)&arg,&index,ATCMD_DELIM_ARG);
535  if (handle == NULL)
536  {
537  ATCmd_errorResult(ATCmd_errorParseStr,STRMPL_ERROR_WRONG_PARAM);
538  return -1;
539  }
540  memset(&params, 0x0, sizeof(ATCmdHttp_SendReq_t));
541 
542  /* Call the command parser */
543  ret = ATCmdHttp_sendReqParse((char *)arg,&params);
544 
545  if(ret < 0)
546  {
547  ATCmd_errorResult(ATCmd_errorParseStr,ret);
548  ATCmdHttp_sendReqFree(&params);
549  return -1;
550  }
551  ret = HTTPClient_sendRequest(handle,params.method,params.requestURI,params.body,params.bodyLen,params.flags);
552 
553  if (ret < 0)
554  {
555  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
556  }
557  else
558  {
559  ATCmd_commandResult(ATCmdHttp_sendReqResult,NULL,ret);
560  ATCmd_okResult();
561  }
562 
563  ATCmdHttp_sendReqFree(&params);
564 
565  return ret;
566 }
567 
568 /*
569  Free allocated memory for HTTP client read response body command
570 */
571 int32_t ATCmdHttp_respBodyFree(ATCmdHttp_RespBody_t *params)
572 {
573  if (params != NULL)
574  {
575  if (params->body!= NULL)
576  {
577  free(params->body);
578  }
579  free(params);
580  }
581  return 0;
582 }
583 
584 
585 /*
586  Parse HTTP client read response body command.
587 */
588 int32_t ATCmdHttp_respBodyParse(char *buff, ATCmdHttp_RespBody_t *params)
589 {
590  int32_t ret = 0;
591 
592  /* data format */
593  if ((ret = StrMpl_getVal(&buff, &params->format , ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_8)) < 0)
594  {
595  return ret;
596  }
597 
598  /* data length */
599  if ((ret = StrMpl_getVal(&buff, &params->len, ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_32 )) < 0)
600  {
601  return ret;
602  }
603 
604  return ret;
605 }
606 
607 /*
608  Compose and send HTTP client read response body result.
609 */
610 int32_t ATCmdHttp_respBodyResult(void *args, int32_t num, char *buff)
611 {
612  ATCmdHttp_RespBody_t *params = (ATCmdHttp_RespBody_t *)args;
613  uint32_t outputLen;
614 
615  StrMpl_setStr(ATCmd_httpReadResBodyStr,&buff,ATCMD_DELIM_EVENT);
616 
617  /* handle index */
618  StrMpl_setVal(&params->index, &buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_32 |STRMPL_FLAG_PARAM_UNSIGNED|STRMPL_FLAG_PARAM_DEC);
619 
620  /* more data flag */
621  StrMpl_setVal(&params->moreDataflag, &buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_8 |STRMPL_FLAG_PARAM_UNSIGNED|STRMPL_FLAG_PARAM_DEC);
622 
623  /* format */
624  StrMpl_setVal(&params->format, &buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_8 |STRMPL_FLAG_PARAM_UNSIGNED|STRMPL_FLAG_PARAM_DEC);
625 
626  outputLen = params->len;
627  if (params->format == ATCMD_DATA_FORMAT_BASE64)
628  {
629  /* convert length from binary to base64 */
630  outputLen = StrMpl_getBase64EncBufSize(params->len);
631  }
632  /* length */
633  StrMpl_setVal(&outputLen,&buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_DEC | STRMPL_FLAG_PARAM_SIZE_32 | STRMPL_FLAG_PARAM_UNSIGNED);
634 
635  /* body */
636  if (params->format == ATCMD_DATA_FORMAT_BASE64)
637  {
638  /* convert data to base64 */
639  StrMpl_encodeBase64((uint8_t *)params->body, params->len, (uint8_t *)buff, &outputLen);
640  }
641  else
642  {
643  memcpy(buff,params->body,params->len);
644  }
645  ATCmdHttp_respBodyFree(params);
646 
647  return 0;
648 }
649 
650 /*
651  HTTP client read response body callback.
652 */
653 int32_t ATCmdHttp_respBodyCallback(void *arg)
654 {
655  int32_t ret = 0;
656  ATCmdHttp_RespBody_t *params;
657  HTTPClient_Handle handle;
658 
659  params = malloc(sizeof(ATCmdHttp_RespBody_t));
660  if (params == NULL)
661  {
662  ATCmd_errorResult(ATCmd_errorAllocStr,ret);
663  return -1;
664  }
665  memset(params, 0x0, sizeof(ATCmdHttp_RespBody_t));
666 
667  handle = ATCmdHttp_clientIndexParse((char **)&arg,&params->index,ATCMD_DELIM_ARG);
668  if (handle == NULL)
669  {
670  ATCmd_errorResult(ATCmd_errorParseStr,STRMPL_ERROR_WRONG_PARAM);
671  return -1;
672  }
673 
674 
675  /* Call the command parser */
676  ret = ATCmdHttp_respBodyParse((char *)arg,params);
677 
678  if(ret < 0)
679  {
680  ATCmd_errorResult(ATCmd_errorParseStr,ret);
681  ATCmdHttp_respBodyFree(params);
682  return -1;
683  }
684 
685  params->body = malloc (params->len);
686  if (params->body == NULL)
687  {
688  ATCmd_errorResult(ATCmd_errorAllocStr,0);
689  ATCmdHttp_respBodyFree(params);
690  return -1;
691  }
692 
693  ret = HTTPClient_readResponseBody(handle, params->body, params->len, (bool *)&params->moreDataflag);
694 
695  if (ret < 0)
696  {
697  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
698  ATCmdHttp_respBodyFree(params);
699  }
700  else
701  {
702  params->len = ret;
703  ATCmd_commandResult(ATCmdHttp_respBodyResult,params,0);
704  ATCmd_okResult();
705  }
706 
707 
708  return ret;
709 }
710 
711 
712 /*
713  Free allocated memory for HTTP client set header command
714 */
715 int32_t ATCmdHttp_setHeaderFree(ATCmdHttp_Header_t *params)
716 {
717  if (params->value != NULL)
718  {
719  free(params->value);
720  }
721  return 0;
722 }
723 
724 /*
725  Parse HTTP client set header command.
726 */
727 int32_t ATCmdHttp_setHeaderParse(char *buff, ATCmdHttp_Header_t *params)
728 {
729  int32_t ret = 0;
730  uint16_t outputLen = 0;
731 
732  /* option */
733  if ((ret = StrMpl_getListVal(ATCmd_httpHeaderOption, sizeof(ATCmd_httpHeaderOption)/sizeof(StrMpl_List_t), &buff, &params->option, ATCMD_DELIM_ARG, STRMPL_FLAG_PARAM_SIZE_32)) < 0)
734  {
735  return ret;
736  }
737 
738  /* flags */
739  if ((ret = StrMpl_getListVal(ATCmd_httpSetHeaderFlags, sizeof(ATCmd_httpSetHeaderFlags)/sizeof(StrMpl_List_t), &buff, &params->flags, ATCMD_DELIM_ARG, STRMPL_FLAG_PARAM_SIZE_32)) < 0)
740  {
741  return ret;
742  }
743 
744  /* data format */
745  if ((ret = StrMpl_getVal(&buff, &params->format , ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_8)) < 0)
746  {
747  return ret;
748  }
749 
750  /* data length */
751  if ((ret = StrMpl_getVal(&buff, &params->len, ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_32 )) < 0)
752  {
753  if (ret != STRMPL_ERROR_PARAM_MISSING)
754  {
755  return ret;
756  }
757  params->len = 0;
758  ret = 0;
759  }
760 
761  if(params->len > 0)
762  {
763  /* data */
764  if (params->format == ATCMD_DATA_FORMAT_BASE64)
765  {
766  /* convert length to binary length */
767  outputLen = StrMpl_getBase64DecBufSize((uint8_t *)buff,params->len);
768  params->value = malloc(outputLen);
769  if (params->value == NULL)
770  {
771  return -1;
772  }
773  if (StrMpl_decodeBase64((uint8_t *)buff, params->len, params->value, (uint32_t *)&outputLen) < 0)
774  {
775  return -1;
776  }
777  params->len = outputLen;
778  }
779  else
780  {
781  //add 1 for the null termination
782  params->value = malloc(params->len+1);
783  if (params->value == NULL)
784  {
785  return -1;
786  }
787 
788  memcpy(params->value, buff, params->len);
789  ((char *)(params->value))[params->len] = '\0';
790  //add 1 for the null termination
791  params->len = params->len + 1;
792  }
793  }
794  else
795  {
796  params->value = NULL;
797  }
798  return ret;
799 }
800 
801 
802 /*
803  HTTP client set header callback.
804 */
805 int32_t ATCmdHttp_setHeaderCallback(void *arg)
806 {
807  int32_t ret = 0;
808  ATCmdHttp_Header_t params;
809  HTTPClient_Handle handle;
810 
811  handle = ATCmdHttp_clientIndexParse((char **)&arg,&params.index,ATCMD_DELIM_ARG);
812  if (handle == NULL)
813  {
814  ATCmd_errorResult(ATCmd_errorParseStr,STRMPL_ERROR_WRONG_PARAM);
815  return -1;
816  }
817 
818  memset(&params, 0x0, sizeof(ATCmdHttp_Header_t));
819 
820  /* Call the command parser */
821  ret = ATCmdHttp_setHeaderParse((char *)arg, &params);
822 
823  if (ret < 0)
824  {
825  ATCmd_errorResult(ATCmd_errorParseStr,ret);
826  ATCmdHttp_setHeaderFree(&params);
827  return -1;
828  }
829 
830  ret = HTTPClient_setHeader(handle,params.option,params.value,params.len,params.flags);
831 
832  if (ret < 0)
833  {
834  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
835  }
836  else
837  {
838  ATCmd_okResult();
839  }
840 
841  ATCmdHttp_setHeaderFree(&params);
842 
843  return ret;
844 }
845 
846 /*
847  Free allocated memory for HTTP client get header command
848 */
849 int32_t ATCmdHttp_getHeaderFree(ATCmdHttp_Header_t *params)
850 {
851  if (params != NULL)
852  {
853  if (params->value != NULL)
854  {
855  free(params->value);
856  }
857  free(params);
858  }
859  return 0;
860 }
861 
862 
863 /*
864  Parse HTTP client get header command.
865 */
866 int32_t ATCmdHttp_getHeaderParse(char *buff, ATCmdHttp_Header_t *params)
867 {
868  int32_t ret = 0;
869 
870  /* option */
871  if ((ret = StrMpl_getListVal(ATCmd_httpHeaderOption, sizeof(ATCmd_httpHeaderOption)/sizeof(StrMpl_List_t), &buff, &params->option, ATCMD_DELIM_ARG, STRMPL_FLAG_PARAM_SIZE_32)) < 0)
872  {
873  return ret;
874  }
875 
876  /* data format */
877  if ((ret = StrMpl_getVal(&buff, &params->format , ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_8)) < 0)
878  {
879  return ret;
880  }
881 
882  /* data length */
883  if ((ret = StrMpl_getVal(&buff, &params->len, ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_32 )) < 0)
884  {
885  return ret;
886  }
887 
888  return ret;
889 }
890 
891 /*
892  Compose and send HTTP client get header result.
893 */
894 int32_t ATCmdHttp_getHeaderResult(void *args, int32_t num, char *buff)
895 {
896  ATCmdHttp_Header_t *params = (ATCmdHttp_Header_t *)args;
897  uint32_t outputLen;
898 
899  StrMpl_setStr(ATCmd_httpGetHeaderStr,&buff,ATCMD_DELIM_EVENT);
900 
901  /* handle index */
902  StrMpl_setVal(&params->index, &buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_32 |STRMPL_FLAG_PARAM_UNSIGNED|STRMPL_FLAG_PARAM_DEC);
903 
904  /* format */
905  StrMpl_setVal(&params->format, &buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_8 |STRMPL_FLAG_PARAM_UNSIGNED|STRMPL_FLAG_PARAM_DEC);
906 
907  outputLen = params->len;
908  if (params->format == ATCMD_DATA_FORMAT_BASE64)
909  {
910  /* convert length from binary to base64 */
911  outputLen = StrMpl_getBase64EncBufSize(params->len);
912  }
913  /* length */
914  StrMpl_setVal(&outputLen,&buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_DEC | STRMPL_FLAG_PARAM_SIZE_32 | STRMPL_FLAG_PARAM_UNSIGNED);
915 
916  /* value */
917  if (params->format == ATCMD_DATA_FORMAT_BASE64)
918  {
919  /* convert data to base64 */
920  StrMpl_encodeBase64((uint8_t *)params->value, params->len, (uint8_t *)buff, &outputLen);
921  }
922  else
923  {
924  memcpy(buff,params->value,params->len);
925  }
926  ATCmdHttp_getHeaderFree(params);
927 
928  return 0;
929 }
930 
931 /*
932  HTTP client get header callback.
933 */
934 int32_t ATCmdHttp_getHeaderCallback(void *arg)
935 {
936  int32_t ret = 0;
937  ATCmdHttp_Header_t *params;
938  HTTPClient_Handle handle;
939 
940  params = malloc(sizeof(ATCmdHttp_Header_t));
941  if (params == NULL)
942  {
943  ATCmd_errorResult(ATCmd_errorAllocStr,ret);
944  return -1;
945  }
946  memset(params, 0x0, sizeof(ATCmdHttp_Header_t));
947 
948  handle = ATCmdHttp_clientIndexParse((char **)&arg,&params->index,ATCMD_DELIM_ARG);
949  if (handle == NULL)
950  {
951  ATCmd_errorResult(ATCmd_errorParseStr,STRMPL_ERROR_WRONG_PARAM);
952  return -1;
953  }
954 
955 
956  /* Call the command parser */
957  ret = ATCmdHttp_getHeaderParse((char *)arg,params);
958 
959  if(ret < 0)
960  {
961  ATCmd_errorResult(ATCmd_errorParseStr,ret);
962  ATCmdHttp_getHeaderFree(params);
963  return -1;
964  }
965 
966  params->value = malloc (params->len);
967  if (params->value == NULL)
968  {
969  ATCmd_errorResult(ATCmd_errorAllocStr,0);
970  ATCmdHttp_getHeaderFree(params);
971  return -1;
972  }
973 
974  ret = HTTPClient_getHeader(handle, params->option, params->value, &params->len, params->flags);
975 
976  if (ret < 0)
977  {
978  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
979  ATCmdHttp_getHeaderFree(params);
980  }
981  else
982  {
983  ATCmd_commandResult(ATCmdHttp_getHeaderResult,params,0);
984  ATCmd_okResult();
985  }
986 
987 
988  return ret;
989 }
990 
991 /*
992  Parse HTTP client set option command.
993 */
994 int32_t ATCmdHttp_setOptParse(char *buff, ATCmdHttp_Opt_t *params)
995 {
996  int32_t ret = 0;
997 
998  /* option */
999  if ((ret = StrMpl_getListVal(ATCmd_httpOptOption, sizeof(ATCmd_httpOptOption)/sizeof(StrMpl_List_t), &buff, &params->option, ATCMD_DELIM_ARG, STRMPL_FLAG_PARAM_SIZE_32)) < 0)
1000  {
1001  return ret;
1002  }
1003 
1004  /* value */
1005  if ((ret = StrMpl_getVal(&buff, &params->value, ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_32 )) < 0)
1006  {
1007  return ret;
1008  }
1009 
1010  return ret;
1011 }
1012 
1013 
1014 /*
1015  HTTP client set option callback.
1016 */
1017 int32_t ATCmdHttp_setOptCallback(void *arg)
1018 {
1019  int32_t ret = 0;
1020  ATCmdHttp_Opt_t params;
1021  uint32_t index;
1022  HTTPClient_Handle handle;
1023 
1024  handle = ATCmdHttp_clientIndexParse((char **)&arg,&index,ATCMD_DELIM_ARG);
1025  if (handle == NULL)
1026  {
1027  ATCmd_errorResult(ATCmd_errorParseStr,STRMPL_ERROR_WRONG_PARAM);
1028  return -1;
1029  }
1030 
1031  memset(&params, 0x0, sizeof(ATCmdHttp_Opt_t));
1032 
1033  /* Call the command parser */
1034  ret = ATCmdHttp_setOptParse((char *)arg, &params);
1035 
1036  if (ret < 0)
1037  {
1038  ATCmd_errorResult(ATCmd_errorParseStr,ret);
1039  return -1;
1040  }
1041 
1042  ret = HTTPClient_setOpt(handle,params.option,(void *)&params.value,params.len,params.flags);
1043 
1044  if (ret < 0)
1045  {
1046  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
1047  }
1048  else
1049  {
1050  ATCmd_okResult();
1051  }
1052 
1053  return ret;
1054 }
1055 
1056 /*
1057  Parse HTTP client set proxy command.
1058 */
1059 int32_t ATCmdHttp_setProxyParse(char *buff, ATCmdHttp_Proxy_t *params)
1060 {
1061  int32_t ret = 0;
1062  void *addr = &params->addr;
1063  uint8_t ip[4];
1064 
1065  /* family */
1066  if ((ret = StrMpl_getListVal(ATCmd_sockDomain, sizeof(ATCmd_sockDomain)/sizeof(StrMpl_List_t), &buff, &params->addr.sa_family, ATCMD_DELIM_ARG, STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
1067  {
1068  return ret;
1069  }
1070 
1071  if (params->addr.sa_family == SL_AF_INET)
1072  {
1073  /* port */
1074  if ((ret = StrMpl_getVal(&buff, &((SlSockAddrIn_t *)(addr))->sin_port, ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
1075  {
1076  return ret;
1077  }
1078  ((SlSockAddrIn_t *)(addr))->sin_port = sl_Htons(((SlSockAddrIn_t *)(addr))->sin_port);
1079  /* address */
1080  if ((ret = StrMpl_getArrayVal(&buff,(void *)ip, 4, ATCMD_DELIM_TRM, ATCMD_DELIM_INTER, STRMPL_FLAG_PARAM_SIZE_8 ,ATCmd_excludeDelimArray)) < 0)
1081  {
1082  return ret;
1083  }
1084  ((SlSockAddrIn_t *)(addr))->sin_addr.s_addr = sl_Htonl(SL_IPV4_VAL(ip[0],ip[1],ip[2],ip[3]));
1085  }
1086  else if (params->addr.sa_family == SL_AF_INET6)
1087  {
1088  /* port */
1089  if ((ret = StrMpl_getVal(&buff, &((SlSockAddrIn6_t *)(addr))->sin6_port, ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
1090  {
1091  return ret;
1092  }
1093  ((SlSockAddrIn6_t *)(addr))->sin6_port = sl_Htons(((SlSockAddrIn6_t *)(addr))->sin6_port);
1094  /* address */
1095  if ((ret = StrMpl_getArrayVal(&buff, (void *)(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32), 4, ATCMD_DELIM_TRM, ATCMD_DELIM_ARRAY,STRMPL_FLAG_PARAM_SIZE_32,ATCmd_excludeDelimArray)) < 0)
1096  {
1097  return ret;
1098  }
1099  ((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[0] = sl_Htonl(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[0]);
1100  ((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[1] = sl_Htonl(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[1]);
1101  ((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[2] = sl_Htonl(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[2]);
1102  ((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[3] = sl_Htonl(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[3]);
1103  }
1104 
1105  return ret;
1106 }
1107 
1108 
1109 /*
1110  HTTP client set proxy callback.
1111 */
1112 int32_t ATCmdHttp_setProxyCallback(void *arg)
1113 {
1114  int32_t ret = 0;
1115  ATCmdHttp_Proxy_t params;
1116 
1117  memset(&params, 0x0, sizeof(ATCmdHttp_Proxy_t));
1118 
1119  /* Call the command parser */
1120  ret = ATCmdHttp_setProxyParse((char *)arg, &params);
1121 
1122  if (ret < 0)
1123  {
1124  ATCmd_errorResult(ATCmd_errorParseStr,ret);
1125  return -1;
1126  }
1127 
1128  HTTPClient_setProxy(&params.addr);
1129 
1130  ATCmd_okResult();
1131 
1132  return ret;
1133 }
1134 
1135 
int32_t ATCmdHttp_setHeaderCallback(void *arg)
Http Client Set header callback.
Definition: atcmd_http.c:805
int32_t ATCmdHttp_disconnectCallback(void *arg)
Http Client Disconnect callback.
Definition: atcmd_http.c:358
int32_t ATCmdHttp_sendReqCallback(void *arg)
Http Client send request callback.
Definition: atcmd_http.c:527
int32_t ATCmdHttp_getHeaderCallback(void *arg)
Http Client Get header callback.
Definition: atcmd_http.c:934
int32_t ATCmdHttp_setProxyCallback(void *arg)
Http Client Set proxy callback.
Definition: atcmd_http.c:1112
int32_t ATCmdHttp_connectCallback(void *arg)
Http Client Connect callback.
Definition: atcmd_http.c:318
int32_t ATCmdHttp_createCallback(void *arg)
Http Client Create callback.
Definition: atcmd_http.c:177
int32_t ATCmdHttp_destroyCallback(void *arg)
Http Client destroy callback.
Definition: atcmd_http.c:211
int32_t ATCmdHttp_respBodyCallback(void *arg)
Http Client response callback.
Definition: atcmd_http.c:653
int32_t ATCmdHttp_setOptCallback(void *arg)
Http Client Set callback.
Definition: atcmd_http.c:1017