From f3619983529f60bccaed9244c23b6b081abf1928 Mon Sep 17 00:00:00 2001 From: Junyeon LEE Date: Mon, 3 Jul 2017 23:13:26 +0900 Subject: [PATCH] netutils/webserver: fix chunked-encoding problem. This commit fixes chunked encoding problem in webserver. Webserver sometimes misunderstood received data whether chunked or content-length. This problem is caused by uninitialized request structure and fixed it. Additinally, chunked routine added in PUT callback. Change-Id: If63dace52e03feb3b71a4fc18f957c8822ec13d3 Signed-off-by: Junyeon LEE --- apps/examples/webserver/webserver_main.c | 12 +++++++++++- apps/netutils/webserver/http_client.c | 3 ++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/apps/examples/webserver/webserver_main.c b/apps/examples/webserver/webserver_main.c index b422bba..e976950 100644 --- a/apps/examples/webserver/webserver_main.c +++ b/apps/examples/webserver/webserver_main.c @@ -156,6 +156,16 @@ void http_put_callback(struct http_client_t *client, struct http_req_message *r { printf("===== PUT CALLBACK url : %s entity size : %d =====\n", req->url, strlen(req->entity)); + /* + * in callback for POST and PUT request, + * entity must be checked it is null when received chunked entity. + * if it has chunked encoding entity, it must not send response. + */ + if (req->encoding == HTTP_CHUNKED_ENCODING && req->entity[0] != '\0') { + printf("chunk : %s\n", req->entity); + return; + } + if (http_send_response(client, 200, "PUT SUCCESS", NULL) < 0) { printf("Error: Fail to send response\n"); } @@ -184,7 +194,7 @@ void http_post_callback(struct http_client_t *client, struct http_req_message *r * if it has chunked encoding entity, it must not send response. */ if (req->encoding == HTTP_CHUNKED_ENCODING && req->entity[0] != '\0') { - printf("chunk : \n%s\n", req->entity); + printf("chunk : %s\n", req->entity); return; } diff --git a/apps/netutils/webserver/http_client.c b/apps/netutils/webserver/http_client.c index f5b0ca1..b2e7a3d 100644 --- a/apps/netutils/webserver/http_client.c +++ b/apps/netutils/webserver/http_client.c @@ -378,7 +378,7 @@ int http_recv_and_handle_request(struct http_client_t *client, struct http_keyva int buf_len = 0; int remain = HTTP_CONF_MAX_REQUEST_LENGTH; int enc = HTTP_CONTENT_LENGTH; - struct http_req_message req; + struct http_req_message req = {0, }; int state = HTTP_REQUEST_HEADER; struct http_message_len_t mlen = {0,}; struct sockaddr_in addr; @@ -401,6 +401,7 @@ int http_recv_and_handle_request(struct http_client_t *client, struct http_keyva req.url = url; req.headers = request_params; req.client_ip = addr.sin_addr.s_addr; + req.encoding = HTTP_CONTENT_LENGTH; while (!read_finish) { if (remain <= 0) { -- 2.7.4