【修复】webclient_post_file 函数 POST 方式上传文件失败问题

Signed-off-by: chenyong <chenyong@rt-thread.com>
master
chenyong 6 years ago
parent 348a660638
commit d66c291fd6

@ -65,7 +65,7 @@ static int webclient_recv(struct webclient_session* session, unsigned char *buff
{ {
return mbedtls_client_read(session->tls_session, buffer, len); return mbedtls_client_read(session->tls_session, buffer, len);
} }
#endif #endif
return recv(session->socket, buffer, len, flag); 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)) if (session->is_tls && (rc == MBEDTLS_ERR_SSL_WANT_READ || rc == MBEDTLS_ERR_SSL_WANT_WRITE))
{ {
continue; continue;
} }
#endif #endif
if (rc <= 0) if (rc <= 0)
return rc; return rc;
@ -195,7 +195,7 @@ static int webclient_resolve_address(struct webclient_session *session, struct a
} }
host_addr_len = ptr - host_addr; host_addr_len = ptr - host_addr;
*request = (char *) ptr; *request = (char *) ptr;
/* resolve port */ /* resolve port */
port_ptr = rt_strstr(host_addr, ":"); port_ptr = rt_strstr(host_addr, ":");
if (port_ptr && port_ptr < ptr) 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 -WEBCLIENT_NOMEM;
} }
return rc; return rc;
} }
#endif #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); LOG_E("connect failed, https client open URI(%s) failed!", URI);
return -WEBCLIENT_ERROR; return -WEBCLIENT_ERROR;
} }
session->is_tls = RT_TRUE; session->is_tls = RT_TRUE;
#else #else
LOG_E("not support https connect, please enable webclient https configure!"); 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); webclient_write(session, (unsigned char *) session->header->buffer, session->header->length);
} }
} }
/* get and echo request header data */ /* get and echo request header data */
{ {
char *header_str, *header_ptr; char *header_str, *header_ptr;
int header_line_len; int header_line_len;
LOG_D("request header:"); LOG_D("request header:");
for(header_str = session->header->buffer; (header_ptr = rt_strstr(header_str, "\r\n")) != RT_NULL; ) for(header_str = session->header->buffer; (header_ptr = rt_strstr(header_str, "\r\n")) != RT_NULL; )
{ {
header_line_len = header_ptr - header_str; header_line_len = header_ptr - header_str;
if (header_line_len > 0) if (header_line_len > 0)
{ {
LOG_D("%.*s", header_line_len, header_str); 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"); LOG_RAW("\n");
#endif #endif
} }
__exit: __exit:
return rc; return rc;
} }
@ -746,7 +746,7 @@ int webclient_handle_response(struct webclient_session *session)
/* echo response header data */ /* echo response header data */
LOG_D("%s", mime_buffer); LOG_D("%s", mime_buffer);
session->header->length += rc; session->header->length += rc;
if (session->header->length >= session->header->size) 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->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) if (session->header->buffer == RT_NULL)
{ {
LOG_E("webclient create failed, no memory for session header buffer!"); 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 */ /* handle the response header of webclient server */
resp_status = webclient_handle_response(session); 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) 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 */ /* handle the response header of webclient server */
resp_status = webclient_handle_response(session); 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) 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 */ /* resolve response data, get http status code */
resp_status = webclient_handle_response(session); 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; return resp_status;
@ -1219,13 +1219,13 @@ int webclient_read(struct webclient_session *session, unsigned char *buffer, siz
if (bytes_read <= 0) if (bytes_read <= 0)
{ {
#if defined(WEBCLIENT_USING_SAL_TLS) || defined(WEBCLIENT_USING_MBED_TLS) #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)) (bytes_read == MBEDTLS_ERR_SSL_WANT_READ || bytes_read == MBEDTLS_ERR_SSL_WANT_WRITE))
{ {
continue; continue;
} }
#endif #endif
LOG_D("receive data error(%d).", bytes_read); LOG_D("receive data error(%d).", bytes_read);
if (total_read) if (total_read)
@ -1298,7 +1298,7 @@ int webclient_write(struct webclient_session *session, const unsigned char *buff
if (bytes_write <= 0) if (bytes_write <= 0)
{ {
#if defined(WEBCLIENT_USING_SAL_TLS) || defined(WEBCLIENT_USING_MBED_TLS) #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)) (bytes_write == MBEDTLS_ERR_SSL_WANT_READ || bytes_write == MBEDTLS_ERR_SSL_WANT_WRITE))
{ {
continue; continue;
@ -1346,7 +1346,7 @@ int webclient_write(struct webclient_session *session, const unsigned char *buff
int webclient_close(struct webclient_session *session) int webclient_close(struct webclient_session *session)
{ {
RT_ASSERT(session); RT_ASSERT(session);
#ifdef WEBCLIENT_USING_MBED_TLS #ifdef WEBCLIENT_USING_MBED_TLS
if (session->tls_session) if (session->tls_session)
{ {
@ -1356,7 +1356,7 @@ int webclient_close(struct webclient_session *session)
{ {
if (session->socket >= 0) if (session->socket >= 0)
{ {
closesocket(session->socket); closesocket(session->socket);
session->socket = -1; 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 request_header add request buffer address
* @param fmt fields format * @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; ) 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); webclient_header_fields_add(session, "%.*s", header_line_length, header_str);
header_str += header_line_length; 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; ) 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); webclient_header_fields_add(session, "%.*s", header_line_length, header_str);
header_str += header_line_length; 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; rc = -WEBCLIENT_ERROR;
goto __exit; goto __exit;
} }
totle_length = webclient_response(session, response); totle_length = webclient_response(session, response);
if (totle_length <= 0) if (totle_length <= 0)
{ {

@ -74,7 +74,7 @@ int webclient_get_file(const char* URI, const char* filename)
rc = -WEBCLIENT_NOMEM; rc = -WEBCLIENT_NOMEM;
goto __exit; goto __exit;
} }
if (session->content_length < 0) if (session->content_length < 0)
{ {
while (1) while (1)
@ -158,6 +158,7 @@ int webclient_post_file(const char* URI, const char* filename,
char *header = RT_NULL, *header_ptr; char *header = RT_NULL, *header_ptr;
unsigned char *buffer = RT_NULL, *buffer_ptr; unsigned char *buffer = RT_NULL, *buffer_ptr;
struct webclient_session* session = RT_NULL; struct webclient_session* session = RT_NULL;
int resp_data_len = 0;
fd = open(filename, O_RDONLY, 0); fd = open(filename, O_RDONLY, 0);
if (fd < 0) if (fd < 0)
@ -171,7 +172,7 @@ int webclient_post_file(const char* URI, const char* filename,
length = lseek(fd, 0, SEEK_END); length = lseek(fd, 0, SEEK_END);
lseek(fd, 0, SEEK_SET); 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) if (buffer == RT_NULL)
{ {
LOG_D("post file failed, no memory for response buffer."); 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; goto __exit;
} }
header = (char *) web_malloc(WEBCLIENT_HEADER_BUFSZ); header = (char *) web_calloc(1, WEBCLIENT_HEADER_BUFSZ);
if (header == RT_NULL) if (header == RT_NULL)
{ {
LOG_D("post file failed, no memory for header buffer."); 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"); "Content-Type: application/octet-stream\r\n\r\n");
/* calculate content-length */ /* calculate content-length */
length += buffer_ptr - buffer; 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 */ /* build header for upload */
header_ptr += rt_snprintf(header_ptr, header_ptr += rt_snprintf(header_ptr,
@ -221,10 +222,11 @@ int webclient_post_file(const char* URI, const char* filename,
goto __exit; 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); rc = webclient_post(session, URI, NULL);
if( rc< 0) if(rc < 0)
{ {
goto __exit; goto __exit;
} }
@ -246,7 +248,32 @@ int webclient_post_file(const char* URI, const char* filename,
/* send last boundary */ /* send last boundary */
rt_snprintf((char*) buffer, WEBCLIENT_RESPONSE_BUFSZ, "\r\n--%s--\r\n", 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: __exit:
if (fd >= 0) if (fd >= 0)
@ -269,10 +296,9 @@ __exit:
web_free(header); web_free(header);
} }
return 0; return rc;
} }
int wget(int argc, char** argv) int wget(int argc, char** argv)
{ {
if (argc != 3) if (argc != 3)

Loading…
Cancel
Save