diff --git a/src/webclient.c b/src/webclient.c index a11d5e8..2588f26 100644 --- a/src/webclient.c +++ b/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) { diff --git a/src/webclient_file.c b/src/webclient_file.c index a9629c3..598e90d 100644 --- a/src/webclient_file.c +++ b/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)