Просмотр исходного кода

Merge pull request #18 from chenyong111/master

完善日志信息,完善 TLS 处理方式
朱天龙 (Armink) 7 лет назад
Родитель
Сommit
426db43365
4 измененных файлов с 585 добавлено и 400 удалено
  1. 393 307
      webclient.c
  2. 80 28
      webclient.h
  3. 112 54
      webclient_file.c
  4. 0 11
      webclient_internal.h

Разница между файлами не показана из-за своего большого размера
+ 393 - 307
webclient.c


+ 80 - 28
webclient.h

@@ -1,6 +1,20 @@
 /*
  * File      : webclient.h
- * COPYRIGHT (C) 2011-2018, Shanghai Real-Thread Technology Co., Ltd
+ * COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
  * Change Logs:
  * Date           Author       Notes
@@ -9,35 +23,79 @@
  * 2015-11-14     aozima       add content_length_remainder.
  * 2017-12-23     aozima       update gethostbyname to getaddrinfo.
  * 2018-01-04     aozima       add ipv6 address support.
+ * 2018-07-26     chenyong     modify log information
  */
 
 #ifndef __WEBCLIENT_H__
 #define __WEBCLIENT_H__
 
-#include <stddef.h>
-
 #include <rtthread.h>
 
 #ifdef WEBCLIENT_USING_TLS
 #include <tls_client.h>
 #endif
 
-#define WEBCLIENT_HEADER_BUFSZ      4096
-#define WEBCLIENT_RESPONSE_BUFSZ    4096
-#define WEBCLIENT_TLS_READ_BUFFER   4096
+#undef DBG_SECTION_NAME
+#undef DBG_LEVEL
+#undef DBG_COLOR
+#undef DBG_ENABLE
+
+#define DBG_ENABLE
+#define DBG_SECTION_NAME               "WEB"
+#ifdef WEBCLIENT_DEBUG
+#define DBG_LEVEL                      DBG_LOG
+#else
+#define DBG_LEVEL                      DBG_INFO
+#endif /* WEBCLIENT_DEBUG */
+#define DBG_COLOR
+#include <rtdbg.h>
+
+#ifndef web_malloc
+#define web_malloc                     rt_malloc
+#endif
+
+#ifndef web_calloc
+#define web_calloc                     rt_calloc
+#endif
 
-//typedef unsigned int size_t;
+#ifndef web_realloc
+#define web_realloc                    rt_realloc
+#endif
+
+#ifndef web_free
+#define web_free                       rt_free
+#endif
+
+#ifndef web_strdup
+#define web_strdup                     rt_strdup
+#endif
+
+#define WEBCLIENT_SW_VERSION           "2.0.0"
+#define WEBCLIENT_SW_VERSION_NUM       0x20000
+
+#ifndef WEBCLIENT_HEADER_BUFSZ
+#define WEBCLIENT_HEADER_BUFSZ         4096
+#endif
+
+#ifndef WEBCLIENT_RESPONSE_BUFSZ
+#define WEBCLIENT_RESPONSE_BUFSZ       4096
+#endif
+
+#if defined(WEBCLIENT_USING_TLS) && !defined(WEBCLIENT_TLS_READ_BUFFER)
+#define WEBCLIENT_TLS_READ_BUFFER      4096
+#endif
 
 enum WEBCLIENT_STATUS
 {
     WEBCLIENT_OK,
+    WEBCLIENT_ERROR,
+    WEBCLIENT_TIMEOUT,
     WEBCLIENT_NOMEM,
     WEBCLIENT_NOSOCKET,
     WEBCLIENT_NOBUFFER,
     WEBCLIENT_CONNECT_FAILED,
     WEBCLIENT_DISCONNECT,
     WEBCLIENT_FILE_ERROR,
-    WEBCLIENT_TIMEOUT,
 };
 
 enum WEBCLIENT_METHOD
@@ -75,23 +133,30 @@ struct webclient_session
     /* HTTP request */
     char *request;
 
-    /* private for webclient session. */
-
     /* position of reading */
     unsigned int position;
 
     /* remainder of content reading */
     size_t content_length_remainder;
     
+    int header_sz;
+    int resp_sz;
+
 #ifdef WEBCLIENT_USING_TLS
-        /* mbedtls session struct*/
+        /* mbedtls connect session */
         MbedTLSSession *tls_session;
 #endif
 };
 
-struct webclient_session *webclient_open(const char *URI);
-struct webclient_session *webclient_open_position(const char *URI, int position);
-struct webclient_session *webclient_open_header(const char *URI, int method, const char *header, size_t header_sz);
+struct webclient_session *webclient_create(size_t header_sz, size_t resp_sz);
+
+int webclient_get(struct webclient_session *session, const char *URI, const char *header);
+int webclient_get_position(struct webclient_session *session, const char *URI, int position);
+
+int webclient_post(struct webclient_session *session, const char *URI,
+        const char *header, const char *post_data);
+int webclient_post_header(struct webclient_session *session, const char *URI, const char *header);
+
 int webclient_close(struct webclient_session *session);
 
 int webclient_set_timeout(struct webclient_session *session, int millisecond);
