]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/HttpDxe/HttpProto.c
NetworkPkg: Replace UnicodeStrToAsciiStr/AsciiStrToUnicodeStr
[mirror_edk2.git] / NetworkPkg / HttpDxe / HttpProto.c
index afa7fe4b3508bf7b286b45c715f745196db2df7c..6373f07215569319b024d91a31799ec23c501182 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Miscellaneous routines for HttpDxe driver.\r
 \r
-Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>\r
 (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
@@ -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
@@ -1465,6 +1489,7 @@ HttpTcpTransmit (
   EFI_STATUS                Status;\r
   CHAR8                     *RequestMsg;\r
   CHAR8                     *Url;\r
+  UINTN                     UrlSize;\r
   UINTN                     RequestMsgSize;\r
 \r
   ValueInItem = (HTTP_TOKEN_WRAP *) Item->Value;\r
@@ -1475,12 +1500,13 @@ HttpTcpTransmit (
   //\r
   // Parse the URI of the remote host.\r
   //\r
-  Url = AllocatePool (StrLen (ValueInItem->HttpToken->Message->Data.Request->Url) + 1);\r
+  UrlSize = StrLen (ValueInItem->HttpToken->Message->Data.Request->Url) + 1;\r
+  Url = AllocatePool (UrlSize);\r
   if (Url == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  UnicodeStrToAsciiStr (ValueInItem->HttpToken->Message->Data.Request->Url, Url);\r
+  UnicodeStrToAsciiStrS (ValueInItem->HttpToken->Message->Data.Request->Url, Url, UrlSize);\r
 \r
   //\r
   // Create request message.\r
@@ -1607,6 +1633,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 +1703,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 +1762,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 +1770,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 +1804,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 +1816,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