Răsfoiți Sursa

Merge pull request #48 from SunXofRTT/sunxin20190301

修正http:
Bernard Xiong 7 ani în urmă
părinte
comite
84f0cd4108
2 a modificat fișierele cu 112 adăugiri și 81 ștergeri
  1. 100 70
      rtthread-port/jerry_request_init.c
  2. 12 11
      rtthread-port/jerry_request_init.h

+ 100 - 70
rtthread-port/jerry_request_init.c

@@ -28,9 +28,21 @@ void request_callback_func(const void *args, uint32_t size)
 void request_callback_free(const void *args, uint32_t size)
 {
     request_tdinfo_t *rp = (request_tdinfo_t *)args;
-    if (rp->session)
+    if (rp->config)
     {
-        webclient_close(rp->session);
+        if (rp->config->session)
+        {
+            webclient_close(rp->config->session);
+        }
+        if (rp->config->url)
+        {
+            free(rp->config->url);
+        }
+        if (rp->config->data)
+        {
+            free(rp->config->data);
+        }
+        free(rp->config);
     }
     js_remove_callback(rp->request_callback);
     js_remove_callback(rp->close_callback);
@@ -86,7 +98,9 @@ void request_create_header(struct webclient_session *session, jerry_value_t head
             jerry_release_value(header_info_value);
         }
         if (session->header->buffer[i] == '\0')
+        {
             enter_index = i;
+        }
     }
 }
 