@@ -99,21 +164,8 @@ int webclient_set_timeout(struct webclient_session *session, int millisecond);
 int webclient_read(struct webclient_session *session, unsigned char *buffer, size_t size);
 int webclient_write(struct webclient_session *session, const unsigned char *buffer, size_t size);
 
-int webclient_send_header(struct webclient_session *session, int method,
-                          const char *header, size_t header_sz);
-int webclient_connect(struct webclient_session *session, const char *URI);
-int webclient_handle_response(struct webclient_session *session);
-
-/* hight level APIs for HTTP client */
 int webclient_response(struct webclient_session *session, void **response);
-struct webclient_session *webclient_open_custom(const char *URI, int method,
-        const char *header, size_t header_sz,
-        const char *data, size_t data_sz);
-
-int webclient_transfer(const char *URI, const char *header, size_t header_sz,
-                       const char *data, size_t data_sz,
-                       char *result, size_t result_sz);
-
+int webclient_request(const char *URI, const char *header, const char *post_data, unsigned char **result);
 
 #ifdef RT_USING_DFS
 int webclient_get_file(const char *URI, const char *filename);

+ 112 - 54
webclient_file.c

@@ -1,48 +1,70 @@
+/*
+ * File      : webclient_file.c
+ * COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2017-07-26     chenyong     modify log information
+ */
+
 #include <stdint.h>
 #include <stdlib.h>
 
 #include <rtthread.h>
 #include "webclient.h"
-#include "webclient_internal.h"
-
-#ifdef RT_USING_FINSH
-#include <finsh.h>
-#endif
 
 #ifdef RT_USING_DFS
 #include <dfs_posix.h>
 
 int webclient_get_file(const char* URI, const char* filename)
 {
-    int fd = -1;
+    int fd = -1, rc = WEBCLIENT_OK;
     size_t offset;
     size_t length, total_length = 0;
-    rt_uint8_t* ptr = NULL;
-    struct webclient_session* session = NULL;
+    unsigned char *ptr = RT_NULL;
+    struct webclient_session* session = RT_NULL;
 
-    session = webclient_open(URI);
-    if (session == NULL)
+    session = webclient_create(WEBCLIENT_HEADER_BUFSZ, WEBCLIENT_RESPONSE_BUFSZ);
+    if(session == RT_NULL)
     {
-        rt_kprintf("open website failed.\n");
+        rc = -WEBCLIENT_NOMEM;
         goto __exit;
     }
-    if (session->response != 200)
+
+    if (webclient_get(session, URI, RT_NULL) != 200)
     {
-        rt_kprintf("wrong response: %d\n", session->response);
+        LOG_E("get file failed, wrong response: %d.", session->response);
+        rc = -WEBCLIENT_ERROR;
         goto __exit;
     }
 
     fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0);
     if (fd < 0)
     {
-        rt_kprintf("open file failed\n");
+        LOG_E("get file failed, open file(%s) error.", filename);
+        rc = -WEBCLIENT_ERROR;
         goto __exit;
     }
 
-    ptr = web_malloc(WEBCLIENT_RESPONSE_BUFSZ);
-    if (ptr == NULL)
+    ptr = (unsigned char *) web_malloc(WEBCLIENT_RESPONSE_BUFSZ);
+    if (ptr == RT_NULL)
     {
-        rt_kprintf("out of memory\n");
+        LOG_E("get file failed, no memory for response buffer.");
+        rc = -WEBCLIENT_NOMEM;
         goto __exit;
     }
 
@@ -58,7 +80,9 @@ int webclient_get_file(const char* URI, const char* filename)
                 rt_kprintf(">");
             }
             else
+            {
                 break;
+            }
         }
     }
     else
@@ -76,7 +100,9 @@ int webclient_get_file(const char* URI, const char* filename)
                 rt_kprintf(">");
             }
             else
+            {
                 break;
+            }
 
             offset += length;
         }
@@ -84,15 +110,26 @@ int webclient_get_file(const char* URI, const char* filename)
 
     if (total_length)
     {
-        rt_kprintf("\nSave %d bytes\n", total_length);
+        LOG_D("save %d bytes.", total_length);
     }
 
 __exit:
-    if (fd >= 0) close(fd);
-    if (session != NULL) webclient_close(session);
-    if (ptr != NULL) web_free(ptr);
+    if (fd >= 0)
+    {
+        close(fd);
+    }
 
