]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/HttpDxe/HttpProto.c
NetworkPkg: Add HTTP Additional Event Notifications
[mirror_edk2.git] / NetworkPkg / HttpDxe / HttpProto.c
index afc7db5a726f62cf85965122061a4b68e5a3fcbc..affa916bd64feb6a874b29dcb86f79a2455f860a 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Miscellaneous routines for HttpDxe driver.\r
 \r
-Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.<BR>\r
 (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
 SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
@@ -966,6 +966,7 @@ HttpCreateConnection (
     HttpInstance->IsTcp4ConnDone = FALSE;\r
     HttpInstance->Tcp4ConnToken.CompletionToken.Status = EFI_NOT_READY;\r
     Status = HttpInstance->Tcp4->Connect (HttpInstance->Tcp4, &HttpInstance->Tcp4ConnToken);\r
+    HttpNotify (HttpEventConnectTcp, Status);\r
     if (EFI_ERROR (Status)) {\r
       DEBUG ((EFI_D_ERROR, "HttpCreateConnection: Tcp4->Connect() = %r\n", Status));\r
       return Status;\r
@@ -981,6 +982,7 @@ HttpCreateConnection (
     HttpInstance->IsTcp6ConnDone = FALSE;\r
     HttpInstance->Tcp6ConnToken.CompletionToken.Status = EFI_NOT_READY;\r
     Status = HttpInstance->Tcp6->Connect (HttpInstance->Tcp6, &HttpInstance->Tcp6ConnToken);\r
+    HttpNotify (HttpEventConnectTcp, Status);\r
     if (EFI_ERROR (Status)) {\r
       DEBUG ((EFI_D_ERROR, "HttpCreateConnection: Tcp6->Connect() = %r\n", Status));\r
       return Status;\r
@@ -1277,6 +1279,7 @@ HttpConnectTcp4 (
     }\r
 \r
     Status = TlsConnectSession (HttpInstance, HttpInstance->TimeoutEvent);\r
+    HttpNotify (HttpEventTlsConnectSession, Status);\r
 \r
     gBS->SetTimer (HttpInstance->TimeoutEvent, TimerCancel, 0);\r
 \r
@@ -1369,6 +1372,7 @@ HttpConnectTcp6 (
     }\r
 \r
     Status = TlsConnectSession (HttpInstance, HttpInstance->TimeoutEvent);\r
+    HttpNotify (HttpEventTlsConnectSession, Status);\r
 \r
     gBS->SetTimer (HttpInstance->TimeoutEvent, TimerCancel, 0);\r
 \r
@@ -2195,3 +2199,55 @@ HttpTcpTokenCleanup (
   }\r
 \r
 }\r
+\r
+/**\r
+  Send Events via EDKII_HTTP_CALLBACK_PROTOCOL.\r
+\r
+  @param[in]  Event               The event that occurs in the current state.\r
+  @param[in]  EventStatus         The Status of Event, EFI_SUCCESS or other errors.\r
+\r
+**/\r
+VOID\r
+HttpNotify (\r
+  IN  EDKII_HTTP_CALLBACK_EVENT         Event,\r
+  IN  EFI_STATUS                        EventStatus\r
+  )\r
+{\r
+  EFI_STATUS                      Status;\r
+  EFI_HANDLE                      *Handles;\r
+  UINTN                           Index;\r
+  UINTN                           HandleCount;\r
+  EFI_HANDLE                      Handle;\r
+  EDKII_HTTP_CALLBACK_PROTOCOL    *HttpCallback;\r
+\r
+  DEBUG ((DEBUG_INFO, "HttpNotify: Event - %d, EventStatus - %r\n", Event, EventStatus));\r
+\r
+  Handles = NULL;\r
+  HandleCount = 0;\r
+  Status = gBS->LocateHandleBuffer (\r
+                  ByProtocol,\r
+                  &gEdkiiHttpCallbackProtocolGuid,\r
+                  NULL,\r
+                  &HandleCount,\r
+                  &Handles\r
+                  );\r
+  if (Status == EFI_SUCCESS) {\r
+    for (Index = 0; Index < HandleCount; Index++) {\r
+      Handle = Handles[Index];\r
+      Status = gBS->HandleProtocol (\r
+                      Handle,\r
+                      &gEdkiiHttpCallbackProtocolGuid,\r
+                      (VOID **) &HttpCallback\r
+                      );\r
+      if (Status == EFI_SUCCESS) {\r
+        DEBUG ((DEBUG_INFO, "HttpNotify: Notifying %p\n", HttpCallback));\r
+        HttpCallback->Callback (\r
+                HttpCallback,\r
+                Event,\r
+                EventStatus\r
+                );\r
+      }\r
+    }\r
+    FreePool (Handles);\r
+  }\r
+}\r