Jelajahi Sumber

Merge pull request #56 from Lawlieta/master

【修复】webclient_post_file 函数 POST 方式上传文件失败问题
朱天龙 (Armink) 6 tahun lalu
induk
melakukan
4f0734e208
2 mengubah file dengan 60 tambahan dan 34 penghapusan
  1. 25 25
      src/webclient.c
  2. 35 9
      src/webclient_file.c

+ 25 - 25
src/webclient.c

@@ -65,7 +65,7 @@ static int webclient_recv(struct webclient_session* session, unsigned char *buff
     {
         return mbedtls_client_read(session->tls_session, buffer, len);
     }
-#endif 
+#endif
 
     return recv(session->socket, buffer, len, flag);
 }
@@ -86,8 +86,8 @@ static int webclient_read_line(struct webclient_session *session, char *buffer,
         if (session->is_tls && (rc == MBEDTLS_ERR_SSL_WANT_READ || rc == MBEDTLS_ERR_SSL_WANT_WRITE))
         {
             continue;
-        }    
-#endif 
+        }
+#endif
         if (rc <= 0)
             return rc;
 
@@ -195,7 +195,7 @@ static int webclient_resolve_address(struct webclient_session *session, struct a
         }
         host_addr_len = ptr - host_addr;
         *request = (char *) ptr;
-        
+
         /* resolve port */
         port_ptr = rt_strstr(host_addr, ":");
         if (port_ptr && port_ptr < ptr)
@@ -241,7 +241,7 @@ static int webclient_resolve_address(struct webclient_session *session, struct a
         {
             return -WEBCLIENT_NOMEM;
         }
-        
+
         return rc;
     }
 #endif
@@ -356,7 +356,7 @@ static int webclient_connect(struct webclient_session *session, const char *URI)
         {
             LOG_E("connect failed, https client open URI(%s) failed!", URI);
             return -WEBCLIENT_ERROR;
-        } 
+        }
         session->is_tls = RT_TRUE;
 #else
         LOG_E("not support https connect, please enable webclient https configure!");
@@ -673,17 +673,17 @@ static int webclient_send_header(struct webclient_session *session, int method)
             webclient_write(session, (unsigned char *) session->header->buffer, session->header->length);
         }
     }
-    
+
     /* get and echo request header data */
     {
         char *header_str, *header_ptr;
         int header_line_len;
         LOG_D("request header:");
-        
+
         for(header_str = session->header->buffer; (header_ptr = rt_strstr(header_str, "\r\n")) != RT_NULL; )
         {
             header_line_len = header_ptr - header_str;
-            
+
             if (header_line_len > 0)
             {
                 LOG_D("%.*s", header_line_len, header_str);
@@ -694,7 +694,7 @@ static int webclient_send_header(struct webclient_session *session, int method)
         LOG_RAW("\n");
 #endif
     }
-    
+
 __exit:
     return rc;
 }
@@ -746,7 +746,7 @@ int webclient_handle_response(struct webclient_session *session)
 
         /* echo response header data */
         LOG_D("%s", mime_buffer);
-        
+
         session->header->length += rc;
 
         if (session->header->length >= session->header->size)
@@ -843,7 +843,7 @@ struct webclient_session *webclient_session_create(size_t header_sz)
     }
 
     session->header->size = header_sz;
