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  HTTPClient_destroy(handle);
196  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
197  return -1;
198  }
199  else
200  {
201  ATCmdHttp_mapHanlde[index] = handle;
202  ATCmd_commandResult(ATCmdHttp_createResult,NULL,index);
203  ATCmd_okResult();
204  }
205  }
206  return 0;
207 }
208 
209 /*
210  HTTP client destroy callback.
211 */
212 int32_t ATCmdHttp_destroyCallback(void *arg)
213 {
214  int32_t ret = 0;
215  uint32_t index;
216  HTTPClient_Handle handle;
217 
218  /* parse client index */
219  handle = ATCmdHttp_clientIndexParse((char **)&arg,&index,ATCMD_DELIM_TRM);
220  if (handle == NULL)
221  {
222  ATCmd_errorResult(ATCmd_errorParseStr,STRMPL_ERROR_WRONG_PARAM);
223  return -1;
224  }
225 
226  ret = HTTPClient_destroy(handle);
227 
228  if (ret < 0)
229  {
230  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
231  }
232  else
233  {
234  ATCmdHttp_mapHanlde[index] = 0;
235  ATCmd_okResult();
236  }
237  return ret;
238 }
239 
240 /*
241  Free allocated memory for HTTP client connect command
242 */
243 int32_t ATCmdHttp_connectFree(ATCmdHttp_Connect_t *params)
244 {
245 
246  if (params->hostName != NULL)
247  {
248  free(params->hostName);
249  }
250  if (params->exSecParams.clientCert != NULL)
251  {
252  free((void *)params->exSecParams.clientCert);
253  }
254  if (params->exSecParams.privateKey != NULL)
255  {
256  free((void *)params->exSecParams.privateKey);
257  }
258  if (params->exSecParams.rootCa != NULL)
259  {
260  free((void *)params->exSecParams.rootCa);
261  }
262 
263  return 0;
264 }
265 
266 /*
267  Parse HTTP client connect command.
268 */
269 int32_t ATCmdHttp_connectParse(char *buff, ATCmdHttp_Connect_t *params)
270 {
271  int32_t ret = 0;
272 
273  /* host name */
274  if ((ret = StrMpl_getAllocStr(&buff, &params->hostName, ATCMD_DELIM_ARG, ATCMDHTTP_CONNECT_MAX_HOST_NAME ,ATCmd_excludeDelimStr)) < 0)
275  {
276  return ret;
277  }
278 
279  /* flags */
280  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)
281  {
282  if (ret != STRMPL_ERROR_PARAM_MISSING)
283  {
284  return ret;
285  }
286  }
287  /* Private key */
288  if ((ret = StrMpl_getAllocStr(&buff, (char **)&params->exSecParams.privateKey, ATCMD_DELIM_ARG, 0xFF ,ATCmd_excludeDelimStr)) < 0)
289  {
290  if (ret != STRMPL_ERROR_PARAM_MISSING)
291  {
292  return ret;
293  }
294  }
295  /* Client certificate */
296  if ((ret = StrMpl_getAllocStr(&buff, (char **)&params->exSecParams.clientCert, ATCMD_DELIM_ARG, 0xFF ,ATCmd_excludeDelimStr)) < 0)
297  {
298  if (ret != STRMPL_ERROR_PARAM_MISSING)
299  {
300  return ret;
301  }
302  }
303  /* Root CA */
304  if ((ret = StrMpl_getAllocStr(&buff, (char **)&params->exSecParams.rootCa, ATCMD_DELIM_TRM, 0xFF ,ATCmd_excludeDelimStr)) < 0)
305  {
306  if (ret != STRMPL_ERROR_PARAM_MISSING)
307  {
308  return ret;
309  }
310  ret = 0;
311  }
312 
313  return ret;
314 }
315 
316 /*
317  HTTP client connect callback.
318 */
319 int32_t ATCmdHttp_connectCallback(void *arg)
320 {
321  int32_t ret = 0;
322  uint32_t index;
323  HTTPClient_Handle handle;
324  ATCmdHttp_Connect_t params;
325 
326  handle = ATCmdHttp_clientIndexParse((char **)&arg,&index,ATCMD_DELIM_ARG);
327  if (handle == NULL)
328  {
329  ATCmd_errorResult(ATCmd_errorParseStr,STRMPL_ERROR_WRONG_PARAM);
330  return -1;
331  }
332  memset(&params,0,sizeof(ATCmdHttp_Connect_t));
333  ret = ATCmdHttp_connectParse((char *)arg,&params);
334 
335  if(ret < 0)
336  {
337  ATCmd_errorResult(ATCmd_errorParseStr,ret);
338  ATCmdHttp_connectFree(&params);
339  return -1;
340  }
341  ret = HTTPClient_connect(handle,params.hostName,&params.exSecParams,params.flags);
342 
343  if (ret < 0)
344  {
345  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
346  }
347  else
348  {
349  ATCmd_okResult();
350  }
351 
352  ATCmdHttp_connectFree(&params);
353  return ret;
354 }
355 
356 /*
357  HTTP client disconnect callback.
358 */
360 {
361  int32_t ret = 0;
362  uint32_t index;
363  HTTPClient_Handle handle;
364 
365  handle = ATCmdHttp_clientIndexParse((char **)&arg,&index,ATCMD_DELIM_TRM);
366  if (handle == NULL)
367  {
368  ATCmd_errorResult(ATCmd_errorParseStr,STRMPL_ERROR_WRONG_PARAM);
369  return -1;
370  }
371  ret = HTTPClient_disconnect(handle);
372 
373  if (ret < 0)
374  {
375  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
376  }
377  else
378  {
379  ATCmd_okResult();
380  }
381 
382  return ret;
383 }
384 
385 /*
386  Free allocated memory for HTTP client send request command
387 */
388 int32_t ATCmdHttp_sendReqFree(ATCmdHttp_SendReq_t *params)
389 {
390  if (params->requestURI != NULL)
391  {
392  free(params->requestURI);
393  }
394 
395  if (params->body!= NULL)
396  {
397  free(params->body);
398  }
399 
400  return 0;
401 }
402 
403 
404 /*
405  Parse HTTP client send request command.
406 */
407 int32_t ATCmdHttp_sendReqParse(char *buff, ATCmdHttp_SendReq_t *params)
408 {
409  int32_t ret = 0;
410  uint16_t outputLen = 0;
411  uint32_t method;
412 
413  /* method */
414  if ((ret = StrMpl_getListVal(ATCmd_httpSendReqMethod, sizeof(ATCmd_httpSendReqMethod)/sizeof(StrMpl_List_t), &buff, &method, ATCMD_DELIM_ARG, STRMPL_FLAG_PARAM_SIZE_32)) < 0)
415  {
416  return ret;
417  }
418  switch (method)
419  {
420  case ATCMDHTTP_METHOD_GET:
421  params->method = (char *)HTTP_METHOD_GET;
422  break;
423  case ATCMDHTTP_METHOD_POST:
424  params->method = (char *)HTTP_METHOD_POST;
425  break;
426  case ATCMDHTTP_METHOD_HEAD:
427  params->method = (char *)HTTP_METHOD_HEAD;
428  break;
429  case ATCMDHTTP_METHOD_OPTIONS:
430  params->method = (char *)HTTP_METHOD_OPTIONS;
431  break;
432  case ATCMDHTTP_METHOD_PUT:
433  params->method = (char *)HTTP_METHOD_PUT;
434  break;
435  case ATCMDHTTP_METHOD_DELETE:
436  params->method = (char *)HTTP_METHOD_DELETE;
437  break;
438  case ATCMDHTTP_METHOD_CONNECT:
439  params->method = (char *)HTTP_METHOD_CONNECT;
440  break;
441  }
442  /* request URI */
443  if ((ret = StrMpl_getAllocStr(&buff, (char **)&(params->requestURI), ATCMD_DELIM_ARG, 0xFFFF ,ATCmd_excludeDelimStr)) < 0)
444  {
445  return ret;
446  }
447 
448  /* flags */
449  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)
450  {
451  if (ret != STRMPL_ERROR_PARAM_MISSING)
452  {
453  return ret;
454  }
455  }
456 
457  /* data format */
458  if ((ret = StrMpl_getVal(&buff, &params->bodyFormat , ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_8)) < 0)
459  {
460  if (ret != STRMPL_ERROR_PARAM_MISSING)
461  {
462  return ret;
463  }
464  params->bodyFormat = 0;
465  }
466 
467  /* data length */
468  if ((ret = StrMpl_getVal(&buff, &params->bodyLen, ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_32 )) < 0)
469  {
470  if ((ret != STRMPL_ERROR_PARAM_MISSING) ||
471  ((ret == STRMPL_ERROR_PARAM_MISSING) &&
472  ((params->method == HTTP_METHOD_POST) ||
473  (params->method == HTTP_METHOD_PUT))))
474  {
475  return ret;
476  }
477  params->bodyLen = 0;
478  ret = 0;
479  }
480 
481  if(params->bodyLen > 0)
482  {
483  /* data */
484  if (params->bodyFormat == ATCMD_DATA_FORMAT_BASE64)
485  {
486  /* convert length to binary length */
487  outputLen = StrMpl_getBase64DecBufSize((uint8_t *)buff,params->bodyLen);
488  params->body = malloc(outputLen);
489  if (params->body == NULL)
490  {
491  return -1;
492  }
493  if (StrMpl_decodeBase64((uint8_t *)buff, params->bodyLen, (uint8_t *)params->body, (uint32_t *)&outputLen) < 0)
494  {
495  return -1;
496  }
497  params->bodyLen = outputLen;
498  }
499  else
500  {
501  params->body = malloc(params->bodyLen);
502  if (params->body == NULL)
503  {
504  return -1;
505  }
506 
507  memcpy(params->body, buff, params->bodyLen);
508  }
509  }
510  return ret;
511 }
512 
513 /*
514  Compose and send HTTP client send request result.
515 */
516 int32_t ATCmdHttp_sendReqResult(void *args, int32_t num, char *buff)
517 {
518 
519  StrMpl_setStr(ATCmd_httpSendReqStr,&buff,ATCMD_DELIM_EVENT);
520  StrMpl_setVal(&num,&buff,ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_16|STRMPL_FLAG_PARAM_DEC|STRMPL_FLAG_PARAM_SIGNED);
521 
522  return 0;
523 }
524 
525 /*
526  HTTP client send request callback.
527 */
528 int32_t ATCmdHttp_sendReqCallback(void *arg)
529 {
530  int32_t ret = 0;
531  ATCmdHttp_SendReq_t params;
532  uint32_t index;
533  HTTPClient_Handle handle;
534 
535  handle = ATCmdHttp_clientIndexParse((char **)&arg,&index,ATCMD_DELIM_ARG);
536  if (handle == NULL)
537  {
538  ATCmd_errorResult(ATCmd_errorParseStr,STRMPL_ERROR_WRONG_PARAM);
539  return -1;
540  }
541  memset(&params, 0x0, sizeof(ATCmdHttp_SendReq_t));
542 
543  /* Call the command parser */
544  ret = ATCmdHttp_sendReqParse((char *)arg,&params);
545 
546  if(ret < 0)
547  {
548  ATCmd_errorResult(ATCmd_errorParseStr,ret);
549  ATCmdHttp_sendReqFree(&params);
550  return -1;
551  }
552  ret = HTTPClient_sendRequest(handle,params.method,params.requestURI,params.body,params.bodyLen,params.flags);
553 
554  if (ret < 0)
555  {
556  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
557  }
558  else
559  {
560  ATCmd_commandResult(ATCmdHttp_sendReqResult,NULL,ret);
561  ATCmd_okResult();
562  }
563 
564  ATCmdHttp_sendReqFree(&params);
565 
566  return ret;
567 }
568 
569 /*
570  Free allocated memory for HTTP client read response body command
571 */
572 int32_t ATCmdHttp_respBodyFree(ATCmdHttp_RespBody_t *params)
573 {
574  if (params != NULL)
575  {
576  if (params->body!= NULL)
577  {
578  free(params->body);
579  }
580  free(params);
581  }
582  return 0;
583 }
584 
585 
586 /*
587  Parse HTTP client read response body command.
588 */
589 int32_t ATCmdHttp_respBodyParse(char *buff, ATCmdHttp_RespBody_t *params)
590 {
591  int32_t ret = 0;
592 
593  /* data format */
594  if ((ret = StrMpl_getVal(&buff, &params->format , ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_8)) < 0)
595  {
596  return ret;
597  }
598 
599  /* data length */
600  if ((ret = StrMpl_getVal(&buff, &params->len, ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_32 )) < 0)
601  {
602  return ret;
603  }
604 
605  return ret;
606 }
607 
608 /*
609  Compose and send HTTP client read response body result.
610 */
611 int32_t ATCmdHttp_respBodyResult(void *args, int32_t num, char *buff)
612 {
613  ATCmdHttp_RespBody_t *params = (ATCmdHttp_RespBody_t *)args;
614  uint32_t outputLen;
615 
616  StrMpl_setStr(ATCmd_httpReadResBodyStr,&buff,ATCMD_DELIM_EVENT);
617 
618  /* handle index */
619  StrMpl_setVal(&params->index, &buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_32 |STRMPL_FLAG_PARAM_UNSIGNED|STRMPL_FLAG_PARAM_DEC);
620 
621  /* more data flag */
622  StrMpl_setVal(&params->moreDataflag, &buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_8 |STRMPL_FLAG_PARAM_UNSIGNED|STRMPL_FLAG_PARAM_DEC);
623 
624  /* format */
625  StrMpl_setVal(&params->format, &buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_8 |STRMPL_FLAG_PARAM_UNSIGNED|STRMPL_FLAG_PARAM_DEC);
626 
627  outputLen = params->len;
628  if (params->format == ATCMD_DATA_FORMAT_BASE64)
629  {
630  /* convert length from binary to base64 */
631  outputLen = StrMpl_getBase64EncBufSize(params->len);
632  }
633  /* length */
634  StrMpl_setVal(&outputLen,&buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_DEC | STRMPL_FLAG_PARAM_SIZE_32 | STRMPL_FLAG_PARAM_UNSIGNED);
635 
636  /* body */
637  if (params->format == ATCMD_DATA_FORMAT_BASE64)
638  {
639  /* convert data to base64 */
640  StrMpl_encodeBase64((uint8_t *)params->body, params->len, (uint8_t *)buff, &outputLen);
641  }
642  else
643  {
644  memcpy(buff,params->body,params->len);
645  }
646  ATCmdHttp_respBodyFree(params);
647 
648  return 0;
649 }
650 
651 /*
652  HTTP client read response body callback.
653 */
654 int32_t ATCmdHttp_respBodyCallback(void *arg)
655 {
656  int32_t ret = 0;
657  ATCmdHttp_RespBody_t *params;
658  HTTPClient_Handle handle;
659 
660  params = malloc(sizeof(ATCmdHttp_RespBody_t));
661  if (params == NULL)
662  {
663  ATCmd_errorResult(ATCmd_errorAllocStr,ret);
664  return -1;
665  }
666  memset(params, 0x0, sizeof(ATCmdHttp_RespBody_t));
667 
668  handle = ATCmdHttp_clientIndexParse((char **)&arg,&params->index,ATCMD_DELIM_ARG);
669  if (handle == NULL)
670  {
671  ATCmd_errorResult(ATCmd_errorParseStr,STRMPL_ERROR_WRONG_PARAM);
672  ATCmdHttp_respBodyFree(params);
673  return -1;
674  }
675 
676 
677  /* Call the command parser */
678  ret = ATCmdHttp_respBodyParse((char *)arg,params);
679 
680  if(ret < 0)
681  {
682  ATCmd_errorResult(ATCmd_errorParseStr,ret);
683  ATCmdHttp_respBodyFree(params);
684  return -1;
685  }
686 
687  params->body = malloc (params->len);
688  if (params->body == NULL)
689  {
690  ATCmd_errorResult(ATCmd_errorAllocStr,0);
691  ATCmdHttp_respBodyFree(params);
692  return -1;
693  }
694 
695  ret = HTTPClient_readResponseBody(handle, params->body, params->len, (bool *)&params->moreDataflag);
696 
697  if (ret < 0)
698  {
699  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
700  ATCmdHttp_respBodyFree(params);
701  }
702  else
703  {
704  params->len = ret;
705  ATCmd_commandResult(ATCmdHttp_respBodyResult,params,0);
706  ATCmd_okResult();
707  }
708 
709 
710  return ret;
711 }
712 
713 
714 /*
715  Free allocated memory for HTTP client set header command
716 */
717 int32_t ATCmdHttp_setHeaderFree(ATCmdHttp_Header_t *params)
718 {
719  if (params->value != NULL)
720  {
721  free(params->value);
722  }
723  return 0;
724 }
725 
726 /*
727  Parse HTTP client set header command.
728 */
729 int32_t ATCmdHttp_setHeaderParse(char *buff, ATCmdHttp_Header_t *params)
730 {
731  int32_t ret = 0;
732  uint16_t outputLen = 0;
733 
734  /* option */
735  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)
736  {
737  return ret;
738  }
739 
740  /* flags */
741  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)
742  {
743  return ret;
744  }
745 
746  /* data format */
747  if ((ret = StrMpl_getVal(&buff, &params->format , ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_8)) < 0)
748  {
749  return ret;
750  }
751 
752  /* data length */
753  if ((ret = StrMpl_getVal(&buff, &params->len, ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_32 )) < 0)
754  {
755  if (ret != STRMPL_ERROR_PARAM_MISSING)
756  {
757  return ret;
758  }
759  params->len = 0;
760  ret = 0;
761  }
762 
763  if(params->len > 0)
764  {
765  /* data */
766  if (params->format == ATCMD_DATA_FORMAT_BASE64)
767  {
768  /* convert length to binary length */
769  outputLen = StrMpl_getBase64DecBufSize((uint8_t *)buff,params->len);
770  params->value = malloc(outputLen);
771  if (params->value == NULL)
772  {
773  return -1;
774  }
775  if (StrMpl_decodeBase64((uint8_t *)buff, params->len, params->value, (uint32_t *)&outputLen) < 0)
776  {
777  return -1;
778  }
779  params->len = outputLen;
780  }
781  else
782  {
783  //add 1 for the null termination
784  params->value = malloc(params->len+1);
785  if (params->value == NULL)
786  {
787  return -1;
788  }
789 
790  memcpy(params->value, buff, params->len);
791  ((char *)(params->value))[params->len] = '\0';
792  //add 1 for the null termination
793  params->len = params->len + 1;
794  }
795  }
796  else
797  {
798  params->value = NULL;
799  }
800  return ret;
801 }
802 
803 
804 /*
805  HTTP client set header callback.
806 */
807 int32_t ATCmdHttp_setHeaderCallback(void *arg)
808 {
809  int32_t ret = 0;
810  ATCmdHttp_Header_t params;
811  HTTPClient_Handle handle;
812 
813  handle = ATCmdHttp_clientIndexParse((char **)&arg,&params.index,ATCMD_DELIM_ARG);
814  if (handle == NULL)
815  {
816  ATCmd_errorResult(ATCmd_errorParseStr,STRMPL_ERROR_WRONG_PARAM);
817  return -1;
818  }
819 
820  memset(&params, 0x0, sizeof(ATCmdHttp_Header_t));
821 
822  /* Call the command parser */
823  ret = ATCmdHttp_setHeaderParse((char *)arg, &params);
824 
825  if (ret < 0)
826  {
827  ATCmd_errorResult(ATCmd_errorParseStr,ret);
828  ATCmdHttp_setHeaderFree(&params);
829  return -1;
830  }
831 
832  ret = HTTPClient_setHeader(handle,params.option,params.value,params.len,params.flags);
833 
834  if (ret < 0)
835  {
836  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
837  }
838  else
839  {
840  ATCmd_okResult();
841  }
842 
843  ATCmdHttp_setHeaderFree(&params);
844 
845  return ret;
846 }
847 
848 /*
849  Free allocated memory for HTTP client get header command
850 */
851 int32_t ATCmdHttp_getHeaderFree(ATCmdHttp_Header_t *params)
852 {
853  if (params != NULL)
854  {
855  if (params->value != NULL)
856  {
857  free(params->value);
858  }
859  free(params);
860  }
861  return 0;
862 }
863 
864 
865 /*
866  Parse HTTP client get header command.
867 */
868 int32_t ATCmdHttp_getHeaderParse(char *buff, ATCmdHttp_Header_t *params)
869 {
870  int32_t ret = 0;
871 
872  /* option */
873  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)
874  {
875  return ret;
876  }
877 
878  /* data format */
879  if ((ret = StrMpl_getVal(&buff, &params->format , ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_8)) < 0)
880  {
881  return ret;
882  }
883 
884  /* data length */
885  if ((ret = StrMpl_getVal(&buff, &params->len, ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_32 )) < 0)
886  {
887  return ret;
888  }
889 
890  return ret;
891 }
892 
893 /*
894  Compose and send HTTP client get header result.
895 */
896 int32_t ATCmdHttp_getHeaderResult(void *args, int32_t num, char *buff)
897 {
898  ATCmdHttp_Header_t *params = (ATCmdHttp_Header_t *)args;
899  uint32_t outputLen;
900 
901  StrMpl_setStr(ATCmd_httpGetHeaderStr,&buff,ATCMD_DELIM_EVENT);
902 
903  /* handle index */
904  StrMpl_setVal(&params->index, &buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_32 |STRMPL_FLAG_PARAM_UNSIGNED|STRMPL_FLAG_PARAM_DEC);
905 
906  /* format */
907  StrMpl_setVal(&params->format, &buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_8 |STRMPL_FLAG_PARAM_UNSIGNED|STRMPL_FLAG_PARAM_DEC);
908 
909  outputLen = params->len;
910  if (params->format == ATCMD_DATA_FORMAT_BASE64)
911  {
912  /* convert length from binary to base64 */
913  outputLen = StrMpl_getBase64EncBufSize(params->len);
914  }
915  /* length */
916  StrMpl_setVal(&outputLen,&buff,ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_DEC | STRMPL_FLAG_PARAM_SIZE_32 | STRMPL_FLAG_PARAM_UNSIGNED);
917 
918  /* value */
919  if (params->format == ATCMD_DATA_FORMAT_BASE64)
920  {
921  /* convert data to base64 */
922  StrMpl_encodeBase64((uint8_t *)params->value, params->len, (uint8_t *)buff, &outputLen);
923  }
924  else
925  {
926  memcpy(buff,params->value,params->len);
927  }
928  ATCmdHttp_getHeaderFree(params);
929 
930  return 0;
931 }
932 
933 /*
934  HTTP client get header callback.
935 */
936 int32_t ATCmdHttp_getHeaderCallback(void *arg)
937 {
938  int32_t ret = 0;
939  ATCmdHttp_Header_t *params;
940  HTTPClient_Handle handle;
941 
942  params = malloc(sizeof(ATCmdHttp_Header_t));
943  if (params == NULL)
944  {
945  ATCmd_errorResult(ATCmd_errorAllocStr,ret);
946  return -1;
947  }
948  memset(params, 0x0, sizeof(ATCmdHttp_Header_t));
949 
950  handle = ATCmdHttp_clientIndexParse((char **)&arg,&params->index,ATCMD_DELIM_ARG);
951  if (handle == NULL)
952  {
953  ATCmd_errorResult(ATCmd_errorParseStr,STRMPL_ERROR_WRONG_PARAM);
954  ATCmdHttp_getHeaderFree(params);
955  return -1;
956  }
957 
958 
959  /* Call the command parser */
960  ret = ATCmdHttp_getHeaderParse((char *)arg,params);
961 
962  if(ret < 0)
963  {
964  ATCmd_errorResult(ATCmd_errorParseStr,ret);
965  ATCmdHttp_getHeaderFree(params);
966  return -1;
967  }
968 
969  params->value = malloc (params->len);
970  if (params->value == NULL)
971  {
972  ATCmd_errorResult(ATCmd_errorAllocStr,0);
973  ATCmdHttp_getHeaderFree(params);
974  return -1;
975  }
976 
977  ret = HTTPClient_getHeader(handle, params->option, params->value, &params->len, params->flags);
978 
979  if (ret < 0)
980  {
981  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
982  ATCmdHttp_getHeaderFree(params);
983  }
984  else
985  {
986  ATCmd_commandResult(ATCmdHttp_getHeaderResult,params,0);
987  ATCmd_okResult();
988  }
989 
990 
991  return ret;
992 }
993 
994 /*
995  Parse HTTP client set option command.
996 */
997 int32_t ATCmdHttp_setOptParse(char *buff, ATCmdHttp_Opt_t *params)
998 {
999  int32_t ret = 0;
1000 
1001  /* option */
1002  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)
1003  {
1004  return ret;
1005  }
1006 
1007  /* value */
1008  if ((ret = StrMpl_getVal(&buff, &params->value, ATCMD_DELIM_TRM,STRMPL_FLAG_PARAM_SIZE_32 )) < 0)
1009  {
1010  return ret;
1011  }
1012 
1013  return ret;
1014 }
1015 
1016 
1017 /*
1018  HTTP client set option callback.
1019 */
1020 int32_t ATCmdHttp_setOptCallback(void *arg)
1021 {
1022  int32_t ret = 0;
1023  ATCmdHttp_Opt_t params;
1024  uint32_t index;
1025  HTTPClient_Handle handle;
1026 
1027  handle = ATCmdHttp_clientIndexParse((char **)&arg,&index,ATCMD_DELIM_ARG);
1028  if (handle == NULL)
1029  {
1030  ATCmd_errorResult(ATCmd_errorParseStr,STRMPL_ERROR_WRONG_PARAM);
1031  return -1;
1032  }
1033 
1034  memset(&params, 0x0, sizeof(ATCmdHttp_Opt_t));
1035 
1036  /* Call the command parser */
1037  ret = ATCmdHttp_setOptParse((char *)arg, &params);
1038 
1039  if (ret < 0)
1040  {
1041  ATCmd_errorResult(ATCmd_errorParseStr,ret);
1042  return -1;
1043  }
1044 
1045  ret = HTTPClient_setOpt(handle,params.option,(void *)&params.value,params.len,params.flags);
1046 
1047  if (ret < 0)
1048  {
1049  ATCmd_errorResult(ATCmd_errorCmdStr,ret);
1050  }
1051  else
1052  {
1053  ATCmd_okResult();
1054  }
1055 
1056  return ret;
1057 }
1058 
1059 /*
1060  Parse HTTP client set proxy command.
1061 */
1062 int32_t ATCmdHttp_setProxyParse(char *buff, ATCmdHttp_Proxy_t *params)
1063 {
1064  int32_t ret = 0;
1065  void *addr = &params->addr;
1066  uint8_t ip[4];
1067 
1068  /* family */
1069  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)
1070  {
1071  return ret;
1072  }
1073 
1074  if (params->addr.sa_family == SL_AF_INET)
1075  {
1076  /* port */
1077  if ((ret = StrMpl_getVal(&buff, &((SlSockAddrIn_t *)(addr))->sin_port, ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
1078  {
1079  return ret;
1080  }
1081  ((SlSockAddrIn_t *)(addr))->sin_port = sl_Htons(((SlSockAddrIn_t *)(addr))->sin_port);
1082  /* address */
1083  if ((ret = StrMpl_getArrayVal(&buff,(void *)ip, 4, ATCMD_DELIM_TRM, ATCMD_DELIM_INTER, STRMPL_FLAG_PARAM_SIZE_8 ,ATCmd_excludeDelimArray)) < 0)
1084  {
1085  return ret;
1086  }
1087  ((SlSockAddrIn_t *)(addr))->sin_addr.s_addr = sl_Htonl(SL_IPV4_VAL(ip[0],ip[1],ip[2],ip[3]));
1088  }
1089  else if (params->addr.sa_family == SL_AF_INET6)
1090  {
1091  /* port */
1092  if ((ret = StrMpl_getVal(&buff, &((SlSockAddrIn6_t *)(addr))->sin6_port, ATCMD_DELIM_ARG,STRMPL_FLAG_PARAM_SIZE_16 )) < 0)
1093  {
1094  return ret;
1095  }
1096  ((SlSockAddrIn6_t *)(addr))->sin6_port = sl_Htons(((SlSockAddrIn6_t *)(addr))->sin6_port);
1097  /* address */
1098  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)
1099  {
1100  return ret;
1101  }
1102  ((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[0] = sl_Htonl(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[0]);
1103  ((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[1] = sl_Htonl(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[1]);
1104  ((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[2] = sl_Htonl(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[2]);
1105  ((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[3] = sl_Htonl(((SlSockAddrIn6_t *)(addr))->sin6_addr._S6_un._S6_u32[3]);
1106  }
1107 
1108  return ret;
1109 }
1110 
1111 
1112 /*
1113  HTTP client set proxy callback.
1114 */
1115 int32_t ATCmdHttp_setProxyCallback(void *arg)
1116 {
1117  int32_t ret = 0;
1118  ATCmdHttp_Proxy_t params;
1119 
1120  memset(&params, 0x0, sizeof(ATCmdHttp_Proxy_t));
1121 
1122  /* Call the command parser */
1123  ret = ATCmdHttp_setProxyParse((char *)arg, &params);
1124 
1125  if (ret < 0)
1126  {
1127  ATCmd_errorResult(ATCmd_errorParseStr,ret);
1128  return -1;
1129  }
1130 
1131  HTTPClient_setProxy(&params.addr);
1132 
1133  ATCmd_okResult();
1134 
1135  return ret;
1136 }
1137 
1138 
int32_t ATCmdHttp_setHeaderCallback(void *arg)
Http Client Set header callback.
Definition: atcmd_http.c:807
int32_t ATCmdHttp_disconnectCallback(void *arg)
Http Client Disconnect callback.
Definition: atcmd_http.c:359
int32_t ATCmdHttp_sendReqCallback(void *arg)
Http Client send request callback.
Definition: atcmd_http.c:528
int32_t ATCmdHttp_getHeaderCallback(void *arg)
Http Client Get header callback.
Definition: atcmd_http.c:936
int32_t ATCmdHttp_setProxyCallback(void *arg)
Http Client Set proxy callback.
Definition: atcmd_http.c:1115
int32_t ATCmdHttp_connectCallback(void *arg)
Http Client Connect callback.
Definition: atcmd_http.c:319
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:212
int32_t ATCmdHttp_respBodyCallback(void *arg)
Http Client response callback.
Definition: atcmd_http.c:654
int32_t ATCmdHttp_setOptCallback(void *arg)
Http Client Set callback.
Definition: atcmd_http.c:1020