Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

In the first example below, the function HTTPc_ReqSend is called in the blocking mode. Therefore, the HTTPc Response object can be read just after the function call.

Code Block
languagecpp
titleListing - Retrieve HTTP Response Data Example Code #1
linenumberstrue
#define  HTTP_SERVER_HOSTNAME   "www.example.com"
#define  HTTPc_EX_CFG_BUF_SIZE   1024

/*
*********************************************************************************************************
*                                         HTTPcEx_ReqSendGET()
*
* Description : Example function to send a GET request and retrieve HTTP response.
*
* Argument(s) : None.
*
* Return(s)   : DEF_OK,   if HTTP transaction was successful.
*               DEF_FAIL, otherwise.
*********************************************************************************************************
*/

CPU_BOOLEAN  HTTPcEx_ReqSendGET (void)
{          
    HTTPc_CONN_OBJ   conn;
    HTTPc_REQ_OBJ    req;
    HTTPc_RESP_OBJ   resp;
    CPU_CHAR         buf[HTTPc_EX_CFG_BUF_SIZE];
    HTTPc_FLAGS      flags;
    CPU_SIZE_T       str_len;
    CPU_BOOLEAN      result;
    HTTPc_ERR        err;

                                                                /* ---------------- INIT NEW CONNECTION --------------- */
    HTTPc_ConnClr(&conn, &err);
    if (err != HTTPc_ERR_NONE) {
        return (DEF_FAIL);
    }

                                                                /* --------------- SET CONN'S CALLBACKS --------------- */
#if (HTTPc_CFG_MODE_ASYNC_TASK_EN == DEF_ENABLED)
    HTTPc_ConnSetParam(&conn,
                        HTTPc_PARAM_TYPE_CONN_CLOSE_CALLBACK,
                       &HTTPcEx_ConnCloseCallback,
                       &err);
    if (err != HTTPc_ERR_NONE) {
        return (DEF_FAIL);
    }
#endif

                                                                /* ----------------- INIT NEW REQUEST ----------------- */
    HTTPc_ReqClr(&req, &err);
    if (err != HTTPc_ERR_NONE) {
        return (DEF_FAIL);
    }

                                                                /* ------------- SET TRANS HOOK FUNCTIONS ------------- */
    HTTPc_ReqSetParam(&req, 
                       HTTPc_PARAM_TYPE_RESP_HDR_HOOK, 
                      &HTTPcEx_RespHdrHook, 
                      &err);
    if (err != HTTPc_ERR_NONE) {
        return (DEF_FAIL);
    }

    HTTPc_ReqSetParam(&req, 
                       HTTPc_PARAM_TYPE_RESP_BODY_HOOK, 
                      &HTTPcEx_RespBodyHook, 
                      &err);
    if (err != HTTPc_ERR_NONE) {
        return (DEF_FAIL);
    }

                                                                /* ---------- SET TRANS CALLBACK FUNCTIONS ------------ */
#if (HTTPc_CFG_MODE_ASYNC_TASK_EN == DEF_ENABLED)
    HTTPc_ReqSetParam(&req, 
                       HTTPc_PARAM_TYPE_TRANS_ERR_CALLBACK, 
                      &HTTPcEx_TransErrCallback, 
                      &err);
    if (err != HTTPc_ERR_NONE) {
        return (DEF_FAIL);
    }
#endif

                                                                /* ----------------- OPEN CONNECTION ------------------ */
    str_len = Str_Len(HTTP_SERVER_HOSTNAME);
    flags = HTTPc_FLAG_NONE;
    result = HTTPc_ConnOpen(&conn,
                            &buf,
                             HTTPc_EX_CFG_BUF_SIZE,
                             HTTP_SERVER_HOSTNAME,
                             str_len,
                             flags,
                            &err);
    if (err != HTTPc_ERR_NONE) {
        return (DEF_FAIL);
    }
    if (result == DEF_OK) {
        printf("Connection to server succeeded.\n\r");
    } else {
        printf("Connection to server failed.\n\r");
    }

                                                                /* ---------------- SEND HTTP REQUEST ----------------- */
    str_len = Str_Len("/");
    flags = HTTPc_FLAG_NONE;
    result = HTTPc_ReqSend(&conn,
                           &req,
                           &resp,
                           HTTP_METHOD_GET,
                           "/",
                           str_len,
                           flags,
                          &err);
    if (err != HTTPc_ERR_NONE) {
        return (DEF_FAIL);
    }
    if (result == DEF_OK) {
        printf("%s\n\r", p_resp->ReasonPhrasePtr);
    }

	return (DEF_OK);
}