-    session->header->buffer = (char *) web_malloc(header_sz);
+    session->header->buffer = (char *) web_calloc(1, header_sz);
     if (session->header->buffer == RT_NULL)
     {
         LOG_E("webclient create failed, no memory for session header buffer!");
@@ -893,7 +893,7 @@ int webclient_get(struct webclient_session *session, const char *URI)
     /* handle the response header of webclient server */
     resp_status = webclient_handle_response(session);
 
-    LOG_D("get position handle response(%d).", resp_status); 
+    LOG_D("get position handle response(%d).", resp_status);
 
     if (resp_status > 0)
     {
@@ -970,7 +970,7 @@ int webclient_get_position(struct webclient_session *session, const char *URI, i
     /* handle the response header of webclient server */
     resp_status = webclient_handle_response(session);
 
-    LOG_D("get position handle response(%d).", resp_status); 
+    LOG_D("get position handle response(%d).", resp_status);
 
     if (resp_status > 0)
     {
@@ -1049,7 +1049,7 @@ int webclient_post(struct webclient_session *session, const char *URI, const cha
 
         /* resolve response data, get http status code */
         resp_status = webclient_handle_response(session);
-        LOG_D("post handle response(%d).", resp_status); 
+        LOG_D("post handle response(%d).", resp_status);
     }
 
     return resp_status;
@@ -1219,13 +1219,13 @@ int webclient_read(struct webclient_session *session, unsigned char *buffer, siz
         if (bytes_read <= 0)
         {
 #if defined(WEBCLIENT_USING_SAL_TLS) || defined(WEBCLIENT_USING_MBED_TLS)
-            if(session->is_tls && 
+            if(session->is_tls &&
                 (bytes_read == MBEDTLS_ERR_SSL_WANT_READ || bytes_read == MBEDTLS_ERR_SSL_WANT_WRITE))
             {
                 continue;
             }
-                
-#endif  
+
+#endif
             LOG_D("receive data error(%d).", bytes_read);
 
             if (total_read)
@@ -1298,7 +1298,7 @@ int webclient_write(struct webclient_session *session, const unsigned char *buff
         if (bytes_write <= 0)
         {
 #if defined(WEBCLIENT_USING_SAL_TLS) || defined(WEBCLIENT_USING_MBED_TLS)
-            if(session->is_tls && 
+            if(session->is_tls &&
                 (bytes_write == MBEDTLS_ERR_SSL_WANT_READ || bytes_write == MBEDTLS_ERR_SSL_WANT_WRITE))
             {
                 continue;
@@ -1346,7 +1346,7 @@ int webclient_write(struct webclient_session *session, const unsigned char *buff
 int webclient_close(struct webclient_session *session)
 {
     RT_ASSERT(session);
-    
+
 #ifdef WEBCLIENT_USING_MBED_TLS
     if (session->tls_session)
     {
@@ -1356,7 +1356,7 @@ int webclient_close(struct webclient_session *session)
     {
         if (session->socket >= 0)
         {
-            closesocket(session->socket); 
+            closesocket(session->socket);
             session->socket = -1;
         }
     }
@@ -1485,7 +1485,7 @@ int webclient_response(struct webclient_session *session, unsigned char **respon
 }
 
 /**
- * add request(GET/POST) header data. 
+ * add request(GET/POST) header data.
  *
  * @param request_header add request buffer address
  * @param fmt fields format
@@ -1583,7 +1583,7 @@ int webclient_request(const char *URI, const char *header, const char *post_data
 
             for(header_str = (char *)header; (header_ptr = rt_strstr(header_str, "\r\n")) != RT_NULL; )
             {
-                header_line_length = header_ptr + rt_strlen("\r\n") - header_str; 
+                header_line_length = header_ptr + rt_strlen("\r\n") - header_str;
                 webclient_header_fields_add(session, "%.*s", header_line_length, header_str);
                 header_str += header_line_length;
             }
@@ -1619,7 +1619,7 @@ int webclient_request(const char *URI, const char *header, const char *post_data
 
             for(header_str = (char *)header; (header_ptr = rt_strstr(header_str, "\r\n")) != RT_NULL; )
             {
-                header_line_length = header_ptr + rt_strlen("\r\n") - header_str; 
+                header_line_length = header_ptr + rt_strlen("\r\n") - header_str;
                 webclient_header_fields_add(session, "%.*s", header_line_length, header_str);
                 header_str += header_line_length;
             }
@@ -1640,7 +1640,7 @@ int webclient_request(const char *URI, const char *header, const char *post_data
             rc = -WEBCLIENT_ERROR;
             goto __exit;
         }
-        
+
         totle_length = webclient_response(session, response);
         if (totle_length <= 0)
         {

+ 35 - 9
src/webclient_file.c

@@ -74,7 +74,7 @@ int webclient_get_file(const char* URI, const char* filename)
         rc = -WEBCLIENT_NOMEM;
         goto __exit;
     }
-	
+
     if (session->content_length < 0)
     {
         while (1)
@@ -158,6 +158,7 @@ int webclient_post_file(const char* URI, const char* filename,
     char *header = RT_NULL, *header_ptr;
     unsigned char *buffer = RT_NULL, *buffer_ptr;
     struct webclient_session* session = RT_NULL;
+    int resp_data_len = 0;
 
     fd = open(filename, O_RDONLY, 0);
     if (fd < 0)
@@ -171,7 +172,7 @@ int webclient_post_file(const char* URI, const char* filename,
     length = lseek(fd, 0, SEEK_END);
     lseek(fd, 0, SEEK_SET);
 
-    buffer = (unsigned char *) web_malloc(WEBCLIENT_RESPONSE_BUFSZ);
+    buffer = (unsigned char *) web_calloc(1, WEBCLIENT_RESPONSE_BUFSZ);
     if (buffer == RT_NULL)
     {
         LOG_D("post file failed, no memory for response buffer.");
@@ -179,7 +180,7 @@ int webclient_post_file(const char* URI, const char* filename,
         goto __exit;
     }
 
-    header = (char *) web_malloc(WEBCLIENT_HEADER_BUFSZ);
+    header = (char *) web_calloc(1, WEBCLIENT_HEADER_BUFSZ);
     if (header == RT_NULL)
     {
         LOG_D("post file failed, no memory for header buffer.");
@@ -204,7 +205,7 @@ int webclient_post_file(const char* URI, const char* filename,
             "Content-Type: application/octet-stream\r\n\r\n");
     /* calculate content-length */
     length += buffer_ptr - buffer;
-    length += rt_strlen(boundary) + 6; /* add the last boundary */
+    length += rt_strlen(boundary) + 8; /* add the last boundary */
 
     /* build header for upload */
     header_ptr += rt_snprintf(header_ptr,
@@ -221,10 +222,11 @@ int webclient_post_file(const char* URI, const char* filename,
         goto __exit;
     }
 
-    session->header->buffer = web_strdup(header);
+    rt_strncpy(session->header->buffer, header, rt_strlen(header));
+    session->header->length = rt_strlen(session->header->buffer);
 
     rc = webclient_post(session, URI, NULL);
-    if( rc< 0)
+    if(rc < 0)
     {
         goto __exit;
     }
@@ -246,7 +248,32 @@ int webclient_post_file(const char* URI, const char* filename,
 
     /* send last boundary */
     rt_snprintf((char*) buffer, WEBCLIENT_RESPONSE_BUFSZ, "\r\n--%s--\r\n", boundary);
-    webclient_write(session, buffer, rt_strlen(boundary) + 6);
+    webclient_write(session, buffer, rt_strlen(boundary) + 8);
+
+    extern int webclient_handle_response(struct webclient_session *session);
+    if( webclient_handle_response(session) != 200)
+    {
+        rc = -WEBCLIENT_ERROR;
+        goto __exit;
+    }
+
+    resp_data_len = webclient_content_length_get(session);
+    if (resp_data_len > 0)
+    {
+        int bytes_read = 0;
+
+        rt_memset(buffer, 0x00, WEBCLIENT_RESPONSE_BUFSZ);
+        do
+        {
+            bytes_read = webclient_read(session, buffer,
+                resp_data_len < WEBCLIENT_RESPONSE_BUFSZ ? resp_data_len : WEBCLIENT_RESPONSE_BUFSZ);
+            if (bytes_read <= 0)
+            {
+                break;
+            }
+            resp_data_len -= bytes_read;
+        } while(resp_data_len > 0);
+    }
 
 __exit:
     if (fd >= 0)
@@ -269,10 +296,9 @@ __exit:
         web_free(header);
     }
 
-    return 0;
+    return rc;
 }
 
-
 int wget(int argc, char** argv)
 {
     if (argc != 3)