-    return 0;
+    if (session != RT_NULL)
+    {
+        webclient_close(session);
+    }
+
+    if (ptr != RT_NULL)
+    {
+        web_free(ptr);
+    }
+
+    return rc;
 }
 
 int webclient_post_file(const char* URI, const char* filename,
@@ -101,13 +138,14 @@ int webclient_post_file(const char* URI, const char* filename,
     size_t length;
     char boundary[60];
     int fd = -1, rc = WEBCLIENT_OK;
-    char *header = NULL, *header_ptr;
-    unsigned char *buffer = NULL, *buffer_ptr;
-    struct webclient_session* session = NULL;
+    char *header = RT_NULL, *header_ptr;
+    unsigned char *buffer = RT_NULL, *buffer_ptr;
+    struct webclient_session* session = RT_NULL;
 
     fd = open(filename, O_RDONLY, 0);
     if (fd < 0)
     {
+        LOG_D("post file failed, open file(%s) error.", filename);
         rc = -WEBCLIENT_FILE_ERROR;
         goto __exit;
     }
@@ -116,36 +154,25 @@ int webclient_post_file(const char* URI, const char* filename,
     length = lseek(fd, 0, SEEK_END);
     lseek(fd, 0, SEEK_SET);
 
-    buffer = web_malloc(WEBCLIENT_RESPONSE_BUFSZ);
-    if (buffer == NULL)
+    buffer = (unsigned char *) web_malloc(WEBCLIENT_RESPONSE_BUFSZ);
+    if (buffer == RT_NULL)
     {
+        LOG_D("post file failed, no memory for response buffer.");
         rc = -WEBCLIENT_NOMEM;
         goto __exit;
     }
 
-    session = (struct webclient_session*) web_malloc(sizeof(struct webclient_session));
-    if (!session)
-    {
-        rc = -WEBCLIENT_NOMEM;
-        goto __exit;
-    }
-    memset(session, 0x0, sizeof(struct webclient_session));
-
-    rc = webclient_connect(session, URI);
-    if (rc < 0)
-        goto __exit;
-
-    header = (char*) web_malloc(WEBCLIENT_HEADER_BUFSZ);
-    if (header == NULL)
+    header = (char *) web_malloc(WEBCLIENT_HEADER_BUFSZ);
+    if (header == RT_NULL)
     {
+        LOG_D("post file failed, no memory for header buffer.");
         rc = -WEBCLIENT_NOMEM;
         goto __exit;
     }
     header_ptr = header;
 
     /* build boundary */
-    rt_snprintf(boundary, sizeof(boundary), "----------------------------%012d",
-            rt_tick_get());
+    rt_snprintf(boundary, sizeof(boundary), "----------------------------%012d", rt_tick_get());
 
     /* build encapsulated mime_multipart information*/
     buffer_ptr = buffer;
@@ -169,11 +196,19 @@ int webclient_post_file(const char* URI, const char* filename,
     header_ptr += rt_snprintf(header_ptr,
             WEBCLIENT_HEADER_BUFSZ - (header_ptr - header),
             "Content-Type: multipart/form-data; boundary=%s\r\n", boundary);
-    /* send header */
-    rc = webclient_send_header(session, WEBCLIENT_POST, header,
-            header_ptr - header);
-    if (rc < 0)
+
+    session = webclient_create(WEBCLIENT_HEADER_BUFSZ, WEBCLIENT_RESPONSE_BUFSZ);
+    if(session == RT_NULL)
+    {
+        rc = -WEBCLIENT_NOMEM;
         goto __exit;
+    }
+
+    rc = webclient_post_header(session, URI, header);
+    if( rc< 0)
+    {
+        goto __exit;
+    }
 
     /* send mime_multipart */
     webclient_write(session, buffer, buffer_ptr - buffer);
@@ -183,7 +218,10 @@ int webclient_post_file(const char* URI, const char* filename,
     {
         length = read(fd, buffer, WEBCLIENT_RESPONSE_BUFSZ);
         if (length <= 0)
+        {
             break;
+        }
+
         webclient_write(session, buffer, length);
     }
 
@@ -192,25 +230,45 @@ int webclient_post_file(const char* URI, const char* filename,
     webclient_write(session, buffer, strlen(boundary) + 6);
 
 __exit:
-    if (fd >= 0) close(fd);
-    if (session != NULL) webclient_close(session);
-    if (buffer != NULL) web_free(buffer);
-    if (header != NULL) web_free(header);
+    if (fd >= 0)
+    {
+        close(fd);
+    }
+
+    if (session != RT_NULL)
+    {
+        webclient_close(session);
+    }
+
+    if (buffer != RT_NULL)
+    {
+        web_free(buffer);
+    }
+
+    if (header != RT_NULL)
+    {
+        web_free(header);
+    }
 
     return 0;
 }
 
+
 int wget(int argc, char** argv)
 {
     if (argc != 3)
     {
-        rt_kprintf("wget URI filename\n");
-        return 0;
+        LOG_E("wget [URI] [filename]  -get file by URI.");
+        return -1;
     }
 
     webclient_get_file(argv[1], argv[2]);
     return 0;
 }
+
+#ifdef FINSH_USING_MSH
+#include <finsh.h>
 MSH_CMD_EXPORT(wget, web download file);
+#endif /* FINSH_USING_MSH */
 
-#endif
+#endif /* RT_USING_DFS */

+ 0 - 11
webclient_internal.h

@@ -1,11 +0,0 @@
-#ifndef WEBCLIENT_INTERNAL_H__
-#define WEBCLIENT_INTERNAL_H__
-
-#include <rtthread.h>
-
-#define web_malloc  rt_malloc
-#define web_free    rt_free
-#define web_realloc rt_realloc
-#define web_calloc  rt_calloc
-
-#endif

Некоторые файлы не были показаны из-за большого количества измененных файлов