No-Blocking Mode

In this second example, the function HTTPc_ReqSend is called in the no-blocking mode. Therefore, the HTTPc Response object can be read once the On Transaction Complete function was called.

Code Block
languagecpp
titleListing - Retrieve HTTP Response

...

Data Example Code #2
linenumberstrue
#define  HTTP_SERVER_HOSTNAME   "www.example.com"
#define  HTTPc_EX_CFG_BUF_SIZE   1024

HTTPc_CONN_OBJ  HTTPcEx_Conn;
HTTPc_REQ_OBJ   HTTPcEx_Req;
HTTPc_RESP_OBJ  HTTPcEx_Resp;
CPU_CHAR        HTTPcEx_ConnBuf[HTTPc_EX_CFG_BUF_SIZE];


/*
*********************************************************************************************************
*                                         HTTPcEx_ReqSendGET()
*
* Description : Example function to send a GET request and retrieve HTTP response.
*
* Argument(s) : None.
*
* Return(s)   : DEF_OK,   if HTTP transaction was successful.
*               DEF_FAIL, otherwise.
*********************************************************************************************************
*/

CPU_BOOLEAN  HTTPcEx_ReqSendGET (void)
{          
    HTTPc_CONN_OBJ   *p_conn;
    HTTPc_REQ_OBJ    *p_req;
    HTTPc_RESP_OBJ   *p_resp;
    CPU_CHAR         *p_buf;
    HTTPc_FLAGS       flags;
    CPU_SIZE_T        str_len;
    CPU_BOOLEAN       result;
    HTTPc_ERR         err;


    p_conn = &HTTPcEx_Conn;
    p_req  = &HTTPcEx_Req;
    p_resp = &HTTPcEx_Resp;
    p_buf  = &HTTPcEx_ConnBuf[0];

                                                                /* ---------------- INIT NEW CONNECTION --------------- */
    HTTPc_ConnClr(p_conn, &err);
    if (err != HTTPc_ERR_NONE) {
        return (DEF_FAIL);
    }

                                                                /* --------------- SET CONN'S CALLBACKS --------------- */
#if (HTTPc_CFG_MODE_ASYNC_TASK_EN == DEF_ENABLED)
    HTTPc_ConnSetParam(p_conn,
                       HTTPc_PARAM_TYPE_CONN_CLOSE_CALLBACK,
                      &HTTPcEx_ConnCloseCallback,
                      &err);
    if (err != HTTPc_ERR_NONE) {
        return (DEF_FAIL);
    }
#endif

                                                                /* ----------------- INIT NEW REQUEST ----------------- */
    HTTPc_ReqClr(p_req, &err);
    if (err != HTTPc_ERR_NONE) {
        return (DEF_FAIL);
    }

                                                                /* ------------- SET TRANS HOOK FUNCTIONS ------------- */
    HTTPc_ReqSetParam(p_req, 
                      HTTPc_PARAM_TYPE_RESP_HDR_HOOK, 
                     &HTTPcEx_RespHdrHook, 
                     &err);
    if (err != HTTPc_ERR_NONE) {
        return (DEF_FAIL);
    }

    HTTPc_ReqSetParam(p_req, 
                      HTTPc_PARAM_TYPE_RESP_BODY_HOOK, 
                     &HTTPcEx_RespBodyHook, 
                     &err);
    if (err != HTTPc_ERR_NONE) {
        return (DEF_FAIL);
    }

                                                                /* ---------- SET TRANS CALLBACK FUNCTIONS ------------ */
#if (HTTPc_CFG_MODE_ASYNC_TASK_EN == DEF_ENABLED)
    HTTPc_ReqSetParam(p_req, 
                      HTTPc_PARAM_TYPE_TRANS_COMPLETE_CALLBACK, 
                     &HTTPcEx_TransDoneCallback, 
                     &err);
    if (err != HTTPc_ERR_NONE) {
        return (DEF_FAIL);
    }

    HTTPc_ReqSetParam(p_req, 
                      HTTPc_PARAM_TYPE_TRANS_ERR_CALLBACK, 
                     &HTTPcEx_TransErrCallback, 
                     &err);
    if (err != HTTPc_ERR_NONE) {
        return (DEF_FAIL);
    }
#endif

                                                                /* ----------------- OPEN CONNECTION ------------------ */
    str_len = Str_Len(HTTP_SERVER_HOSTNAME);
    flags = HTTPc_FLAG_NONE;
    result = HTTPc_ConnOpen(p_conn,
                            p_buf,
                            HTTPc_EX_CFG_BUF_SIZE,
                            HTTP_SERVER_HOSTNAME,
                            str_len,
                            flags,
                           &err);
    if (err != HTTPc_ERR_NONE) {
        return (DEF_FAIL);
    }
    if (result == DEF_OK) {
        printf("Connection to server succeeded.\n\r");
    } else {
        printf("Connection to server failed.\n\r");
    }

                                                                /* ---------------- SEND HTTP REQUEST ----------------- */
    str_len = Str_Len("/");
    flags = HTTPc_FLAG_NONE;
    DEF_BIT_SET(flags, HTTPc_FLAG_REQ_NO_BLOCK);
    result = HTTPc_ReqSend(p_conn,
                           p_req,
                           p_resp,
                           HTTP_METHOD_GET,
                           "/",
                           str_len,
                           flags,
                          &err);
    if (err != HTTPc_ERR_NONE) {
        return (DEF_FAIL);
    }

	return (DEF_OK);
}