@@ -128,8 +142,50 @@ bool request_get_header(struct webclient_session *session, jerry_value_t header_
 void request_read_entry(void *p)
 {
     request_tdinfo_t *rp = (request_tdinfo_t *)p;
-    unsigned char *buffer = RT_NULL;
 
+    if (rp->config->session != RT_NULL && rp->config->method == WEBCLIENT_GET)
+    {
+        rp->config->response = webclient_get(rp->config->session, rp->config->url);
+    }
+    else if (rp->config->session != RT_NULL && rp->config->method == WEBCLIENT_POST)
+    {
+        webclient_header_fields_add(rp->config->session, "Content-Length: %d\r\n", strlen(rp->config->data));
+        webclient_header_fields_add(rp->config->session, "Content-Type: application/octet-stream\r\n");
+        rp->config->response = webclient_post(rp->config->session, rp->config->url, rp->config->data);
+    }
+
+    free(rp->config->data);
+    rp->config->data = RT_NULL;
+    free(rp->config->url);
+    rp->config->url = RT_NULL;
+
+    if (rp->config->session == RT_NULL || rp->config->response != 200)
+    {
+        //do fail callback
+        request_cbinfo_t *fail_info  = (request_cbinfo_t *)malloc(sizeof(request_cbinfo_t));
+        fail_info->target_value = rp->target_value;
+        fail_info->callback_name = rt_strdup("fail");
+        fail_info->return_value = RT_NULL;
+        fail_info->data_value = RT_NULL;
+        js_send_callback(rp->request_callback, fail_info, sizeof(request_cbinfo_t));
+        free(fail_info);
+
+        //do complete callback
+        request_cbinfo_t *complete_info  = (request_cbinfo_t *)malloc(sizeof(request_cbinfo_t));;
+        complete_info->target_value = rp->target_value;
+        complete_info->callback_name = rt_strdup("complete");
+        complete_info->return_value = RT_NULL;
+        complete_info->data_value = RT_NULL;
+        js_send_callback(rp->request_callback, complete_info, sizeof(request_cbinfo_t));
+        free(complete_info);
+
+        goto __exit;
+    }
+
+    unsigned char *buffer = RT_NULL;
+    int ret_read = 0;
+    int content_length = webclient_content_length_get(rp->config->session);
+    int per_read_length = 0;
     buffer = (unsigned char *)malloc(READ_MAX_SIZE + 1);
     if (!buffer)
     {
@@ -138,15 +194,36 @@ void request_read_entry(void *p)
     }
     memset(buffer, 0, READ_MAX_SIZE + 1);
 
-    //create a callback function to free manager and close webClient session
-    int ret_read = 0;
-    ret_read = webclient_read(rp->session, buffer, READ_MAX_SIZE + 1);
+    if (content_length != -1)
+    {
+        while (ret_read < content_length)
+        {
+            per_read_length += webclient_read(rp->config->session, buffer + ret_read, READ_MAX_SIZE + 1 - ret_read);
+            if (per_read_length < 0)
+            {
+                ret_read = -1;
+                break;
+            }
+            ret_read += per_read_length;
+        }
+    }
+    else    //Transfer-Encoding: chunked
+    {
+        while (ret_read < READ_MAX_SIZE)
+        {
+            per_read_length = webclient_read(rp->config->session, buffer + ret_read, READ_MAX_SIZE + 1 - ret_read);
+            if (per_read_length <= 0)
+            {
+                break;
+            }
+            ret_read += per_read_length;
+        }
+    }
+
     //If file's size is bigger than buffer's,
     //give up reading and send a fail callback
-    if (ret_read > READ_MAX_SIZE)
+    if (ret_read > READ_MAX_SIZE || ret_read < 0)
     {
-        rt_kprintf("the received message's size is bigger than buffer's\n");
-
         request_cbinfo_t *fail_info = (request_cbinfo_t *)malloc(sizeof(request_cbinfo_t));
         fail_info->target_value = rp->target_value;
         fail_info->callback_name = rt_strdup("fail");
@@ -168,13 +245,13 @@ void request_read_entry(void *p)
         }
         js_set_property(return_value, "data", data_value);
 
-        jerry_value_t statusCode_value = jerry_create_number(webclient_resp_status_get(rp->session));
+        jerry_value_t statusCode_value = jerry_create_number(webclient_resp_status_get(rp->config->session));
         js_set_property(return_value, "statusCode", statusCode_value);
         jerry_release_value(statusCode_value);
 
         /*** header's data saved as Object ***/
         jerry_value_t header_value = jerry_create_object();
-        request_create_header(rp->session, header_value);
+        request_create_header(rp->config->session, header_value);
         js_set_property(return_value, "header", header_value);
         jerry_release_value(header_value);
 
@@ -188,7 +265,7 @@ void request_read_entry(void *p)
         js_send_callback(rp->request_callback, success_info, sizeof(request_cbinfo_t));
         free(success_info);
     }
-
+    free(buffer);
     //do complete callback
     request_cbinfo_t *complete_info  = (request_cbinfo_t *)malloc(sizeof(request_cbinfo_t));;
     complete_info->target_value = rp->target_value;
@@ -198,9 +275,9 @@ void request_read_entry(void *p)
     js_send_callback(rp->request_callback, complete_info, sizeof(request_cbinfo_t));
     free(complete_info);
 
-    free(buffer);
+__exit:
+    //create a callback function to free manager and close webClient session
     js_send_callback(rp->close_callback, rp, sizeof(request_cbinfo_t));
-    free(rp);
 }
 
 void requeset_add_event_listener(jerry_value_t js_target, jerry_value_t requestObj)
@@ -289,69 +366,25 @@ DECLARE_HANDLER(request)
 
     requeset_add_event_listener(rqObj, requestObj);
 
-    request_config_t config;
-    config.method = WEBCLIENT_GET;
-    config.url = RT_NULL;
-    config.data = RT_NULL;
-    config.response = 0;
-    config.session = RT_NULL;
+    request_config_t *config = (request_config_t *)malloc(sizeof(request_config_t));
+    config->method = WEBCLIENT_GET;
+    config->url = RT_NULL;
+    config->data = RT_NULL;
+    config->response = 0;
+    config->session = RT_NULL;
 
