]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/HttpDxe/HttpProto.c
NetworkPkg: HttpDxe response/cancel issue fix
[mirror_edk2.git] / NetworkPkg / HttpDxe / HttpProto.c
index afa7fe4b3508bf7b286b45c715f745196db2df7c..486b20304f5274be71b35026c09c3f715438914b 100644 (file)
@@ -148,19 +148,41 @@ HttpTcpReceiveNotifyDpc (
   \r
   if (UsingIpv6) {\r
     gBS->CloseEvent (Wrap->TcpWrap.Rx6Token.CompletionToken.Event);\r
+    Wrap->TcpWrap.Rx6Token.CompletionToken.Event = NULL;\r
     \r
     if (EFI_ERROR (Wrap->TcpWrap.Rx6Token.CompletionToken.Status)) {\r
+      DEBUG ((EFI_D_ERROR, "HttpTcpReceiveNotifyDpc: %r!\n", Wrap->TcpWrap.Rx6Token.CompletionToken.Status));\r
       Wrap->HttpToken->Status = Wrap->TcpWrap.Rx6Token.CompletionToken.Status;\r
       gBS->SignalEvent (Wrap->HttpToken->Event);\r
+\r
+      Item = NetMapFindKey (&HttpInstance->RxTokens, Wrap->HttpToken);\r
+      if (Item != NULL) {\r
+        NetMapRemoveItem (&HttpInstance->RxTokens, Item, NULL);\r
+      }\r
+      \r
+      FreePool (Wrap);\r
+      Wrap = NULL;\r
+      \r
       return ;\r
     }\r
 \r
   } else {\r
     gBS->CloseEvent (Wrap->TcpWrap.Rx4Token.CompletionToken.Event);\r
+    Wrap->TcpWrap.Rx4Token.CompletionToken.Event = NULL;\r
     \r
     if (EFI_ERROR (Wrap->TcpWrap.Rx4Token.CompletionToken.Status)) {\r
+      DEBUG ((EFI_D_ERROR, "HttpTcpReceiveNotifyDpc: %r!\n", Wrap->TcpWrap.Rx4Token.CompletionToken.Status));\r
       Wrap->HttpToken->Status = Wrap->TcpWrap.Rx4Token.CompletionToken.Status;\r
       gBS->SignalEvent (Wrap->HttpToken->Event);\r
+      \r
+      Item = NetMapFindKey (&HttpInstance->RxTokens, Wrap->HttpToken);\r
+      if (Item != NULL) {\r
+        NetMapRemoveItem (&HttpInstance->RxTokens, Item, NULL);\r
+      }\r
+      \r
+      FreePool (Wrap);\r
+      Wrap = NULL;\r
+      \r
       return ;\r
     }\r
   }\r
@@ -232,6 +254,9 @@ HttpTcpReceiveNotifyDpc (
   // Check pending RxTokens and receive the HTTP message.\r
   //\r
   NetMapIterate (&Wrap->HttpInstance->RxTokens, HttpTcpReceive, NULL);\r
+\r
+  FreePool (Wrap);\r
+  Wrap = NULL;\r
 }\r
 \r
 /**\r
@@ -408,15 +433,15 @@ HttpCreateTcpTxEvent (
                     Wrap,\r
                     &TcpWrap->Tx4Token.CompletionToken.Event\r
                     );\r
-      if (EFI_ERROR (Status)) {\r
-        return Status;\r
-      }\r
-    \r
-      TcpWrap->Tx4Data.Push = TRUE;\r
-      TcpWrap->Tx4Data.Urgent = FALSE;\r
-      TcpWrap->Tx4Data.FragmentCount = 1;\r
-      TcpWrap->Tx4Token.Packet.TxData = &Wrap->TcpWrap.Tx4Data;\r
-      TcpWrap->Tx4Token.CompletionToken.Status = EFI_NOT_READY;\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+  \r
+    TcpWrap->Tx4Data.Push = TRUE;\r
+    TcpWrap->Tx4Data.Urgent = FALSE;\r
+    TcpWrap->Tx4Data.FragmentCount = 1;\r
+    TcpWrap->Tx4Token.Packet.TxData = &Wrap->TcpWrap.Tx4Data;\r
+    TcpWrap->Tx4Token.CompletionToken.Status = EFI_NOT_READY;\r
 \r
   } else {\r
     Status = gBS->CreateEvent (\r
@@ -436,7 +461,6 @@ HttpCreateTcpTxEvent (
     TcpWrap->Tx6Token.Packet.TxData = &Wrap->TcpWrap.Tx6Data;\r
     TcpWrap->Tx6Token.CompletionToken.Status =EFI_NOT_READY;\r
     \r
-    \r
   }\r
   \r
   return EFI_SUCCESS;\r
@@ -1607,6 +1631,10 @@ HttpTcpReceiveHeader (
       }\r
 \r
       if (!HttpInstance->IsRxDone) {\r
+        //\r
+        // Cancle the Token before close its Event.\r
+        //\r
+        Tcp4->Cancel (HttpInstance->Tcp4, &Rx4Token->CompletionToken);\r
         gBS->CloseEvent (Rx4Token->CompletionToken.Event);\r
         Rx4Token->CompletionToken.Status = EFI_TIMEOUT;\r
       }\r
@@ -1673,6 +1701,10 @@ HttpTcpReceiveHeader (
       }\r
 \r
       if (!HttpInstance->IsRxDone) {\r
+        //\r
+        // Cancle the Token before close its Event.\r
+        //\r
+        Tcp6->Cancel (HttpInstance->Tcp6, &Rx6Token->CompletionToken);\r
         gBS->CloseEvent (Rx6Token->CompletionToken.Event);\r
         Rx6Token->CompletionToken.Status = EFI_TIMEOUT;\r
       }\r
@@ -1728,7 +1760,6 @@ HttpTcpReceiveHeader (
 \r
   @param[in]  Wrap               The HTTP token's wrap data.\r
   @param[in]  HttpMsg            The HTTP message data.\r
-  @param[in]  Timeout            The time to wait for receiving the body packet.\r
 \r
   @retval EFI_SUCCESS            The HTTP body is received.                          \r
   @retval Others                 Other error as indicated.\r
@@ -1737,8 +1768,7 @@ HttpTcpReceiveHeader (
 EFI_STATUS\r
 HttpTcpReceiveBody (\r
   IN  HTTP_TOKEN_WRAP       *Wrap,\r
-  IN  EFI_HTTP_MESSAGE      *HttpMsg,\r
-  IN  EFI_EVENT             Timeout\r
+  IN  EFI_HTTP_MESSAGE      *HttpMsg\r
   )\r
 {\r
   EFI_STATUS                Status;\r
@@ -1772,17 +1802,6 @@ HttpTcpReceiveBody (
       DEBUG ((EFI_D_ERROR, "Tcp6 receive failed: %r\n", Status));\r
       return Status;\r
     }\r
-\r
-    while (!Wrap->TcpWrap.IsRxDone && ((Timeout == NULL) || EFI_ERROR (gBS->CheckEvent (Timeout)))) {\r
-      Tcp6->Poll (Tcp6);\r
-    }\r
-\r
-    if (!Wrap->TcpWrap.IsRxDone) {\r
-      gBS->CloseEvent (Rx6Token->CompletionToken.Event);\r
-      Rx6Token->CompletionToken.Status = EFI_TIMEOUT;\r
-      Wrap->HttpToken->Status = Rx6Token->CompletionToken.Status;\r
-      gBS->SignalEvent (Wrap->HttpToken->Event);\r
-    }\r
   } else {\r
     Rx4Token = &Wrap->TcpWrap.Rx4Token;\r
     Rx4Token->Packet.RxData->DataLength = (UINT32) HttpMsg->BodyLength;\r
@@ -1795,17 +1814,6 @@ HttpTcpReceiveBody (
       DEBUG ((EFI_D_ERROR, "Tcp4 receive failed: %r\n", Status));\r
       return Status;\r
     }\r
-\r
-    while (!Wrap->TcpWrap.IsRxDone && ((Timeout == NULL) || EFI_ERROR (gBS->CheckEvent (Timeout)))) {\r
-      Tcp4->Poll (Tcp4);\r
-    }\r
-\r
-    if (!Wrap->TcpWrap.IsRxDone) {\r
-      gBS->CloseEvent (Rx4Token->CompletionToken.Event);\r
-      Rx4Token->CompletionToken.Status = EFI_TIMEOUT;\r
-      Wrap->HttpToken->Status = Rx4Token->CompletionToken.Status;\r
-      gBS->SignalEvent (Wrap->HttpToken->Event);\r
-    }\r
   }\r
 \r
   return EFI_SUCCESS;\r