/*
*********************************************************************************************************
*                                      HTTPcEx_TransDoneCallback()
*
* Description : Example callback function to be notified when an HTTP transaction was completed.
*
*               Once this callback is called, the HTTPc Response object is ready to be read by the application
*               if no error occurred.
*
* Argument(s) : p_conn     Pointer to current HTTPc Connection object.
*
*               p_req      Pointer to current HTTPc Requet object.
*
*               p_resp     Pointer to current HTTPc Response object.
*
*               status     DEF_OK, if transaction was complete successfully.
*                          DEF_NO, otherwise.
*
* Return(s)   : None.
*********************************************************************************************************
*/

static  void  HTTPcEx_TransDoneCallback(HTTPc_CONN_OBJ    *p_conn,
                                        HTTPc_REQ_OBJ     *p_req,
                                        HTTPc_RESP_OBJ    *p_resp,
                                        CPU_BOOLEAN        status)
{
	if (status == DEF_OK) {
        printf("Transaction response status: %s\n\r", p_resp->ReasonPhrasePtr);
    } else {
        printf("Transaction failed\n\r");
    }
}


Response Header and Body Hook Functions

The example code below is an implementation of the On Response Header hook function and the On Response Body hook function.

Code Block
languagecpp
titleListing - Response Hook Functions Example Code
linenumberstrue
#define  HTTPc_EX_CFG_HDR_VAL_BUF_LEN  100

CPU_CHAR  HTTPcEx_HdrValBuf[HTTPc_EX_CFG_HDR_VAL_BUF_LEN];

/*
*********************************************************************************************************
*                                         HTTPcEx_RespHdrHook()
*
* Description : Example hook function to retrieve Header Fields received in the HTTP response.
*
* Argument(s) : p_conn      Pointer to current HTTPc Connection object.
*
*               p_req       Pointer to current HTTPc Request object.
*
*               hdr_field   Header field type received.
*
*               p_hdr_val   Pointer to Header field value string received.
*
*               val_len     Length of value string.
*
* Return(s)   : None.
*********************************************************************************************************
*/