-    reqeuset_get_config(&config, requestObj);
-
-    if (config.session != RT_NULL && config.method == WEBCLIENT_GET)
-    {
-        config.response = webclient_get(config.session, config.url);
-    }
-    else if (config.session != RT_NULL && config.method == WEBCLIENT_POST)
-    {
-        webclient_header_fields_add(config.session, "Content-Length: %d\r\n", strlen(config.data));
-        webclient_header_fields_add(config.session, "Content-Type: application/octet-stream\r\n");
-        config.response = webclient_post(config.session, config.url, config.data);
-    }
-
-    free(config.data);
-    free(config.url);
+    reqeuset_get_config(config, requestObj);
 
     request_tdinfo_t *rp = (request_tdinfo_t *)malloc(sizeof(request_tdinfo_t));
     memset(rp, 0, sizeof(request_tdinfo_t));
     rp->request_callback = request_callback;
     rp->close_callback = close_callback;
     rp->target_value = rqObj;
-    rp->session = config.session;
-
-    if (config.session == RT_NULL || config.response != 200)
-    {
-        //do fail callback
-        request_cbinfo_t *fail_info  = (request_cbinfo_t *)malloc(sizeof(request_cbinfo_t));
-        fail_info->target_value = rqObj;
-        fail_info->callback_name = rt_strdup("fail");
-        fail_info->return_value = RT_NULL;
-        fail_info->data_value = RT_NULL;
-
-        js_send_callback(request_callback, fail_info, sizeof(request_cbinfo_t));
-        free(fail_info);
-
-        //do complete callback
-        request_cbinfo_t *complete_info = (request_cbinfo_t *)malloc(sizeof(request_cbinfo_t));
-        complete_info->target_value = rqObj;
-        complete_info->callback_name = rt_strdup("complete");
-        complete_info->return_value = RT_NULL;
-        complete_info->data_value = RT_NULL;
-
-        js_send_callback(request_callback, complete_info, sizeof(request_cbinfo_t));
-        free(complete_info);
-
-        goto __exit;
-    }
+    rp->config = config;
 
     rt_thread_t read_request = rt_thread_create("requestRead", request_read_entry, rp, 1536, 20, 5);
     rt_thread_startup(read_request);
     return jerry_acquire_value(rqObj);
-
-__exit:
-    js_send_callback(close_callback, rp, sizeof(request_tdinfo_t));
-    free(rp);
-    return jerry_create_undefined();
 }
 
 int jerry_request_init(jerry_value_t obj)
@@ -362,12 +395,9 @@ int jerry_request_init(jerry_value_t obj)
 
 static jerry_value_t _jerry_request_init()
 {
-    rt_kprintf(">>>>>>>>>>>>>>>_jerry_request_init<<<<<<<<<<<<<<<<<<<<<\n");
     jerry_value_t js_requset = jerry_create_object();
-
     REGISTER_METHOD_NAME(js_requset, "request", request);
-
-    return jerry_acquire_value(js_requset);
+    return (js_requset);
 }
 
 JS_MODULE(http, _jerry_request_init)

+ 12 - 11
rtthread-port/jerry_request_init.h

@@ -20,23 +20,24 @@ struct request_callback_info
     jerry_value_t return_value;
     jerry_value_t data_value;
     char *callback_name;
-}typedef request_cbinfo_t;
+} typedef request_cbinfo_t;
 
-struct request_thread_info
+struct request_config_info
 {
-    jerry_value_t target_value;
-    struct webclient_session *session;
-    struct js_callback *request_callback;
-    struct js_callback *close_callback;
-}typedef request_tdinfo_t;
-
-struct request_config_info{
     char *url;
     char *data;
-    struct webclient_session* session;
+    struct webclient_session *session;
     int method;
     int response;
-}typedef request_config_t;
+} typedef request_config_t;
+
+struct request_thread_info
+{
+    jerry_value_t target_value;
+    request_config_t *config;
+    struct js_callback *request_callback;
+    struct js_callback *close_callback;
+} typedef request_tdinfo_t;
 
 int jerry_request_init(jerry_value_t obj);