]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/HttpDxe/HttpProto.c
NetworkPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / NetworkPkg / HttpDxe / HttpProto.c
index 35c4a166c445a47ae785e02f23f6fdc904006056..bacfbc99584711c85f1a35422db1795c835c142d 100644 (file)
@@ -3,20 +3,14 @@
 \r
 Copyright (c) 2015 - 2018, 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
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include "HttpDriver.h"\r
 \r
 /**\r
-  The common notify function used in HTTP driver. \r
+  The common notify function used in HTTP driver.\r
 \r
   @param[in]  Event   The event signaled.\r
   @param[in]  Context The context.\r
@@ -54,10 +48,10 @@ HttpTcpTransmitNotifyDpc (
   if (Context == NULL) {\r
     return ;\r
   }\r
-  \r
+\r
   Wrap         = (HTTP_TOKEN_WRAP *) Context;\r
   HttpInstance = Wrap->HttpInstance;\r
-  \r
+\r
   if (!HttpInstance->LocalAddressIsIPv6) {\r
       Wrap->HttpToken->Status = Wrap->TcpWrap.Tx4Token.CompletionToken.Status;\r
       gBS->SignalEvent (Wrap->HttpToken->Event);\r
@@ -72,11 +66,11 @@ HttpTcpTransmitNotifyDpc (
       if (Wrap->TcpWrap.Tx4Token.CompletionToken.Event != NULL) {\r
         gBS->CloseEvent (Wrap->TcpWrap.Tx4Token.CompletionToken.Event);\r
       }\r
-      \r
+\r
   } else {\r
     Wrap->HttpToken->Status = Wrap->TcpWrap.Tx6Token.CompletionToken.Status;\r
     gBS->SignalEvent (Wrap->HttpToken->Event);\r
-    \r
+\r
     //\r
     // Free resources.\r
     //\r
@@ -86,7 +80,7 @@ HttpTcpTransmitNotifyDpc (
 \r
     if (Wrap->TcpWrap.Tx6Token.CompletionToken.Event != NULL) {\r
       gBS->CloseEvent (Wrap->TcpWrap.Tx6Token.CompletionToken.Event);\r
-    }   \r
+    }\r
   }\r
 \r
 \r
@@ -145,11 +139,11 @@ HttpTcpReceiveNotifyDpc (
   Wrap = (HTTP_TOKEN_WRAP *) Context;\r
   HttpInstance = Wrap->HttpInstance;\r
   UsingIpv6    = HttpInstance->LocalAddressIsIPv6;\r
-  \r
+\r
   if (UsingIpv6) {\r
     gBS->CloseEvent (Wrap->TcpWrap.Rx6Token.CompletionToken.Event);\r
     Wrap->TcpWrap.Rx6Token.CompletionToken.Event = NULL;\r
-    \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
@@ -159,30 +153,30 @@ HttpTcpReceiveNotifyDpc (
       if (Item != NULL) {\r
         NetMapRemoveItem (&HttpInstance->RxTokens, Item, NULL);\r
       }\r
-      \r
+\r
       FreePool (Wrap);\r
       Wrap = NULL;\r
-      \r
+\r
       return ;\r
     }\r
 \r
   } else {\r
     gBS->CloseEvent (Wrap->TcpWrap.Rx4Token.CompletionToken.Event);\r
     Wrap->TcpWrap.Rx4Token.CompletionToken.Event = NULL;\r
-    \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
+\r
       Item = NetMapFindKey (&HttpInstance->RxTokens, Wrap->HttpToken);\r
       if (Item != NULL) {\r
         NetMapRemoveItem (&HttpInstance->RxTokens, Item, NULL);\r
       }\r
-      \r
+\r
       FreePool (Wrap);\r
       Wrap = NULL;\r
-      \r
+\r
       return ;\r
     }\r
   }\r
@@ -197,6 +191,16 @@ HttpTcpReceiveNotifyDpc (
     Length = (UINTN) Wrap->TcpWrap.Rx4Data.FragmentTable[0].FragmentLength;\r
   }\r
 \r
+  //\r
+  // Record the CallbackData data.\r
+  //\r
+  HttpInstance->CallbackData.Wrap = (VOID *) Wrap;\r
+  HttpInstance->CallbackData.ParseData = Wrap->HttpToken->Message->Body;\r
+  HttpInstance->CallbackData.ParseDataLength = Length;\r
+\r
+  //\r
+  // Parse Body with CallbackData data.\r
+  //\r
   Status = HttpParseMessageBody (\r
              HttpInstance->MsgParser,\r
              Length,\r
@@ -220,7 +224,7 @@ HttpTcpReceiveNotifyDpc (
   // We receive part of header of next HTTP msg.\r
   //\r
   if (HttpInstance->NextMsg != NULL) {\r
-    Wrap->HttpToken->Message->BodyLength = HttpInstance->NextMsg - \r
+    Wrap->HttpToken->Message->BodyLength = HttpInstance->NextMsg -\r
                                            (CHAR8 *) Wrap->HttpToken->Message->Body;\r
     HttpInstance->CacheLen = Length - Wrap->HttpToken->Message->BodyLength;\r
     if (HttpInstance->CacheLen != 0) {\r
@@ -246,7 +250,7 @@ HttpTcpReceiveNotifyDpc (
   } else {\r
     Wrap->HttpToken->Status = Wrap->TcpWrap.Rx4Token.CompletionToken.Status;\r
   }\r
-  \r
+\r
 \r
   gBS->SignalEvent (Wrap->HttpToken->Event);\r
 \r
@@ -323,7 +327,7 @@ HttpCreateTcpConnCloseEvent (
     if (EFI_ERROR (Status)) {\r
       goto ERROR;\r
     }\r
-    \r
+\r
   } else {\r
     //\r
     // Create events for variuos asynchronous operations.\r
@@ -353,7 +357,7 @@ HttpCreateTcpConnCloseEvent (
       goto ERROR;\r
     }\r
   }\r
-     \r
+\r
   return EFI_SUCCESS;\r
 \r
 ERROR:\r
@@ -401,7 +405,7 @@ HttpCloseTcpConnCloseEvent (
       HttpInstance->Tcp4CloseToken.CompletionToken.Event = NULL;\r
     }\r
   }\r
-  \r
+\r
 }\r
 \r
 /**\r
@@ -436,7 +440,7 @@ HttpCreateTcpTxEvent (
     if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
-  \r
+\r
     TcpWrap->Tx4Data.Push = TRUE;\r
     TcpWrap->Tx4Data.Urgent = FALSE;\r
     TcpWrap->Tx4Data.FragmentCount = 1;\r
@@ -460,9 +464,9 @@ HttpCreateTcpTxEvent (
     TcpWrap->Tx6Data.FragmentCount  = 1;\r
     TcpWrap->Tx6Token.Packet.TxData = &Wrap->TcpWrap.Tx6Data;\r
     TcpWrap->Tx6Token.CompletionToken.Status =EFI_NOT_READY;\r
-    \r
+\r
   }\r
-  \r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -493,7 +497,7 @@ HttpCreateTcpRxEventForHeader (
     if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
-    \r
+\r
     HttpInstance->Rx4Data.FragmentCount = 1;\r
     HttpInstance->Rx4Token.Packet.RxData = &HttpInstance->Rx4Data;\r
     HttpInstance->Rx4Token.CompletionToken.Status = EFI_NOT_READY;\r
@@ -513,7 +517,7 @@ HttpCreateTcpRxEventForHeader (
     HttpInstance->Rx6Data.FragmentCount  =1;\r
     HttpInstance->Rx6Token.Packet.RxData = &HttpInstance->Rx6Data;\r
     HttpInstance->Rx6Token.CompletionToken.Status = EFI_NOT_READY;\r
-    \r
+\r
   }\r
 \r
 \r
@@ -531,7 +535,7 @@ HttpCreateTcpRxEventForHeader (
 **/\r
 EFI_STATUS\r
 HttpCreateTcpRxEvent (\r
-  IN  HTTP_TOKEN_WRAP      *Wrap \r
+  IN  HTTP_TOKEN_WRAP      *Wrap\r
   )\r
 {\r
   EFI_STATUS               Status;\r
@@ -551,7 +555,7 @@ HttpCreateTcpRxEvent (
     if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
-    \r
+\r
     TcpWrap->Rx4Data.FragmentCount = 1;\r
     TcpWrap->Rx4Token.Packet.RxData = &Wrap->TcpWrap.Rx4Data;\r
     TcpWrap->Rx4Token.CompletionToken.Status = EFI_NOT_READY;\r
@@ -563,7 +567,7 @@ HttpCreateTcpRxEvent (
                     HttpTcpReceiveNotify,\r
                     Wrap,\r
                     &TcpWrap->Rx6Token.CompletionToken.Event\r
-                    );  \r
+                    );\r
     if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
@@ -572,7 +576,7 @@ HttpCreateTcpRxEvent (
     TcpWrap->Rx6Token.Packet.RxData = &Wrap->TcpWrap.Rx6Data;\r
     TcpWrap->Rx6Token.CompletionToken.Status = EFI_NOT_READY;\r
   }\r
-  \r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -580,7 +584,7 @@ HttpCreateTcpRxEvent (
   Close Events for Tcp Receive Tokens for HTTP body and HTTP header.\r
 \r
   @param[in]  Wrap               Pointer to HTTP token's wrap data.\r
-  \r
+\r
 **/\r
 VOID\r
 HttpCloseTcpRxEvent (\r
@@ -591,7 +595,7 @@ HttpCloseTcpRxEvent (
 \r
   ASSERT (Wrap != NULL);\r
   HttpInstance   = Wrap->HttpInstance;\r
-  \r
+\r
   if (HttpInstance->LocalAddressIsIPv6) {\r
     if (Wrap->TcpWrap.Rx6Token.CompletionToken.Event != NULL) {\r
       gBS->CloseEvent (Wrap->TcpWrap.Rx6Token.CompletionToken.Event);\r
@@ -605,7 +609,7 @@ HttpCloseTcpRxEvent (
     if (Wrap->TcpWrap.Rx4Token.CompletionToken.Event != NULL) {\r
       gBS->CloseEvent (Wrap->TcpWrap.Rx4Token.CompletionToken.Event);\r
     }\r
-    \r
+\r
     if (HttpInstance->Rx4Token.CompletionToken.Event != NULL) {\r
       gBS->CloseEvent (HttpInstance->Rx4Token.CompletionToken.Event);\r
       HttpInstance->Rx4Token.CompletionToken.Event = NULL;\r
@@ -619,7 +623,7 @@ HttpCloseTcpRxEvent (
   @param[in, out]  HttpInstance         Pointer to HTTP_PROTOCOL structure.\r
   @param[in]       IpVersion            Indicate us TCP4 protocol or TCP6 protocol.\r
 \r
-  @retval EFI_SUCCESS       HTTP_PROTOCOL structure is initialized successfully.                                          \r
+  @retval EFI_SUCCESS       HTTP_PROTOCOL structure is initialized successfully.\r
   @retval Others            Other error as indicated.\r
 \r
 **/\r
@@ -632,10 +636,10 @@ HttpInitProtocol (
   EFI_STATUS                     Status;\r
   VOID                           *Interface;\r
   BOOLEAN                        UsingIpv6;\r
-  \r
+\r
   ASSERT (HttpInstance != NULL);\r
   UsingIpv6 = IpVersion;\r
-  \r
+\r
   if (!UsingIpv6) {\r
     //\r
     // Create TCP4 child.\r
@@ -659,7 +663,7 @@ HttpInitProtocol (
                     HttpInstance->Service->ControllerHandle,\r
                     EFI_OPEN_PROTOCOL_BY_DRIVER\r
                     );\r
-                    \r
+\r
     if (EFI_ERROR (Status)) {\r
       goto ON_ERROR;\r
     }\r
@@ -710,7 +714,7 @@ HttpInitProtocol (
                     HttpInstance->Service->ControllerHandle,\r
                     EFI_OPEN_PROTOCOL_BY_DRIVER\r
                     );\r
-    \r
+\r
     if (EFI_ERROR (Status)) {\r
       goto ON_ERROR;\r
     }\r
@@ -723,10 +727,10 @@ HttpInitProtocol (
                     HttpInstance->Handle,\r
                     EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
                     );\r
-    \r
+\r
     if (EFI_ERROR(Status)) {\r
       goto ON_ERROR;\r
-    }      \r
+    }\r
 \r
     Status = gBS->OpenProtocol (\r
                     HttpInstance->Service->Tcp6ChildHandle,\r
@@ -741,7 +745,7 @@ HttpInitProtocol (
       goto ON_ERROR;\r
     }\r
   }\r
-  \r
+\r
   HttpInstance->Url = AllocateZeroPool (HTTP_URL_BUFFER_LEN);\r
   if (HttpInstance->Url == NULL) {\r
     Status = EFI_OUT_OF_RESOURCES;\r
@@ -751,7 +755,7 @@ HttpInitProtocol (
   return EFI_SUCCESS;\r
 \r
 ON_ERROR:\r
-  \r
+\r
   if (HttpInstance->Tcp4ChildHandle != NULL) {\r
     gBS->CloseProtocol (\r
            HttpInstance->Tcp4ChildHandle,\r
@@ -765,8 +769,8 @@ ON_ERROR:
            &gEfiTcp4ProtocolGuid,\r
            HttpInstance->Service->Ip4DriverBindingHandle,\r
            HttpInstance->Handle\r
-           );    \r
-    \r
+           );\r
+\r
     NetLibDestroyServiceChild (\r
       HttpInstance->Service->ControllerHandle,\r
       HttpInstance->Service->Ip4DriverBindingHandle,\r
@@ -774,7 +778,7 @@ ON_ERROR:
       HttpInstance->Tcp4ChildHandle\r
       );\r
   }\r
-  \r
+\r
   if (HttpInstance->Service->Tcp4ChildHandle != NULL) {\r
     gBS->CloseProtocol (\r
            HttpInstance->Service->Tcp4ChildHandle,\r
@@ -783,7 +787,7 @@ ON_ERROR:
            HttpInstance->Handle\r
            );\r
   }\r
-  \r
+\r
   if (HttpInstance->Tcp6ChildHandle != NULL) {\r
     gBS->CloseProtocol (\r
            HttpInstance->Tcp6ChildHandle,\r
@@ -798,7 +802,7 @@ ON_ERROR:
            HttpInstance->Service->Ip6DriverBindingHandle,\r
            HttpInstance->Handle\r
            );\r
-    \r
+\r
     NetLibDestroyServiceChild (\r
       HttpInstance->Service->ControllerHandle,\r
       HttpInstance->Service->Ip6DriverBindingHandle,\r
@@ -806,7 +810,7 @@ ON_ERROR:
       HttpInstance->Tcp6ChildHandle\r
       );\r
   }\r
-  \r
+\r
   if (HttpInstance->Service->Tcp6ChildHandle != NULL) {\r
     gBS->CloseProtocol (\r
            HttpInstance->Service->Tcp6ChildHandle,\r
@@ -817,7 +821,7 @@ ON_ERROR:
   }\r
 \r
   return EFI_UNSUPPORTED;\r
-  \r
+\r
 }\r
 \r
 /**\r
@@ -832,7 +836,7 @@ HttpCleanProtocol (
   )\r
 {\r
   HttpCloseConnection (HttpInstance);\r
-  \r
+\r
   HttpCloseTcpConnCloseEvent (HttpInstance);\r
 \r
   if (HttpInstance->TimeoutEvent != NULL) {\r
@@ -855,18 +859,18 @@ HttpCleanProtocol (
     HttpFreeMsgParser (HttpInstance->MsgParser);\r
     HttpInstance->MsgParser = NULL;\r
   }\r
-  \r
+\r
   if (HttpInstance->Url != NULL) {\r
     FreePool (HttpInstance->Url);\r
     HttpInstance->Url = NULL;\r
   }\r
-  \r
+\r
   NetMapClean (&HttpInstance->TxTokens);\r
   NetMapClean (&HttpInstance->RxTokens);\r
 \r
   if (HttpInstance->TlsSb != NULL && HttpInstance->TlsChildHandle != NULL) {\r
     //\r
-    // Destroy the TLS instance.   \r
+    // Destroy the TLS instance.\r
     //\r
     HttpInstance->TlsSb->DestroyChild (HttpInstance->TlsSb, HttpInstance->TlsChildHandle);\r
   }\r
@@ -885,7 +889,7 @@ HttpCleanProtocol (
            HttpInstance->Service->Ip4DriverBindingHandle,\r
            HttpInstance->Handle\r
            );\r
-    \r
+\r
     NetLibDestroyServiceChild (\r
       HttpInstance->Service->ControllerHandle,\r
       HttpInstance->Service->Ip4DriverBindingHandle,\r
@@ -901,7 +905,7 @@ HttpCleanProtocol (
            HttpInstance->Service->Ip4DriverBindingHandle,\r
            HttpInstance->Handle\r
            );\r
-  }  \r
+  }\r
 \r
   if (HttpInstance->Tcp6ChildHandle != NULL) {\r
     gBS->CloseProtocol (\r
@@ -917,7 +921,7 @@ HttpCleanProtocol (
            HttpInstance->Service->Ip6DriverBindingHandle,\r
            HttpInstance->Handle\r
            );\r
-    \r
+\r
     NetLibDestroyServiceChild (\r
       HttpInstance->Service->ControllerHandle,\r
       HttpInstance->Service->Ip6DriverBindingHandle,\r
@@ -925,7 +929,7 @@ HttpCleanProtocol (
       HttpInstance->Tcp6ChildHandle\r
       );\r
   }\r
-  \r
+\r
   if (HttpInstance->Service->Tcp6ChildHandle != NULL) {\r
     gBS->CloseProtocol (\r
            HttpInstance->Service->Tcp6ChildHandle,\r
@@ -935,7 +939,7 @@ HttpCleanProtocol (
            );\r
   }\r
 \r
-  TlsCloseTxRxEvent (HttpInstance); \r
+  TlsCloseTxRxEvent (HttpInstance);\r
 }\r
 \r
 /**\r
@@ -965,13 +969,13 @@ HttpCreateConnection (
       DEBUG ((EFI_D_ERROR, "HttpCreateConnection: Tcp4->Connect() = %r\n", Status));\r
       return Status;\r
     }\r
-    \r
+\r
     while (!HttpInstance->IsTcp4ConnDone) {\r
       HttpInstance->Tcp4->Poll (HttpInstance->Tcp4);\r
     }\r
-    \r
+\r
     Status = HttpInstance->Tcp4ConnToken.CompletionToken.Status;\r
-    \r
+\r
   } else {\r
     HttpInstance->IsTcp6ConnDone = FALSE;\r
     HttpInstance->Tcp6ConnToken.CompletionToken.Status = EFI_NOT_READY;\r
@@ -985,9 +989,9 @@ HttpCreateConnection (
       HttpInstance->Tcp6->Poll (HttpInstance->Tcp6);\r
     }\r
 \r
-    Status = HttpInstance->Tcp6ConnToken.CompletionToken.Status;   \r
+    Status = HttpInstance->Tcp6ConnToken.CompletionToken.Status;\r
   }\r
-  \r
+\r
   if (!EFI_ERROR (Status)) {\r
     HttpInstance->State = HTTP_STATE_TCP_CONNECTED;\r
   }\r
@@ -1024,7 +1028,7 @@ HttpCloseConnection (
       while (!HttpInstance->IsTcp6CloseDone) {\r
         HttpInstance->Tcp6->Poll (HttpInstance->Tcp6);\r
       }\r
-      \r
+\r
     } else {\r
       HttpInstance->Tcp4CloseToken.AbortOnClose = TRUE;\r
       HttpInstance->IsTcp4CloseDone             = FALSE;\r
@@ -1070,7 +1074,7 @@ HttpConfigureTcp4 (
 \r
   Tcp4CfgData = &HttpInstance->Tcp4CfgData;\r
   ZeroMem (Tcp4CfgData, sizeof (EFI_TCP4_CONFIG_DATA));\r
-  \r
+\r
   Tcp4CfgData->TypeOfService = HTTP_TOS_DEAULT;\r
   Tcp4CfgData->TimeToLive    = HTTP_TTL_DEAULT;\r
   Tcp4CfgData->ControlOption = &HttpInstance->Tcp4Option;\r
@@ -1081,7 +1085,7 @@ HttpConfigureTcp4 (
     IP4_COPY_ADDRESS (&Tcp4AP->StationAddress, &HttpInstance->IPv4Node.LocalAddress);\r
     IP4_COPY_ADDRESS (&Tcp4AP->SubnetMask, &HttpInstance->IPv4Node.LocalSubnet);\r
   }\r
-  \r
+\r
   Tcp4AP->StationPort = HttpInstance->IPv4Node.LocalPort;\r
   Tcp4AP->RemotePort  = HttpInstance->RemotePort;\r
   Tcp4AP->ActiveFlag  = TRUE;\r
@@ -1141,16 +1145,16 @@ HttpConfigureTcp6 (
   EFI_TCP6_CONFIG_DATA     *Tcp6CfgData;\r
   EFI_TCP6_ACCESS_POINT    *Tcp6Ap;\r
   EFI_TCP6_OPTION          *Tcp6Option;\r
-  \r
+\r
   ASSERT (HttpInstance != NULL);\r
-  \r
+\r
   Tcp6CfgData = &HttpInstance->Tcp6CfgData;\r
   ZeroMem (Tcp6CfgData, sizeof (EFI_TCP6_CONFIG_DATA));\r
 \r
   Tcp6CfgData->TrafficClass  = 0;\r
   Tcp6CfgData->HopLimit      = 255;\r
   Tcp6CfgData->ControlOption = &HttpInstance->Tcp6Option;\r
-  \r
+\r
   Tcp6Ap  = &Tcp6CfgData->AccessPoint;\r
   Tcp6Ap->ActiveFlag  = TRUE;\r
   Tcp6Ap->StationPort = HttpInstance->Ipv6Node.LocalPort;\r
@@ -1175,7 +1179,7 @@ HttpConfigureTcp6 (
     DEBUG ((EFI_D_ERROR, "HttpConfigureTcp6 - %r\n", Status));\r
     return Status;\r
   }\r
-  \r
+\r
   Status = HttpCreateTcpConnCloseEvent (HttpInstance);\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
@@ -1189,11 +1193,11 @@ HttpConfigureTcp6 (
   HttpInstance->State = HTTP_STATE_TCP_CONFIGED;\r
 \r
   return EFI_SUCCESS;\r
\r
+\r
 }\r
 \r
 /**\r
-  Check existing TCP connection, if in error state, recover TCP4 connection. Then, \r
+  Check existing TCP connection, if in error state, recover TCP4 connection. Then,\r
   connect one TLS session if required.\r
 \r
   @param[in]  HttpInstance       The HTTP instance private data.\r
@@ -1217,8 +1221,8 @@ HttpConnectTcp4 (
   }\r
 \r
   Status = HttpInstance->Tcp4->GetModeData(\r
-                                 HttpInstance->Tcp4, \r
-                                 &Tcp4State, \r
+                                 HttpInstance->Tcp4,\r
+                                 &Tcp4State,\r
                                  NULL,\r
                                  NULL,\r
                                  NULL,\r
@@ -1240,7 +1244,7 @@ HttpConnectTcp4 (
     DEBUG ((EFI_D_ERROR, "Tcp4 Connection fail - %x\n", Status));\r
     return Status;\r
   }\r
-  \r
+\r
   //\r
   // Tls session connection.\r
   //\r
@@ -1270,11 +1274,11 @@ HttpConnectTcp4 (
       TlsCloseTxRxEvent (HttpInstance);\r
       return Status;\r
     }\r
-    \r
+\r
     Status = TlsConnectSession (HttpInstance, HttpInstance->TimeoutEvent);\r
 \r
     gBS->SetTimer (HttpInstance->TimeoutEvent, TimerCancel, 0);\r
-    \r
+\r
     if (EFI_ERROR (Status)) {\r
       TlsCloseTxRxEvent (HttpInstance);\r
       return Status;\r
@@ -1285,7 +1289,7 @@ HttpConnectTcp4 (
 }\r
 \r
 /**\r
-  Check existing TCP connection, if in error state, recover TCP6 connection. Then, \r
+  Check existing TCP connection, if in error state, recover TCP6 connection. Then,\r
   connect one TLS session if required.\r
 \r
   @param[in]  HttpInstance       The HTTP instance private data.\r
@@ -1315,7 +1319,7 @@ HttpConnectTcp6 (
                                  NULL,\r
                                  NULL\r
                                  );\r
-  \r
+\r
   if (EFI_ERROR(Status)){\r
      DEBUG ((EFI_D_ERROR, "Tcp6 GetModeData fail - %x\n", Status));\r
      return Status;\r
@@ -1332,7 +1336,7 @@ HttpConnectTcp6 (
     DEBUG ((EFI_D_ERROR, "Tcp6 Connection fail - %x\n", Status));\r
     return Status;\r
   }\r
-  \r
+\r
   //\r
   // Tls session connection.\r
   //\r
@@ -1362,11 +1366,11 @@ HttpConnectTcp6 (
       TlsCloseTxRxEvent (HttpInstance);\r
       return Status;\r
     }\r
-    \r
+\r
     Status = TlsConnectSession (HttpInstance, HttpInstance->TimeoutEvent);\r
 \r
     gBS->SetTimer (HttpInstance->TimeoutEvent, TimerCancel, 0);\r
-    \r
+\r
     if (EFI_ERROR (Status)) {\r
       TlsCloseTxRxEvent (HttpInstance);\r
       return Status;\r
@@ -1384,7 +1388,7 @@ HttpConnectTcp6 (
   @param[in]  Configure          The Flag indicates whether need to initialize session.\r
   @param[in]  TlsConfigure       The Flag indicates whether it's the new Tls session.\r
 \r
-  @retval EFI_SUCCESS            The initialization of session is done. \r
+  @retval EFI_SUCCESS            The initialization of session is done.\r
   @retval Others                 Other error as indicated.\r
 \r
 **/\r
@@ -1446,9 +1450,9 @@ HttpInitSession (
       return Status;\r
     }\r
   }\r
-  \r
+\r
   return EFI_SUCCESS;\r
-  \r
+\r
 }\r
 \r
 /**\r
@@ -1476,7 +1480,7 @@ HttpTransmitTcp (
   EFI_TCP4_PROTOCOL             *Tcp4;\r
   EFI_TCP6_IO_TOKEN             *Tx6Token;\r
   EFI_TCP6_PROTOCOL             *Tcp6;\r
-  UINT8                         *TlsRecord;  \r
+  UINT8                         *TlsRecord;\r
   UINT16                        PayloadSize;\r
   NET_FRAGMENT                  TempFragment;\r
   NET_FRAGMENT                  Fragment;\r
@@ -1522,19 +1526,19 @@ HttpTransmitTcp (
     RemainingLen = TxStringLen;\r
     while (RemainingLen != 0) {\r
       PayloadSize = (UINT16) MIN (TLS_PLAINTEXT_RECORD_MAX_PAYLOAD_LENGTH, RemainingLen);\r
-      \r
+\r
       ((TLS_RECORD_HEADER *) TlsRecord)->ContentType = TlsContentTypeApplicationData;\r
       ((TLS_RECORD_HEADER *) TlsRecord)->Version.Major = HttpInstance->TlsConfigData.Version.Major;\r
       ((TLS_RECORD_HEADER *) TlsRecord)->Version.Minor = HttpInstance->TlsConfigData.Version.Minor;\r
       ((TLS_RECORD_HEADER *) TlsRecord)->Length = PayloadSize;\r
 \r
       CopyMem (TlsRecord + TLS_RECORD_HEADER_LENGTH, TxString + (TxStringLen - RemainingLen), PayloadSize);\r
-      \r
+\r
       Status = TlsProcessMessage (\r
-                 HttpInstance, \r
-                 TlsRecord, \r
-                 TLS_RECORD_HEADER_LENGTH + PayloadSize, \r
-                 EfiTlsEncrypt, \r
+                 HttpInstance,\r
+                 TlsRecord,\r
+                 TLS_RECORD_HEADER_LENGTH + PayloadSize,\r
+                 EfiTlsEncrypt,\r
                  &TempFragment\r
                  );\r
       if (EFI_ERROR (Status)) {\r
@@ -1542,7 +1546,7 @@ HttpTransmitTcp (
       }\r
 \r
       //\r
-      // Record the processed/encrypted Packet. \r
+      // Record the processed/encrypted Packet.\r
       //\r
       CopyMem (Fragment.Bulk + Fragment.Len, TempFragment.Bulk, TempFragment.Len);\r
       Fragment.Len += TempFragment.Len;\r
@@ -1550,7 +1554,7 @@ HttpTransmitTcp (
       FreePool (TempFragment.Bulk);\r
       TempFragment.Len  = 0;\r
       TempFragment.Bulk = NULL;\r
-      \r
+\r
       RemainingLen -= (UINTN) PayloadSize;\r
       ZeroMem (TlsRecord, TLS_RECORD_HEADER_LENGTH + TLS_PLAINTEXT_RECORD_MAX_PAYLOAD_LENGTH);\r
     }\r
@@ -1558,7 +1562,7 @@ HttpTransmitTcp (
     FreePool (TlsRecord);\r
     TlsRecord = NULL;\r
   }\r
-  \r
+\r
   if (!HttpInstance->LocalAddressIsIPv6) {\r
     Tcp4 = HttpInstance->Tcp4;\r
     Tx4Token = &Wrap->TcpWrap.Tx4Token;\r
@@ -1572,9 +1576,9 @@ HttpTransmitTcp (
       Tx4Token->Packet.TxData->FragmentTable[0].FragmentLength = (UINT32) TxStringLen;\r
       Tx4Token->Packet.TxData->FragmentTable[0].FragmentBuffer = (VOID *) TxString;\r
     }\r
-    \r
-    Tx4Token->CompletionToken.Status = EFI_NOT_READY;  \r
-    \r
+\r
+    Tx4Token->CompletionToken.Status = EFI_NOT_READY;\r
+\r
     Wrap->TcpWrap.IsTxDone = FALSE;\r
     Status  = Tcp4->Transmit (Tcp4, Tx4Token);\r
     if (EFI_ERROR (Status)) {\r
@@ -1585,7 +1589,7 @@ HttpTransmitTcp (
   } else {\r
     Tcp6 = HttpInstance->Tcp6;\r
     Tx6Token = &Wrap->TcpWrap.Tx6Token;\r
-    \r
+\r
     if (HttpInstance->UseHttps) {\r
       Tx6Token->Packet.TxData->DataLength = Fragment.Len;\r
       Tx6Token->Packet.TxData->FragmentTable[0].FragmentLength = Fragment.Len;\r
@@ -1595,7 +1599,7 @@ HttpTransmitTcp (
       Tx6Token->Packet.TxData->FragmentTable[0].FragmentLength = (UINT32) TxStringLen;\r
       Tx6Token->Packet.TxData->FragmentTable[0].FragmentBuffer = (VOID *) TxString;\r
     }\r
-    \r
+\r
     Tx6Token->CompletionToken.Status = EFI_NOT_READY;\r
 \r
     Wrap->TcpWrap.IsTxDone = FALSE;\r
@@ -1605,17 +1609,17 @@ HttpTransmitTcp (
       goto ON_ERROR;\r
     }\r
   }\r
-  \r
+\r
   return Status;\r
 \r
 ON_ERROR:\r
-  \r
+\r
   if (HttpInstance->UseHttps) {\r
     if (TlsRecord != NULL) {\r
       FreePool (TlsRecord);\r
       TlsRecord = NULL;\r
     }\r
-    \r
+\r
     if (Fragment.Bulk != NULL) {\r
       FreePool (Fragment.Bulk);\r
       Fragment.Bulk = NULL;\r
@@ -1686,7 +1690,7 @@ HttpTcpNotReady (
   if (!ValueInItem->TcpWrap.IsTxDone) {\r
     return EFI_NOT_READY;\r
   }\r
-  \r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -1798,8 +1802,8 @@ HttpTcpReceive (
   @param[in, out]  SizeofHeaders    The HTTP header length.\r
   @param[in, out]  BufferSize       The size of buffer to cacahe the header message.\r
   @param[in]       Timeout          The time to wait for receiving the header packet.\r
-  \r
-  @retval EFI_SUCCESS               The HTTP header is received.                          \r
+\r
+  @retval EFI_SUCCESS               The HTTP header is received.\r
   @retval Others                    Other errors as indicated.\r
 \r
 **/\r
@@ -1832,7 +1836,7 @@ HttpTcpReceiveHeader (
   Rx6Token    = NULL;\r
   Fragment.Len  = 0;\r
   Fragment.Bulk = NULL;\r
-  \r
+\r
   if (HttpInstance->LocalAddressIsIPv6) {\r
     ASSERT (Tcp6 != NULL);\r
   } else {\r
@@ -1855,7 +1859,7 @@ HttpTcpReceiveHeader (
         return Status;\r
       }\r
     }\r
-  \r
+\r
     //\r
     // Receive the HTTP headers only when EFI_HTTP_RESPONSE_DATA is not NULL.\r
     //\r
@@ -1887,7 +1891,7 @@ HttpTcpReceiveHeader (
         if (EFI_ERROR (Status)) {\r
           return Status;\r
         }\r
-        \r
+\r
         Fragment.Len  = Rx4Token->Packet.RxData->FragmentTable[0].FragmentLength;\r
         Fragment.Bulk = (UINT8 *) Rx4Token->Packet.RxData->FragmentTable[0].FragmentBuffer;\r
       } else {\r
@@ -1895,7 +1899,7 @@ HttpTcpReceiveHeader (
           FreePool (Fragment.Bulk);\r
           Fragment.Bulk = NULL;\r
         }\r
-        \r
+\r
         Status = HttpsReceive (HttpInstance, &Fragment, Timeout);\r
         if (EFI_ERROR (Status)) {\r
           DEBUG ((EFI_D_ERROR, "Tcp4 receive failed: %r\n", Status));\r
@@ -1904,10 +1908,10 @@ HttpTcpReceiveHeader (
       }\r
 \r
       //\r
-      // Append the response string.\r
+      // Append the response string along with a Null-terminator.\r
       //\r
       *BufferSize = *SizeofHeaders + Fragment.Len;\r
-      Buffer      = AllocateZeroPool (*BufferSize);\r
+      Buffer      = AllocatePool (*BufferSize + 1);\r
       if (Buffer == NULL) {\r
         Status = EFI_OUT_OF_RESOURCES;\r
         return Status;\r
@@ -1923,6 +1927,7 @@ HttpTcpReceiveHeader (
         Fragment.Bulk,\r
         Fragment.Len\r
         );\r
+      *(Buffer + *BufferSize) = '\0';\r
       *HttpHeaders   = Buffer;\r
       *SizeofHeaders = *BufferSize;\r
 \r
@@ -1931,7 +1936,7 @@ HttpTcpReceiveHeader (
       //\r
       *EndofHeader = AsciiStrStr (*HttpHeaders, HTTP_END_OF_HDR_STR);\r
     };\r
-    \r
+\r
     //\r
     // Free the buffer.\r
     //\r
@@ -1944,7 +1949,7 @@ HttpTcpReceiveHeader (
     if (Fragment.Bulk != NULL) {\r
       FreePool (Fragment.Bulk);\r
       Fragment.Bulk = NULL;\r
-    } \r
+    }\r
   } else {\r
     if (!HttpInstance->UseHttps) {\r
       Rx6Token = &HttpInstance->Rx6Token;\r
@@ -1954,7 +1959,7 @@ HttpTcpReceiveHeader (
         return Status;\r
       }\r
     }\r
-  \r
+\r
     //\r
     // Receive the HTTP headers only when EFI_HTTP_RESPONSE_DATA is not NULL.\r
     //\r
@@ -1986,7 +1991,7 @@ HttpTcpReceiveHeader (
         if (EFI_ERROR (Status)) {\r
           return Status;\r
         }\r
-        \r
+\r
         Fragment.Len  = Rx6Token->Packet.RxData->FragmentTable[0].FragmentLength;\r
         Fragment.Bulk = (UINT8 *) Rx6Token->Packet.RxData->FragmentTable[0].FragmentBuffer;\r
       } else {\r
@@ -1994,7 +1999,7 @@ HttpTcpReceiveHeader (
           FreePool (Fragment.Bulk);\r
           Fragment.Bulk = NULL;\r
         }\r
-        \r
+\r
         Status = HttpsReceive (HttpInstance, &Fragment, Timeout);\r
         if (EFI_ERROR (Status)) {\r
           DEBUG ((EFI_D_ERROR, "Tcp6 receive failed: %r\n", Status));\r
@@ -2003,10 +2008,10 @@ HttpTcpReceiveHeader (
       }\r
 \r
       //\r
-      // Append the response string.\r
+      // Append the response string along with a Null-terminator.\r
       //\r
       *BufferSize = *SizeofHeaders + Fragment.Len;\r
-      Buffer      = AllocateZeroPool (*BufferSize);\r
+      Buffer      = AllocatePool (*BufferSize + 1);\r
       if (Buffer == NULL) {\r
         Status = EFI_OUT_OF_RESOURCES;\r
         return Status;\r
@@ -2022,13 +2027,14 @@ HttpTcpReceiveHeader (
         Fragment.Bulk,\r
         Fragment.Len\r
         );\r
+      *(Buffer + *BufferSize) = '\0';\r
       *HttpHeaders   = Buffer;\r
       *SizeofHeaders = *BufferSize;\r
 \r
       //\r
       // Check whether we received end of HTTP headers.\r
       //\r
-      *EndofHeader = AsciiStrStr (*HttpHeaders, HTTP_END_OF_HDR_STR); \r
+      *EndofHeader = AsciiStrStr (*HttpHeaders, HTTP_END_OF_HDR_STR);\r
     };\r
 \r
     //\r
@@ -2044,7 +2050,7 @@ HttpTcpReceiveHeader (
       FreePool (Fragment.Bulk);\r
       Fragment.Bulk = NULL;\r
     }\r
-  }     \r
+  }\r
 \r
   //\r
   // Skip the CRLF after the HTTP headers.\r
@@ -2062,7 +2068,7 @@ HttpTcpReceiveHeader (
   @param[in]  Wrap               The HTTP token's wrap data.\r
   @param[in]  HttpMsg            The HTTP message data.\r
 \r
-  @retval EFI_SUCCESS            The HTTP body is received.                          \r
+  @retval EFI_SUCCESS            The HTTP body is received.\r
   @retval Others                 Other error as indicated.\r
 \r
 **/\r
@@ -2078,19 +2084,19 @@ HttpTcpReceiveBody (
   EFI_TCP6_IO_TOKEN         *Rx6Token;\r
   EFI_TCP4_PROTOCOL         *Tcp4;\r
   EFI_TCP4_IO_TOKEN         *Rx4Token;\r
-  \r
+\r
   HttpInstance   = Wrap->HttpInstance;\r
   Tcp4 = HttpInstance->Tcp4;\r
   Tcp6 = HttpInstance->Tcp6;\r
   Rx4Token       = NULL;\r
   Rx6Token       = NULL;\r
-  \r
+\r
   if (HttpInstance->LocalAddressIsIPv6) {\r
     ASSERT (Tcp6 != NULL);\r
   } else {\r
     ASSERT (Tcp4 != NULL);\r
   }\r
-  \r
+\r
   if (HttpInstance->LocalAddressIsIPv6) {\r
     Rx6Token = &Wrap->TcpWrap.Rx6Token;\r
     Rx6Token ->Packet.RxData->DataLength = (UINT32) MIN (MAX_UINT32, HttpMsg->BodyLength);\r
@@ -2108,7 +2114,7 @@ HttpTcpReceiveBody (
     Rx4Token->Packet.RxData->DataLength = (UINT32) MIN (MAX_UINT32, HttpMsg->BodyLength);\r
     Rx4Token->Packet.RxData->FragmentTable[0].FragmentLength = (UINT32) MIN (MAX_UINT32, HttpMsg->BodyLength);\r
     Rx4Token->Packet.RxData->FragmentTable[0].FragmentBuffer = (VOID *) HttpMsg->Body;\r
-    \r
+\r
     Rx4Token->CompletionToken.Status = EFI_NOT_READY;\r
     Status = Tcp4->Receive (Tcp4, Rx4Token);\r
     if (EFI_ERROR (Status)) {\r
@@ -2125,13 +2131,13 @@ HttpTcpReceiveBody (
   Clean up Tcp Tokens while the Tcp transmission error occurs.\r
 \r
   @param[in]  Wrap               Pointer to HTTP token's wrap data.\r
-  \r
+\r
 **/\r
 VOID\r
 HttpTcpTokenCleanup (\r
   IN  HTTP_TOKEN_WRAP      *Wrap\r
   )\r
-{ \r
+{\r
   HTTP_PROTOCOL            *HttpInstance;\r
   EFI_TCP4_IO_TOKEN        *Rx4Token;\r
   EFI_TCP6_IO_TOKEN        *Rx6Token;\r
@@ -2140,10 +2146,10 @@ HttpTcpTokenCleanup (
   HttpInstance   = Wrap->HttpInstance;\r
   Rx4Token       = NULL;\r
   Rx6Token       = NULL;\r
-  \r
+\r
   if (HttpInstance->LocalAddressIsIPv6) {\r
     Rx6Token = &Wrap->TcpWrap.Rx6Token;\r
-    \r
+\r
     if (Rx6Token->CompletionToken.Event != NULL) {\r
       gBS->CloseEvent (Rx6Token->CompletionToken.Event);\r
       Rx6Token->CompletionToken.Event = NULL;\r
@@ -2152,25 +2158,25 @@ HttpTcpTokenCleanup (
     FreePool (Wrap);\r
 \r
     Rx6Token = &HttpInstance->Rx6Token;\r
-    \r
+\r
     if (Rx6Token->CompletionToken.Event != NULL) {\r
       gBS->CloseEvent (Rx6Token->CompletionToken.Event);\r
       Rx6Token->CompletionToken.Event = NULL;\r
     }\r
-    \r
+\r
     if (Rx6Token->Packet.RxData->FragmentTable[0].FragmentBuffer != NULL) {\r
       FreePool (Rx6Token->Packet.RxData->FragmentTable[0].FragmentBuffer);\r
       Rx6Token->Packet.RxData->FragmentTable[0].FragmentBuffer = NULL;\r
     }\r
-    \r
+\r
   } else {\r
     Rx4Token = &Wrap->TcpWrap.Rx4Token;\r
-  \r
+\r
     if (Rx4Token->CompletionToken.Event != NULL) {\r
       gBS->CloseEvent (Rx4Token->CompletionToken.Event);\r
       Rx4Token->CompletionToken.Event = NULL;\r
     }\r
-    \r
+\r
     FreePool (Wrap);\r
 \r
     Rx4Token = &HttpInstance->Rx4Token;\r
@@ -2179,8 +2185,8 @@ HttpTcpTokenCleanup (
       gBS->CloseEvent (Rx4Token->CompletionToken.Event);\r
       Rx4Token->CompletionToken.Event = NULL;\r
     }\r
-    \r
-    \r
+\r
+\r
     if (Rx4Token->Packet.RxData->FragmentTable[0].FragmentBuffer != NULL) {\r
       FreePool (Rx4Token->Packet.RxData->FragmentTable[0].FragmentBuffer);\r
       Rx4Token->Packet.RxData->FragmentTable[0].FragmentBuffer = NULL;\r