Przeglądaj źródła

【修复】http location 跳转功能可能存在的 session 重复创建和释放问题

Signed-off-by: chenyong <chenyong@rt-thread.com>
chenyong 6 lat temu
rodzic
commit
d50aa9e852
1 zmienionych plików z 34 dodań i 31 usunięć
  1. 34 31
      src/webclient.c

+ 34 - 31
src/webclient.c

@@ -374,9 +374,6 @@ static int webclient_connect(struct webclient_session *session, const char *URI)
     RT_ASSERT(session);
     RT_ASSERT(URI);
 
-    /* initialize the socket of session */
-    session->socket = -1;
-
     timeout.tv_sec = WEBCLIENT_DEFAULT_TIMEO;
     timeout.tv_usec = 0;
 
@@ -864,6 +861,8 @@ struct webclient_session *webclient_session_create(size_t header_sz)
         return RT_NULL;
     }
 
+    /* initialize the socket of session */
+    session->socket = -1;
     session->content_length = -1;
 
     session->header = (struct webclient_header *) web_calloc(1, sizeof(struct webclient_header));
@@ -889,6 +888,8 @@ struct webclient_session *webclient_session_create(size_t header_sz)
     return session;
 }
 
+static int webclient_clean(struct webclient_session *session);
+
 /**
  *  send GET request to http server and get response header.
  *
@@ -943,15 +944,11 @@ int webclient_get(struct webclient_session *session, const char *URI)
                 return -WEBCLIENT_NOMEM;
             }
 
-            /* close old client session */
-            webclient_close(session);
-
-            /* create new client session by location url */
-            session = webclient_session_create(WEBCLIENT_HEADER_BUFSZ);
-            if (session == RT_NULL)
-            {
-                return  -WEBCLIENT_NOMEM;
-            }
+            /* clean webclient session */
+            webclient_clean(session);
+            /* clean webclient session header */
+            session->header->length = 0;
+            rt_memset(session->header->buffer, 0, session->header->size);
 
             rc = webclient_get(session, new_url);
 
@@ -1020,15 +1017,11 @@ int webclient_get_position(struct webclient_session *session, const char *URI, i
                 return -WEBCLIENT_NOMEM;
             }
 
-            /* close old client session */
-            webclient_close(session);
-
-            /* create new client session by location url */
-            session = webclient_session_create(WEBCLIENT_HEADER_BUFSZ);
-            if (session == RT_NULL)
-            {
-                return  -WEBCLIENT_NOMEM;
-            }
+            /* clean webclient session */
+            webclient_clean(session);
+            /* clean webclient session header */
+            session->header->length = 0;
+            rt_memset(session->header->buffer, 0, session->header->size);
 
             rc = webclient_get_position(session, new_url, position);
 
@@ -1369,17 +1362,9 @@ int webclient_write(struct webclient_session *session, const unsigned char *buff
     return total_write;
 }
 
-/**
- * close a webclient client session.
- *
- * @param session http client session
- *
- * @return 0: close success
- */
-int webclient_close(struct webclient_session *session)
+/* close session socket, free host and request url */
+static int webclient_clean(struct webclient_session *session)
 {
-    RT_ASSERT(session);
-
 #ifdef WEBCLIENT_USING_MBED_TLS
     if (session->tls_session)
     {
@@ -1411,6 +1396,24 @@ int webclient_close(struct webclient_session *session)
         web_free(session->req_url);
     }
 
+    session->content_length = -1;
+
+    return 0;
+}
+
+/**
+ * close a webclient client session.
+ *
+ * @param session http client session
+ *
+ * @return 0: close success
+ */
+int webclient_close(struct webclient_session *session)
+{
+    RT_ASSERT(session);
+
+    webclient_clean(session);
+
     if (session->header && session->header->buffer)
     {
         web_free(session->header->buffer);