This patch is used to handle handle HTTPS indefinite poll
case.

Cc: El-Haj-Mahmoud Samer <samer.el-haj-mahm...@hpe.com>
Cc: Ye Ting <ting...@intel.com>
Cc: Fu Siyuan <siyuan...@intel.com>
Cc: Long Qin <qin.l...@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jiaxin Wu <jiaxin...@intel.com>
---
 NetworkPkg/HttpDxe/HttpImpl.c  | 55 ++++++++++++++++++----------------
 NetworkPkg/HttpDxe/HttpProto.c | 68 ++++++++++++++++++++++++++++++++++++++----
 2 files changed, 93 insertions(+), 30 deletions(-)

diff --git a/NetworkPkg/HttpDxe/HttpImpl.c b/NetworkPkg/HttpDxe/HttpImpl.c
index cf58b13..cd8fe05 100644
--- a/NetworkPkg/HttpDxe/HttpImpl.c
+++ b/NetworkPkg/HttpDxe/HttpImpl.c
@@ -1179,47 +1179,50 @@ HttpResponseWorker (
     }    
   }
 
   ASSERT (HttpInstance->MsgParser != NULL);
 
-  //
-  // We still need receive more data when there is no cache data and MsgParser 
is not NULL;
-  //
-  if (!HttpInstance->UseHttps) {
-    if (HttpInstance->TimeoutEvent == NULL) {
-      //
-      // Create TimeoutEvent for response
-      //
-      Status = gBS->CreateEvent (
-                      EVT_TIMER,
-                      TPL_CALLBACK,
-                      NULL,
-                      NULL,
-                      &HttpInstance->TimeoutEvent
-                      );
-      if (EFI_ERROR (Status)) {
-        goto Error;
-      }
-    }
-
+  if (HttpInstance->TimeoutEvent == NULL) {
     //
-    // Start the timer, and wait Timeout seconds to receive the body packet.
+    // Create TimeoutEvent for response
     //
-    Status = gBS->SetTimer (HttpInstance->TimeoutEvent, TimerRelative, 
HTTP_RESPONSE_TIMEOUT * TICKS_PER_SECOND);
+    Status = gBS->CreateEvent (
+                    EVT_TIMER,
+                    TPL_CALLBACK,
+                    NULL,
+                    NULL,
+                    &HttpInstance->TimeoutEvent
+                    );
     if (EFI_ERROR (Status)) {
       goto Error;
     }
-  
+  }
+
+  //
+  // Start the timer, and wait Timeout seconds to receive the body packet.
+  //
+  Status = gBS->SetTimer (HttpInstance->TimeoutEvent, TimerRelative, 
HTTP_RESPONSE_TIMEOUT * TICKS_PER_SECOND);
+  if (EFI_ERROR (Status)) {
+    goto Error;
+  }
+
+  //
+  // We still need receive more data when there is no cache data and MsgParser 
is not NULL;
+  //
+  if (!HttpInstance->UseHttps) {
     Status = HttpTcpReceiveBody (Wrap, HttpMsg, HttpInstance->TimeoutEvent);
 
     gBS->SetTimer (HttpInstance->TimeoutEvent, TimerCancel, 0);
 
     if (EFI_ERROR (Status)) {
       goto Error;
     }
   } else {
-    Status = HttpsReceive (HttpInstance, &Fragment, NULL);
+    Status = HttpsReceive (HttpInstance, &Fragment, 
HttpInstance->TimeoutEvent);
+
+    gBS->SetTimer (HttpInstance->TimeoutEvent, TimerCancel, 0);
+    
     if (EFI_ERROR (Status)) {
       goto Error;
     }
 
     //
@@ -1315,11 +1318,13 @@ Exit:
 
 Error2:
   NetMapInsertHead (&HttpInstance->TxTokens, ValueInItem->HttpToken, 
ValueInItem);
 
 Error:
-  HttpTcpTokenCleanup (Wrap);
+  if (!HttpInstance->UseHttps) {
+    HttpTcpTokenCleanup (Wrap);
+  }
   
   if (HttpHeaders != NULL) {
     FreePool (HttpHeaders);
     HttpHeaders = NULL;
   }
diff --git a/NetworkPkg/HttpDxe/HttpProto.c b/NetworkPkg/HttpDxe/HttpProto.c
index 965a49f..ebb9dd9 100644
--- a/NetworkPkg/HttpDxe/HttpProto.c
+++ b/NetworkPkg/HttpDxe/HttpProto.c
@@ -1230,11 +1230,40 @@ HttpConnectTcp4 (
   
   //
   // Tls session connection.
   //
   if (HttpInstance->UseHttps) {
-    Status = TlsConnectSession (HttpInstance, NULL); 
+    if (HttpInstance->TimeoutEvent == NULL) {
+      //
+      // Create TimeoutEvent for TLS connection.
+      //
+      Status = gBS->CreateEvent (
+                      EVT_TIMER,
+                      TPL_CALLBACK,
+                      NULL,
+                      NULL,
+                      &HttpInstance->TimeoutEvent
+                      );
+      if (EFI_ERROR (Status)) {
+        TlsCloseTxRxEvent (HttpInstance);
+        return Status;
+      }
+    }
+
+    //
+    // Start the timer, and wait Timeout seconds for connection.
+    //
+    Status = gBS->SetTimer (HttpInstance->TimeoutEvent, TimerRelative, 
HTTP_CONNECTION_TIMEOUT * TICKS_PER_SECOND);
+    if (EFI_ERROR (Status)) {
+      TlsCloseTxRxEvent (HttpInstance);
+      return Status;
+    }
+    
+    Status = TlsConnectSession (HttpInstance, HttpInstance->TimeoutEvent);
+
+    gBS->SetTimer (HttpInstance->TimeoutEvent, TimerCancel, 0);
+    
     if (EFI_ERROR (Status)) {
       TlsCloseTxRxEvent (HttpInstance);
       return Status;
     }
   }
@@ -1293,11 +1322,40 @@ HttpConnectTcp6 (
   
   //
   // Tls session connection.
   //
   if (HttpInstance->UseHttps) {
-    Status = TlsConnectSession (HttpInstance, NULL); 
+    if (HttpInstance->TimeoutEvent == NULL) {
+      //
+      // Create TimeoutEvent for TLS connection.
+      //
+      Status = gBS->CreateEvent (
+                      EVT_TIMER,
+                      TPL_CALLBACK,
+                      NULL,
+                      NULL,
+                      &HttpInstance->TimeoutEvent
+                      );
+      if (EFI_ERROR (Status)) {
+        TlsCloseTxRxEvent (HttpInstance);
+        return Status;
+      }
+    }
+
+    //
+    // Start the timer, and wait Timeout seconds for connection.
+    //
+    Status = gBS->SetTimer (HttpInstance->TimeoutEvent, TimerRelative, 
HTTP_CONNECTION_TIMEOUT * TICKS_PER_SECOND);
+    if (EFI_ERROR (Status)) {
+      TlsCloseTxRxEvent (HttpInstance);
+      return Status;
+    }
+    
+    Status = TlsConnectSession (HttpInstance, HttpInstance->TimeoutEvent);
+
+    gBS->SetTimer (HttpInstance->TimeoutEvent, TimerCancel, 0);
+    
     if (EFI_ERROR (Status)) {
       TlsCloseTxRxEvent (HttpInstance);
       return Status;
     }
   }
@@ -1758,11 +1816,11 @@ HttpTcpReceiveHeader (
         if (Fragment.Bulk != NULL) {
           FreePool (Fragment.Bulk);
           Fragment.Bulk = NULL;
         }
         
-        Status = HttpsReceive (HttpInstance, &Fragment, NULL);
+        Status = HttpsReceive (HttpInstance, &Fragment, Timeout);
         if (EFI_ERROR (Status)) {
           DEBUG ((EFI_D_ERROR, "Tcp4 receive failed: %r\n", Status));
           return Status;
         }
       }
@@ -1838,11 +1896,11 @@ HttpTcpReceiveHeader (
         }
 
         if (!HttpInstance->IsRxDone) {
           gBS->CloseEvent (Rx6Token->CompletionToken.Event);
           Rx6Token->CompletionToken.Status = EFI_TIMEOUT;
-        }              
+        }
 
         Status = Rx6Token->CompletionToken.Status;
         if (EFI_ERROR (Status)) {
           return Status;
         }
@@ -1853,11 +1911,11 @@ HttpTcpReceiveHeader (
         if (Fragment.Bulk != NULL) {
           FreePool (Fragment.Bulk);
           Fragment.Bulk = NULL;
         }
         
-        Status = HttpsReceive (HttpInstance, &Fragment, NULL);
+        Status = HttpsReceive (HttpInstance, &Fragment, Timeout);
         if (EFI_ERROR (Status)) {
           DEBUG ((EFI_D_ERROR, "Tcp6 receive failed: %r\n", Status));
           return Status;
         }
       }
-- 
1.9.5.msysgit.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to