diff --git a/inc/webclient.h b/inc/webclient.h index e08b739..d046a6e 100644 --- a/inc/webclient.h +++ b/inc/webclient.h @@ -128,6 +128,7 @@ const char *webclient_header_fields_get(struct webclient_session *session, const /* send HTTP POST/GET request, and get response data */ int webclient_response(struct webclient_session *session, unsigned char **response); int webclient_request(const char *URI, const char *header, const char *post_data, unsigned char **response); +int webclient_request_header_add(char **request_header, const char *fmt, ...); int webclient_resp_status_get(struct webclient_session *session); int webclient_content_length_get(struct webclient_session *session); diff --git a/samples/webclient_get_sample.c b/samples/webclient_get_sample.c index 7df41b7..87e4a4a 100644 --- a/samples/webclient_get_sample.c +++ b/samples/webclient_get_sample.c @@ -74,7 +74,7 @@ int webclient_get_test(int argc, char **argv) goto __exit; } - rt_kprintf("webclient GET request response data :\n"); + rt_kprintf("get response data: \n"); content_length = webclient_content_length_get(session); if (content_length < 0) @@ -140,7 +140,65 @@ __exit: return ret; } + +int webclient_get_smpl_test(int argc, char **argv) +{ + char *URI, *request; + int index; + + if (argc == 1) + { + URI = web_strdup(GET_LOCAL_URI); + if(URI == RT_NULL) + { + rt_kprintf("no memory for create URI buffer.\n"); + return -1; + } + } + else if (argc == 2) + { + URI = web_strdup(argv[1]); + if(URI == RT_NULL) + { + rt_kprintf("no memory for create URI buffer.\n"); + return -1; + } + } + else + { + rt_kprintf("webclient_get_smpl_test [URI] - webclient simplify GET request test.\n"); + return -1; + } + + if (webclient_request(URI, RT_NULL, RT_NULL, (unsigned char **)&request) < 0) + { + rt_kprintf("webclient send get request failed."); + web_free(URI); + return -1; + } + + rt_kprintf("get response data: \n"); + for (index = 0; index < rt_strlen(request); index++) + { + rt_kprintf("%c", request[index]); + } + rt_kprintf("\n"); + + if (request) + { + web_free(request); + } + + if (URI) + { + web_free(URI); + } + + return 0; +} + #ifdef FINSH_USING_MSH #include -MSH_CMD_EXPORT_ALIAS(webclient_get_test, web_get_test, web_get_test [URI] webclient GET request test); +MSH_CMD_EXPORT_ALIAS(webclient_get_test, web_get, web_get [URI] webclient GET request test); +MSH_CMD_EXPORT_ALIAS(webclient_get_smpl_test, web_get_smpl, web_get_smpl [URI] webclient simplify GET request test); #endif /* FINSH_USING_MSH */ diff --git a/samples/webclient_post_sample.c b/samples/webclient_post_sample.c index 538e01e..ef7e34a 100644 --- a/samples/webclient_post_sample.c +++ b/samples/webclient_post_sample.c @@ -81,7 +81,7 @@ int webclient_post_test(int argc, char **argv) goto __exit; } - rt_kprintf("webclient POST request response data :\n"); + rt_kprintf("post response data: \n"); do { bytes_read = webclient_read(session, buffer, POST_RESP_BUFSZ); @@ -117,7 +117,72 @@ __exit: return ret; } +int webclient_post_smpl_test(int argc, char **argv) +{ + char *URI, *request, *header = RT_NULL; + int index; + + if (argc == 1) + { + URI = web_strdup(POST_LOCAL_URI); + if(URI == RT_NULL) + { + rt_kprintf("no memory for create URI buffer.\n"); + return -1; + } + } + else if (argc == 2) + { + URI = web_strdup(argv[1]); + if(URI == RT_NULL) + { + rt_kprintf("no memory for create URI buffer.\n"); + return -1; + } + } + else + { + rt_kprintf("webclient_post_smpl_test [URI] - webclient simplify POST request test.\n"); + return -1; + } + + webclient_request_header_add(&header, "Content-Length: %d\r\n", strlen(post_data)); + webclient_request_header_add(&header, "Content-Type: application/octet-stream\r\n"); + + if (webclient_request(URI, (const char *)header, post_data, (unsigned char **)&request) < 0) + { + rt_kprintf("webclient send post request failed."); + web_free(header); + web_free(URI); + return -1; + } + + rt_kprintf("post response data: \n"); + for (index = 0; index < rt_strlen(request); index++) + { + rt_kprintf("%c", request[index]); + } + rt_kprintf("\n"); + + if (header) + { + web_free(header); + } + + if (URI) + { + web_free(URI); + } + + if (request) + { + web_free(request); + } + return 0; +} + #ifdef FINSH_USING_MSH #include -MSH_CMD_EXPORT_ALIAS(webclient_post_test, web_post_test, webclient_post_test [URI] - webclient POST request test.); +MSH_CMD_EXPORT_ALIAS(webclient_post_test, web_post, web_post [URI] - webclient POST request test.); +MSH_CMD_EXPORT_ALIAS(webclient_post_smpl_test, web_post_smpl, web_post_smpl [URI] - webclient simplify POST request test.); #endif /* FINSH_USING_MSH */ diff --git a/src/webclient.c b/src/webclient.c index 5301a95..4d222d0 100644 --- a/src/webclient.c +++ b/src/webclient.c @@ -1448,8 +1448,8 @@ int webclient_response(struct webclient_session *session, unsigned char **respon int result_sz; result_sz = session->content_length; - response_buf = web_malloc(result_sz + 1); - if (!response_buf) + response_buf = web_calloc(1, result_sz + 1); + if (response_buf == RT_NULL) { return -WEBCLIENT_NOMEM; } @@ -1481,6 +1481,59 @@ int webclient_response(struct webclient_session *session, unsigned char **respon return total_read; } +/** + * add request(GET/POST) header data. + * + * @param request_header add request buffer address + * @param fmt fields format + * + * @return <=0: add header failed + * >0: add header data size + */ + +int webclient_request_header_add(char **request_header, const char *fmt, ...) +{ + rt_int32_t length, header_length; + char *header; + va_list args; + + RT_ASSERT(request_header); + + if (*request_header == RT_NULL) + { + header = rt_calloc(1, WEBCLIENT_HEADER_BUFSZ); + if (header == RT_NULL) + { + LOG_E("No memory for webclient request header add."); + return RT_NULL; + } + *request_header = header; + } + else + { + header = *request_header; + } + + va_start(args, fmt); + header_length = rt_strlen(header); + length = rt_vsnprintf(header + header_length, WEBCLIENT_HEADER_BUFSZ - header_length, fmt, args); + if (length < 0) + { + LOG_E("add request header data failed, return length(%d) error.", length); + return -WEBCLIENT_ERROR; + } + va_end(args); + + /* check header size */ + if (rt_strlen(header) >= WEBCLIENT_HEADER_BUFSZ) + { + LOG_E("not enough request header data size(%d)!", WEBCLIENT_HEADER_BUFSZ); + return -WEBCLIENT_ERROR; + } + + return length; +} + /** * send request(GET/POST) to server and get response data. * @@ -1512,6 +1565,7 @@ int webclient_request(const char *URI, const char *header, const char *post_data if (post_data == RT_NULL) { + /* send get request */ session = webclient_session_create(WEBCLIENT_HEADER_BUFSZ); if (session == RT_NULL) { @@ -1521,7 +1575,15 @@ int webclient_request(const char *URI, const char *header, const char *post_data if (header != RT_NULL) { - rt_strncpy(session->header->buffer, header, rt_strlen(header)); + char *header_str, *header_ptr; + int header_line_length; + + 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; + webclient_header_fields_add(session, "%.*s", header_line_length, header_str); + header_str += header_line_length; + } } if (webclient_get(session, URI) != 200) @@ -1539,6 +1601,7 @@ int webclient_request(const char *URI, const char *header, const char *post_data } else { + /* send post request */ session = webclient_session_create(WEBCLIENT_HEADER_BUFSZ); if (session == RT_NULL) { @@ -1548,12 +1611,24 @@ int webclient_request(const char *URI, const char *header, const char *post_data if (header != RT_NULL) { - rt_strncpy(session->header->buffer, header, rt_strlen(header)); + char *header_str, *header_ptr; + int header_line_length; + + 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; + webclient_header_fields_add(session, "%.*s", header_line_length, header_str); + header_str += header_line_length; + } } - else + + if (rt_strstr(session->header->buffer, "Content-Length") == RT_NULL) { - /* build header for upload */ webclient_header_fields_add(session, "Content-Length: %d\r\n", rt_strlen(post_data)); + } + + if (rt_strstr(session->header->buffer, "Content-Type") == RT_NULL) + { webclient_header_fields_add(session, "Content-Type: application/octet-stream\r\n"); } @@ -1571,11 +1646,6 @@ int webclient_request(const char *URI, const char *header, const char *post_data } } - if (header != RT_NULL) - { - rt_strncpy(session->header->buffer, header, rt_strlen(header)); - } - __exit: if (session) {