static  void  HTTPcEx_RespHdrHook(HTTPc_CONN_OBJ    *p_conn,
                                  HTTPc_REQ_OBJ     *p_req,
                                  HTTP_HDR_FIELD     hdr_field,
                                  CPU_CHAR          *p_hdr_val,
                                  CPU_INT16U         val_len)
{
    CPU_CHAR    *p_buf;
    CPU_INT16U   len;

    p_buf = &HTTPcEx_HdrValBuf[0];

    switch (hdr_field) {
        case HTTP_HDR_FIELD_DATE:
        case HTTP_HDR_FIELD_SERVER:
             len = DEF_MIN((HTTPc_EX_CFG_HDR_VAL_BUF_LEN - 1), val_len);
             Mem_Copy(p_buf, p_hdr_val, len);
             p_buf += len;
            *p_buf  = '\0';
             break;


        default:
             break;
    }
}


/*
*********************************************************************************************************
*                                         HTTPcEx_RespBodyHook()
*
* Description : Example hook function to retrieve body data.
*
*               In this example, a html file is received and is copied into a file. 
*               µC/FS is used as File System.
*
* Argument(s) : p_conn        Pointer to current HTTPc Connection object.
*
*               p_req         Pointer to current HTTPc Request object.
*
*               content_type  Content type of the body received in the HTTP response.
*
*               p_data        Pointer to the data piece received.
*
*               data_len      Length of data piece received.
*
*               last_chunk    DEF_YES, if this represent the last piece of the data body to receive.
*                             DEF_NO,  if data still remains to be received.
*
* Return(s)   : None.
*********************************************************************************************************
*/

static  void  HTTPcEx_RespBodyHook (HTTPc_CONN_OBJ     *p_conn,
                                    HTTPc_REQ_OBJ      *p_req,
                                    HTTP_CONTENT_TYPE   content_type,
                                    void               *p_data,
                                    CPU_INT32U          data_len,
                                    CPU_BOOLEAN         last_chunk)
{
    FS_FILE            *p_file;
    FS_FLAGS            fs_flags;
    CPU_SIZE_T          size_wr;
    CPU_SIZE_T          size_wr_tot;
    CPU_BOOLEAN         is_open;
    FS_ERR              err_fs;


    is_open = FSFile_IsOpen("\\index.html",
                            &fs_flags,
                            &err_fs);
    if (err_fs != FS_ERR_NONE) {
        return;
    }

    if (is_open == DEF_NO) {
        fs_flags = 0;
        DEF_BIT_SET(fs_flags, FS_FILE_ACCESS_MODE_WR);
        DEF_BIT_SET(fs_flags, FS_FILE_ACCESS_MODE_CREATE);
        DEF_BIT_SET(fs_flags, FS_FILE_ACCESS_MODE_TRUNCATE);
        p_file = FSFile_Open("index.html",
                              fs_flags,
                             &err_fs);
        if (err_fs != FS_ERR_NONE) {
            return;
        }
        p_req->UserDataPtr = (void *)p_file;
    } else {
        p_file = (FS_FILE *)p_req->UserDataPtr;
    }

    switch (content_type) {
        case HTTP_CONTENT_TYPE_HTML:
             if (p_data != DEF_NULL) {
                 size_wr     = 0;
                 size_wr_tot = 0;
                 while (size_wr < data_len) {
                     size_wr = FSFile_Wr(p_file,
                                         p_data,
                                         data_len,
                                        &err_fs);
                     if (err_fs != FS_ERR_NONE) {
                         return;
                     }
                     size_wr_tot += size_wr;
                 }
             }
             break;

        case HTTP_CONTENT_TYPE_OCTET_STREAM:
        case HTTP_CONTENT_TYPE_PDF:
        case HTTP_CONTENT_TYPE_ZIP:
        case HTTP_CONTENT_TYPE_GIF:
        case HTTP_CONTENT_TYPE_JPEG:
        case HTTP_CONTENT_TYPE_PNG:
        case HTTP_CONTENT_TYPE_JS:
        case HTTP_CONTENT_TYPE_PLAIN:
        case HTTP_CONTENT_TYPE_CSS:
        case HTTP_CONTENT_TYPE_JSON:
        default:
             break;
    }

    if (last_chunk == DEF_YES) {
        FSFile_Close(p_file, &err_fs);
    }
}