public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [edk2-devel] [PATCH v2 3/6] RedfishPkg: introduce RedfishHttpLib
@ 2024-02-22  9:11 Nickle Wang via groups.io
  2024-02-22 14:17 ` Igor Kulchytskyy via groups.io
  0 siblings, 1 reply; 2+ messages in thread
From: Nickle Wang via groups.io @ 2024-02-22  9:11 UTC (permalink / raw)
  To: devel; +Cc: Abner Chang, Igor Kulchytskyy, Nick Ramirez

RedfishHttpLib is a wrapper library for Redfish feature drivers to
call Redfish HTTP Protocol easily.

Signed-off-by: Nickle Wang <nicklew@nvidia.com>
Cc: Abner Chang <abner.chang@amd.com>
Cc: Igor Kulchytskyy <igork@ami.com>
Cc: Nick Ramirez <nramirez@nvidia.com>
Reviewed-by: Abner Chang <abner.chang@amd.com>
---
 RedfishPkg/RedfishPkg.dec                     |   5 +
 RedfishPkg/RedfishLibs.dsc.inc                |   3 +-
 RedfishPkg/RedfishPkg.dsc                     |   3 +-
 .../Library/RedfishHttpLib/RedfishHttpLib.inf |  43 ++
 RedfishPkg/Include/Library/RedfishHttpLib.h   | 326 ++++++++++
 .../Library/RedfishHttpLib/RedfishHttpLib.c   | 585 ++++++++++++++++++
 6 files changed, 963 insertions(+), 2 deletions(-)
 create mode 100644 RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf
 create mode 100644 RedfishPkg/Include/Library/RedfishHttpLib.h
 create mode 100644 RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.c

diff --git a/RedfishPkg/RedfishPkg.dec b/RedfishPkg/RedfishPkg.dec
index 114f8d2ad8..1a9c9ed7bc 100644
--- a/RedfishPkg/RedfishPkg.dec
+++ b/RedfishPkg/RedfishPkg.dec
@@ -69,6 +69,11 @@
   #
   RedfishPlatformConfigLib|Include/Library/RedfishPlatformConfigLib.h
 
+  ##  @libraryclass  Provides the library functions to access Redfish HTTP
+  #   protocol.
+  #
+  RedfishHttpLib|Include/Library/RedfishHttpLib.h
+
 [LibraryClasses.Common.Private]
   ##  @libraryclass  Provides the private C runtime library functions.
   #   CRT library is currently used by edk2 JsonLib (open source
diff --git a/RedfishPkg/RedfishLibs.dsc.inc b/RedfishPkg/RedfishLibs.dsc.inc
index 5426957da8..55846aaa9d 100644
--- a/RedfishPkg/RedfishLibs.dsc.inc
+++ b/RedfishPkg/RedfishLibs.dsc.inc
@@ -6,7 +6,7 @@
 # of EDKII network library classes.
 #
 # (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
-# Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
 #
 #    SPDX-License-Identifier: BSD-2-Clause-Patent
 #
@@ -21,5 +21,6 @@
   RedfishPlatformCredentialLib|RedfishPkg/Library/RedfishPlatformCredentialIpmiLib/RedfishPlatformCredentialIpmiLib.inf
   HiiUtilityLib|RedfishPkg/Library/HiiUtilityLib/HiiUtilityLib.inf
   RedfishPlatformConfigLib|RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.inf
+  RedfishHttpLib|RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf
 !endif
 
diff --git a/RedfishPkg/RedfishPkg.dsc b/RedfishPkg/RedfishPkg.dsc
index 5849e7cf9e..b0150043a9 100644
--- a/RedfishPkg/RedfishPkg.dsc
+++ b/RedfishPkg/RedfishPkg.dsc
@@ -4,7 +4,7 @@
 # Copyright (c) 2019 - 2021, Intel Corporation. All rights reserved.<BR>
 # (C) Copyright 2021 Hewlett-Packard Enterprise Development LP.
 # Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.
-# Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
 #
 #    SPDX-License-Identifier: BSD-2-Clause-Patent
 #
@@ -74,5 +74,6 @@
   RedfishPkg/Library/RedfishDebugLib/RedfishDebugLib.inf
   RedfishPkg/Library/HiiUtilityLib/HiiUtilityLib.inf
   RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.inf
+  RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf
 
   !include RedfishPkg/Redfish.dsc.inc
diff --git a/RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf b/RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf
new file mode 100644
index 0000000000..fd53b8c2ed
--- /dev/null
+++ b/RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf
@@ -0,0 +1,43 @@
+## @file
+#  Redfish HTTP library is wrapper library for application to call Redfish
+#  HTTP protocol easily.
+#
+#  Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010006
+  BASE_NAME                      = RedfishHttpLib
+  FILE_GUID                      = 62855D9B-441B-436B-9CA6-B7FEB7ABF54E
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = RedfishHttpLib| DXE_DRIVER UEFI_DRIVER
+  CONSTRUCTOR                    = RedfishHttpConstructor
+
+#
+#  VALID_ARCHITECTURES           = IA32 X64 EBC
+#
+
+[Sources]
+  RedfishHttpLib.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  RedfishPkg/RedfishPkg.dec
+
+[LibraryClasses]
+  BaseLib
+  DebugLib
+  UefiLib
+  UefiBootServicesTableLib
+
+[Protocols]
+  gEdkIIRedfishHttpProtocolGuid   ## CONSUMES ##
+
+[depex]
+  TRUE
+
diff --git a/RedfishPkg/Include/Library/RedfishHttpLib.h b/RedfishPkg/Include/Library/RedfishHttpLib.h
new file mode 100644
index 0000000000..b07a46993b
--- /dev/null
+++ b/RedfishPkg/Include/Library/RedfishHttpLib.h
@@ -0,0 +1,326 @@
+/** @file
+  This file defines the Redfish HTTP library interface.
+
+  Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef REDFISH_HTTP_LIB_H_
+#define REDFISH_HTTP_LIB_H_
+
+#include <Protocol/EdkIIRedfishHttpProtocol.h>
+
+/**
+  This function create Redfish service. It's caller's responsibility to free returned
+  Redfish service by calling FreeService ().
+
+  @param[in]  RedfishConfigServiceInfo   Redfish config service information.
+
+  @retval     REDFISH_SERVICE  Redfish service is created.
+  @retval     NULL             Errors occur.
+
+**/
+REDFISH_SERVICE
+RedfishCreateService (
+  IN  REDFISH_CONFIG_SERVICE_INFORMATION  *RedfishConfigServiceInfo
+  );
+
+/**
+  This function free resources in Redfish service. RedfishService is no longer available
+  after this function returns successfully.
+
+  @param[in]  RedfishService  Pointer to Redfish service to be released.
+
+  @retval     EFI_SUCCESS     Resrouce is released successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishCleanupService (
+  IN  REDFISH_SERVICE  RedfishService
+  );
+
+/**
+  This function returns JSON value in given RedfishPayload. Returned JSON value
+  is a reference to the JSON value in RedfishPayload. Any modification to returned
+  JSON value will change JSON value in RedfishPayload.
+
+  @param[in]  RedfishPayload  Pointer to Redfish payload.
+
+  @retval     EDKII_JSON_VALUE   JSON value is returned.
+  @retval     NULL               Errors occur.
+
+**/
+EDKII_JSON_VALUE
+RedfishJsonInPayload (
+  IN  REDFISH_PAYLOAD  RedfishPayload
+  );
+
+/**
+  This function free resources in Request. Request is no longer available
+  after this function returns successfully.
+
+  @param[in]  Request      HTTP request to be released.
+
+  @retval     EFI_SUCCESS     Resrouce is released successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpFreeRequest (
+  IN  REDFISH_REQUEST  *Request
+  );
+
+/**
+  This function free resources in Response. Response is no longer available
+  after this function returns successfully.
+
+  @param[in]  Response     HTTP response to be released.
+
+  @retval     EFI_SUCCESS     Resrouce is released successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpFreeResponse (
+  IN  REDFISH_RESPONSE  *Response
+  );
+
+/**
+  This function expire the cached response of given URI.
+
+  @param[in]  Uri          Target response of URI.
+
+  @retval     EFI_SUCCESS     Target response is expired successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpExpireResponse (
+  IN  EFI_STRING  Uri
+  );
+
+/**
+  Get redfish resource from given resource URI with cache mechanism
+  supported. It's caller's responsibility to Response by calling
+  RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP GET.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Request       Additional request context. This is optional.
+  @param[out] Response      HTTP response from redfish service.
+  @param[in]  UseCache      If it is TRUE, this function will search for
+                            cache first. If it is FALSE, this function
+                            will query Redfish URI directly.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpGetResource (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  REDFISH_REQUEST   *Request OPTIONAL,
+  OUT REDFISH_RESPONSE  *Response,
+  IN  BOOLEAN           UseCache
+  );
+
+/**
+  Perform HTTP PATCH to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP PATCH.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to patch.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPatchResource (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  OUT REDFISH_RESPONSE  *Response
+  );
+
+/**
+  Perform HTTP PATCH to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP PATCH.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to patch.
+  @param[in]  ContentSize   Size of the Content to be send to Redfish service.
+                            This is optional. When ContentSize is 0, ContentSize
+                            is the size of Content.
+  @param[in]  ContentType   Type of the Content to be send to Redfish service.
+                            This is optional.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPatchResourceEx (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  IN  UINTN             ContentSize OPTIONAL,
+  IN  CHAR8             *ContentType OPTIONAL,
+  OUT REDFISH_RESPONSE  *Response
+  );
+
+/**
+  Perform HTTP PUT to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP PUT.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to put.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPutResource (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  OUT REDFISH_RESPONSE  *Response
+  );
+
+/**
+  Perform HTTP PUT to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP PUT.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to put.
+  @param[in]  ContentSize   Size of the Content to be send to Redfish service.
+                            This is optional. When ContentSize is 0, ContentSize
+                            is the size of Content.
+  @param[in]  ContentType   Type of the Content to be send to Redfish service.
+                            This is optional.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPutResourceEx (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  IN  UINTN             ContentSize OPTIONAL,
+  IN  CHAR8             *ContentType OPTIONAL,
+  OUT REDFISH_RESPONSE  *Response
+  );
+
+/**
+  Perform HTTP POST to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP POST.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to post.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPostResource (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  OUT REDFISH_RESPONSE  *Response
+  );
+
+/**
+  Perform HTTP POST to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP POST.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to post.
+  @param[in]  ContentSize   Size of the Content to be send to Redfish service.
+                            This is optional. When ContentSize is 0, ContentSize
+                            is the size of Content.
+  @param[in]  ContentType   Type of the Content to be send to Redfish service.
+                            This is optional.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPostResourceEx (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  IN  UINTN             ContentSize OPTIONAL,
+  IN  CHAR8             *ContentType OPTIONAL,
+  OUT REDFISH_RESPONSE  *Response
+  );
+
+/**
+  Perform HTTP DELETE to delete redfish resource on given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP DELETE.
+  @param[in]  Uri           Target resource URI.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpDeleteResource (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  OUT REDFISH_RESPONSE  *Response
+  );
+
+/**
+  Perform HTTP DELETE to delete redfish resource on given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP DELETE.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       JSON represented properties to be deleted. This is
+                            optional.
+  @param[in]  ContentSize   Size of the Content to be send to Redfish service.
+                            This is optional. When ContentSize is 0, ContentSize
+                            is the size of Content if Content is not NULL.
+  @param[in]  ContentType   Type of the Content to be send to Redfish service.
+                            This is optional.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpDeleteResourceEx (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content OPTIONAL,
+  IN  UINTN             ContentSize OPTIONAL,
+  IN  CHAR8             *ContentType OPTIONAL,
+  OUT REDFISH_RESPONSE  *Response
+  );
+
+#endif
diff --git a/RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.c b/RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.c
new file mode 100644
index 0000000000..0a17952d63
--- /dev/null
+++ b/RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.c
@@ -0,0 +1,585 @@
+/** @file
+  Redfish HTTP cache library helps Redfish application to get Redfish resource
+  from BMC with cache mechanism enabled.
+
+  Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/RedfishHttpLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiLib.h>
+
+EDKII_REDFISH_HTTP_PROTOCOL  *mRedfishHttpProtocol = NULL;
+
+/**
+  This function create Redfish service. It's caller's responsibility to free returned
+  Redfish service by calling FreeService ().
+
+  @param[in]  RedfishConfigServiceInfo   Redfish config service information.
+
+  @retval     REDFISH_SERVICE  Redfish service is created.
+  @retval     NULL             Errors occur.
+
+**/
+REDFISH_SERVICE
+RedfishCreateService (
+  IN  REDFISH_CONFIG_SERVICE_INFORMATION  *RedfishConfigServiceInfo
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return NULL;
+  }
+
+  return mRedfishHttpProtocol->CreateService (
+                                 mRedfishHttpProtocol,
+                                 RedfishConfigServiceInfo
+                                 );
+}
+
+/**
+  This function free resources in Redfish service. RedfishService is no longer available
+  after this function returns successfully.
+
+  @param[in]  RedfishService  Pointer to Redfish service to be released.
+
+  @retval     EFI_SUCCESS     Resrouce is released successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishCleanupService (
+  IN  REDFISH_SERVICE  RedfishService
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->FreeService (
+                                 mRedfishHttpProtocol,
+                                 RedfishService
+                                 );
+}
+
+/**
+  This function returns JSON value in given RedfishPayload. Returned JSON value
+  is a reference to the JSON value in RedfishPayload. Any modification to returned
+  JSON value will change JSON value in RedfishPayload.
+
+  @param[in]  RedfishPayload  Pointer to Redfish payload.
+
+  @retval     EDKII_JSON_VALUE   JSON value is returned.
+  @retval     NULL               Errors occur.
+
+**/
+EDKII_JSON_VALUE
+RedfishJsonInPayload (
+  IN  REDFISH_PAYLOAD  RedfishPayload
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return NULL;
+  }
+
+  return mRedfishHttpProtocol->JsonInPayload (
+                                 mRedfishHttpProtocol,
+                                 RedfishPayload
+                                 );
+}
+
+/**
+  This function free resources in Request. Request is no longer available
+  after this function returns successfully.
+
+  @param[in]  Request      HTTP request to be released.
+
+  @retval     EFI_SUCCESS     Resrouce is released successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpFreeRequest (
+  IN  REDFISH_REQUEST  *Request
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->FreeRequest (
+                                 mRedfishHttpProtocol,
+                                 Request
+                                 );
+}
+
+/**
+  This function free resources in Response. Response is no longer available
+  after this function returns successfully.
+
+  @param[in]  Response     HTTP response to be released.
+
+  @retval     EFI_SUCCESS     Resrouce is released successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpFreeResponse (
+  IN  REDFISH_RESPONSE  *Response
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->FreeResponse (
+                                 mRedfishHttpProtocol,
+                                 Response
+                                 );
+}
+
+/**
+  This function expire the cached response of given URI.
+
+  @param[in]  Uri          Target response of URI.
+
+  @retval     EFI_SUCCESS     Target response is expired successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpExpireResponse (
+  IN  EFI_STRING  Uri
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->ExpireResponse (
+                                 mRedfishHttpProtocol,
+                                 Uri
+                                 );
+}
+
+/**
+  Get redfish resource from given resource URI with cache mechanism
+  supported. It's caller's responsibility to Response by calling
+  RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP GET.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Request       Additional request context. This is optional.
+  @param[out] Response      HTTP response from redfish service.
+  @param[in]  UseCache      If it is TRUE, this function will search for
+                            cache first. If it is FALSE, this function
+                            will query Redfish URI directly.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpGetResource (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  REDFISH_REQUEST   *Request OPTIONAL,
+  OUT REDFISH_RESPONSE  *Response,
+  IN  BOOLEAN           UseCache
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->GetResource (
+                                 mRedfishHttpProtocol,
+                                 Service,
+                                 Uri,
+                                 Request,
+                                 Response,
+                                 UseCache
+                                 );
+}
+
+/**
+  Perform HTTP PATCH to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP PATCH.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to patch.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPatchResource (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  OUT REDFISH_RESPONSE  *Response
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->PatchResource (
+                                 mRedfishHttpProtocol,
+                                 Service,
+                                 Uri,
+                                 Content,
+                                 0,
+                                 NULL,
+                                 Response
+                                 );
+}
+
+/**
+  Perform HTTP PATCH to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP PATCH.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to patch.
+  @param[in]  ContentSize   Size of the Content to be send to Redfish service.
+                            This is optional. When ContentSize is 0, ContentSize
+                            is the size of Content.
+  @param[in]  ContentType   Type of the Content to be send to Redfish service.
+                            This is optional.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPatchResourceEx (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  IN  UINTN             ContentSize OPTIONAL,
+  IN  CHAR8             *ContentType OPTIONAL,
+  OUT REDFISH_RESPONSE  *Response
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->PatchResource (
+                                 mRedfishHttpProtocol,
+                                 Service,
+                                 Uri,
+                                 Content,
+                                 ContentSize,
+                                 ContentType,
+                                 Response
+                                 );
+}
+
+/**
+  Perform HTTP PUT to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP PUT.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to put.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPutResource (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  OUT REDFISH_RESPONSE  *Response
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->PutResource (
+                                 mRedfishHttpProtocol,
+                                 Service,
+                                 Uri,
+                                 Content,
+                                 0,
+                                 NULL,
+                                 Response
+                                 );
+}
+
+/**
+  Perform HTTP PUT to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP PUT.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to put.
+  @param[in]  ContentSize   Size of the Content to be send to Redfish service.
+                            This is optional. When ContentSize is 0, ContentSize
+                            is the size of Content.
+  @param[in]  ContentType   Type of the Content to be send to Redfish service.
+                            This is optional.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPutResourceEx (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  IN  UINTN             ContentSize OPTIONAL,
+  IN  CHAR8             *ContentType OPTIONAL,
+  OUT REDFISH_RESPONSE  *Response
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->PutResource (
+                                 mRedfishHttpProtocol,
+                                 Service,
+                                 Uri,
+                                 Content,
+                                 ContentSize,
+                                 ContentType,
+                                 Response
+                                 );
+}
+
+/**
+  Perform HTTP POST to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP POST.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to post.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPostResource (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  OUT REDFISH_RESPONSE  *Response
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->PostResource (
+                                 mRedfishHttpProtocol,
+                                 Service,
+                                 Uri,
+                                 Content,
+                                 0,
+                                 NULL,
+                                 Response
+                                 );
+}
+
+/**
+  Perform HTTP POST to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP POST.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to post.
+  @param[in]  ContentSize   Size of the Content to be send to Redfish service.
+                            This is optional. When ContentSize is 0, ContentSize
+                            is the size of Content.
+  @param[in]  ContentType   Type of the Content to be send to Redfish service.
+                            This is optional.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPostResourceEx (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  IN  UINTN             ContentSize OPTIONAL,
+  IN  CHAR8             *ContentType OPTIONAL,
+  OUT REDFISH_RESPONSE  *Response
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->PostResource (
+                                 mRedfishHttpProtocol,
+                                 Service,
+                                 Uri,
+                                 Content,
+                                 ContentSize,
+                                 ContentType,
+                                 Response
+                                 );
+}
+
+/**
+  Perform HTTP DELETE to delete redfish resource on given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP DELETE.
+  @param[in]  Uri           Target resource URI.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpDeleteResource (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  OUT REDFISH_RESPONSE  *Response
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->DeleteResource (
+                                 mRedfishHttpProtocol,
+                                 Service,
+                                 Uri,
+                                 NULL,
+                                 0,
+                                 NULL,
+                                 Response
+                                 );
+}
+
+/**
+  Perform HTTP DELETE to delete redfish resource on given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP DELETE.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       JSON represented properties to be deleted. This is
+                            optional.
+  @param[in]  ContentSize   Size of the Content to be send to Redfish service.
+                            This is optional. When ContentSize is 0, ContentSize
+                            is the size of Content if Content is not NULL.
+  @param[in]  ContentType   Type of the Content to be send to Redfish service.
+                            This is optional.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpDeleteResourceEx (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content OPTIONAL,
+  IN  UINTN             ContentSize OPTIONAL,
+  IN  CHAR8             *ContentType OPTIONAL,
+  OUT REDFISH_RESPONSE  *Response
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->DeleteResource (
+                                 mRedfishHttpProtocol,
+                                 Service,
+                                 Uri,
+                                 Content,
+                                 ContentSize,
+                                 ContentType,
+                                 Response
+                                 );
+}
+
+/**
+  Callback function when gEdkIIRedfishHttpProtocolGuid is installed.
+
+  @param[in] Event    Event whose notification function is being invoked.
+  @param[in] Context  Pointer to the notification function's context.
+**/
+VOID
+EFIAPI
+RedfishHttpProtocolIsReady (
+  IN  EFI_EVENT  Event,
+  IN  VOID       *Context
+  )
+{
+  EFI_STATUS  Status;
+
+  if (mRedfishHttpProtocol != NULL) {
+    gBS->CloseEvent (Event);
+    return;
+  }
+
+  Status = gBS->LocateProtocol (
+                  &gEdkIIRedfishHttpProtocolGuid,
+                  NULL,
+                  (VOID **)&mRedfishHttpProtocol
+                  );
+  if (EFI_ERROR (Status)) {
+    return;
+  }
+
+  gBS->CloseEvent (Event);
+}
+
+/**
+
+  Initial HTTP library instance.
+
+  @param[in] ImageHandle     The image handle.
+  @param[in] SystemTable     The system table.
+
+  @retval  EFI_SUCCESS  Initial library successfully.
+  @retval  Other        Return error status.
+
+**/
+EFI_STATUS
+EFIAPI
+RedfishHttpConstructor (
+  IN EFI_HANDLE        ImageHandle,
+  IN EFI_SYSTEM_TABLE  *SystemTable
+  )
+{
+  VOID  *Registration;
+
+  EfiCreateProtocolNotifyEvent (
+    &gEdkIIRedfishHttpProtocolGuid,
+    TPL_CALLBACK,
+    RedfishHttpProtocolIsReady,
+    NULL,
+    &Registration
+    );
+
+  return EFI_SUCCESS;
+}
-- 
2.34.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#115777): https://edk2.groups.io/g/devel/message/115777
Mute This Topic: https://groups.io/mt/104505405/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [edk2-devel] [PATCH v2 3/6] RedfishPkg: introduce RedfishHttpLib
  2024-02-22  9:11 [edk2-devel] [PATCH v2 3/6] RedfishPkg: introduce RedfishHttpLib Nickle Wang via groups.io
@ 2024-02-22 14:17 ` Igor Kulchytskyy via groups.io
  0 siblings, 0 replies; 2+ messages in thread
From: Igor Kulchytskyy via groups.io @ 2024-02-22 14:17 UTC (permalink / raw)
  To: Nickle Wang, devel@edk2.groups.io; +Cc: Abner Chang, Nick Ramirez

Reviewed-by: Igor Kulchytskyy <igork@ami.com>

-----Original Message-----
From: Nickle Wang <nicklew@nvidia.com>
Sent: Thursday, February 22, 2024 4:12 AM
To: devel@edk2.groups.io
Cc: Abner Chang <abner.chang@amd.com>; Igor Kulchytskyy <igork@ami.com>; Nick Ramirez <nramirez@nvidia.com>
Subject: [EXTERNAL] [PATCH v2 3/6] RedfishPkg: introduce RedfishHttpLib


**CAUTION: The e-mail below is from an external source. Please exercise caution before opening attachments, clicking links, or following guidance.**

RedfishHttpLib is a wrapper library for Redfish feature drivers to
call Redfish HTTP Protocol easily.

Signed-off-by: Nickle Wang <nicklew@nvidia.com>
Cc: Abner Chang <abner.chang@amd.com>
Cc: Igor Kulchytskyy <igork@ami.com>
Cc: Nick Ramirez <nramirez@nvidia.com>
Reviewed-by: Abner Chang <abner.chang@amd.com>
---
 RedfishPkg/RedfishPkg.dec                     |   5 +
 RedfishPkg/RedfishLibs.dsc.inc                |   3 +-
 RedfishPkg/RedfishPkg.dsc                     |   3 +-
 .../Library/RedfishHttpLib/RedfishHttpLib.inf |  43 ++
 RedfishPkg/Include/Library/RedfishHttpLib.h   | 326 ++++++++++
 .../Library/RedfishHttpLib/RedfishHttpLib.c   | 585 ++++++++++++++++++
 6 files changed, 963 insertions(+), 2 deletions(-)
 create mode 100644 RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf
 create mode 100644 RedfishPkg/Include/Library/RedfishHttpLib.h
 create mode 100644 RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.c

diff --git a/RedfishPkg/RedfishPkg.dec b/RedfishPkg/RedfishPkg.dec
index 114f8d2ad8..1a9c9ed7bc 100644
--- a/RedfishPkg/RedfishPkg.dec
+++ b/RedfishPkg/RedfishPkg.dec
@@ -69,6 +69,11 @@
   #
   RedfishPlatformConfigLib|Include/Library/RedfishPlatformConfigLib.h

+  ##  @libraryclass  Provides the library functions to access Redfish HTTP
+  #   protocol.
+  #
+  RedfishHttpLib|Include/Library/RedfishHttpLib.h
+
 [LibraryClasses.Common.Private]
   ##  @libraryclass  Provides the private C runtime library functions.
   #   CRT library is currently used by edk2 JsonLib (open source
diff --git a/RedfishPkg/RedfishLibs.dsc.inc b/RedfishPkg/RedfishLibs.dsc.inc
index 5426957da8..55846aaa9d 100644
--- a/RedfishPkg/RedfishLibs.dsc.inc
+++ b/RedfishPkg/RedfishLibs.dsc.inc
@@ -6,7 +6,7 @@
 # of EDKII network library classes.
 #
 # (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
-# Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
 #
 #    SPDX-License-Identifier: BSD-2-Clause-Patent
 #
@@ -21,5 +21,6 @@
   RedfishPlatformCredentialLib|RedfishPkg/Library/RedfishPlatformCredentialIpmiLib/RedfishPlatformCredentialIpmiLib.inf
   HiiUtilityLib|RedfishPkg/Library/HiiUtilityLib/HiiUtilityLib.inf
   RedfishPlatformConfigLib|RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.inf
+  RedfishHttpLib|RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf
 !endif

diff --git a/RedfishPkg/RedfishPkg.dsc b/RedfishPkg/RedfishPkg.dsc
index 5849e7cf9e..b0150043a9 100644
--- a/RedfishPkg/RedfishPkg.dsc
+++ b/RedfishPkg/RedfishPkg.dsc
@@ -4,7 +4,7 @@
 # Copyright (c) 2019 - 2021, Intel Corporation. All rights reserved.<BR>
 # (C) Copyright 2021 Hewlett-Packard Enterprise Development LP.
 # Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.
-# Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
 #
 #    SPDX-License-Identifier: BSD-2-Clause-Patent
 #
@@ -74,5 +74,6 @@
   RedfishPkg/Library/RedfishDebugLib/RedfishDebugLib.inf
   RedfishPkg/Library/HiiUtilityLib/HiiUtilityLib.inf
   RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.inf
+  RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf

   !include RedfishPkg/Redfish.dsc.inc
diff --git a/RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf b/RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf
new file mode 100644
index 0000000000..fd53b8c2ed
--- /dev/null
+++ b/RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf
@@ -0,0 +1,43 @@
+## @file
+#  Redfish HTTP library is wrapper library for application to call Redfish
+#  HTTP protocol easily.
+#
+#  Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010006
+  BASE_NAME                      = RedfishHttpLib
+  FILE_GUID                      = 62855D9B-441B-436B-9CA6-B7FEB7ABF54E
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = RedfishHttpLib| DXE_DRIVER UEFI_DRIVER
+  CONSTRUCTOR                    = RedfishHttpConstructor
+
+#
+#  VALID_ARCHITECTURES           = IA32 X64 EBC
+#
+
+[Sources]
+  RedfishHttpLib.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  RedfishPkg/RedfishPkg.dec
+
+[LibraryClasses]
+  BaseLib
+  DebugLib
+  UefiLib
+  UefiBootServicesTableLib
+
+[Protocols]
+  gEdkIIRedfishHttpProtocolGuid   ## CONSUMES ##
+
+[depex]
+  TRUE
+
diff --git a/RedfishPkg/Include/Library/RedfishHttpLib.h b/RedfishPkg/Include/Library/RedfishHttpLib.h
new file mode 100644
index 0000000000..b07a46993b
--- /dev/null
+++ b/RedfishPkg/Include/Library/RedfishHttpLib.h
@@ -0,0 +1,326 @@
+/** @file
+  This file defines the Redfish HTTP library interface.
+
+  Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef REDFISH_HTTP_LIB_H_
+#define REDFISH_HTTP_LIB_H_
+
+#include <Protocol/EdkIIRedfishHttpProtocol.h>
+
+/**
+  This function create Redfish service. It's caller's responsibility to free returned
+  Redfish service by calling FreeService ().
+
+  @param[in]  RedfishConfigServiceInfo   Redfish config service information.
+
+  @retval     REDFISH_SERVICE  Redfish service is created.
+  @retval     NULL             Errors occur.
+
+**/
+REDFISH_SERVICE
+RedfishCreateService (
+  IN  REDFISH_CONFIG_SERVICE_INFORMATION  *RedfishConfigServiceInfo
+  );
+
+/**
+  This function free resources in Redfish service. RedfishService is no longer available
+  after this function returns successfully.
+
+  @param[in]  RedfishService  Pointer to Redfish service to be released.
+
+  @retval     EFI_SUCCESS     Resrouce is released successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishCleanupService (
+  IN  REDFISH_SERVICE  RedfishService
+  );
+
+/**
+  This function returns JSON value in given RedfishPayload. Returned JSON value
+  is a reference to the JSON value in RedfishPayload. Any modification to returned
+  JSON value will change JSON value in RedfishPayload.
+
+  @param[in]  RedfishPayload  Pointer to Redfish payload.
+
+  @retval     EDKII_JSON_VALUE   JSON value is returned.
+  @retval     NULL               Errors occur.
+
+**/
+EDKII_JSON_VALUE
+RedfishJsonInPayload (
+  IN  REDFISH_PAYLOAD  RedfishPayload
+  );
+
+/**
+  This function free resources in Request. Request is no longer available
+  after this function returns successfully.
+
+  @param[in]  Request      HTTP request to be released.
+
+  @retval     EFI_SUCCESS     Resrouce is released successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpFreeRequest (
+  IN  REDFISH_REQUEST  *Request
+  );
+
+/**
+  This function free resources in Response. Response is no longer available
+  after this function returns successfully.
+
+  @param[in]  Response     HTTP response to be released.
+
+  @retval     EFI_SUCCESS     Resrouce is released successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpFreeResponse (
+  IN  REDFISH_RESPONSE  *Response
+  );
+
+/**
+  This function expire the cached response of given URI.
+
+  @param[in]  Uri          Target response of URI.
+
+  @retval     EFI_SUCCESS     Target response is expired successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpExpireResponse (
+  IN  EFI_STRING  Uri
+  );
+
+/**
+  Get redfish resource from given resource URI with cache mechanism
+  supported. It's caller's responsibility to Response by calling
+  RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP GET.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Request       Additional request context. This is optional.
+  @param[out] Response      HTTP response from redfish service.
+  @param[in]  UseCache      If it is TRUE, this function will search for
+                            cache first. If it is FALSE, this function
+                            will query Redfish URI directly.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpGetResource (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  REDFISH_REQUEST   *Request OPTIONAL,
+  OUT REDFISH_RESPONSE  *Response,
+  IN  BOOLEAN           UseCache
+  );
+
+/**
+  Perform HTTP PATCH to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP PATCH.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to patch.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPatchResource (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  OUT REDFISH_RESPONSE  *Response
+  );
+
+/**
+  Perform HTTP PATCH to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP PATCH.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to patch.
+  @param[in]  ContentSize   Size of the Content to be send to Redfish service.
+                            This is optional. When ContentSize is 0, ContentSize
+                            is the size of Content.
+  @param[in]  ContentType   Type of the Content to be send to Redfish service.
+                            This is optional.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPatchResourceEx (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  IN  UINTN             ContentSize OPTIONAL,
+  IN  CHAR8             *ContentType OPTIONAL,
+  OUT REDFISH_RESPONSE  *Response
+  );
+
+/**
+  Perform HTTP PUT to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP PUT.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to put.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPutResource (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  OUT REDFISH_RESPONSE  *Response
+  );
+
+/**
+  Perform HTTP PUT to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP PUT.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to put.
+  @param[in]  ContentSize   Size of the Content to be send to Redfish service.
+                            This is optional. When ContentSize is 0, ContentSize
+                            is the size of Content.
+  @param[in]  ContentType   Type of the Content to be send to Redfish service.
+                            This is optional.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPutResourceEx (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  IN  UINTN             ContentSize OPTIONAL,
+  IN  CHAR8             *ContentType OPTIONAL,
+  OUT REDFISH_RESPONSE  *Response
+  );
+
+/**
+  Perform HTTP POST to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP POST.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to post.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPostResource (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  OUT REDFISH_RESPONSE  *Response
+  );
+
+/**
+  Perform HTTP POST to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP POST.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to post.
+  @param[in]  ContentSize   Size of the Content to be send to Redfish service.
+                            This is optional. When ContentSize is 0, ContentSize
+                            is the size of Content.
+  @param[in]  ContentType   Type of the Content to be send to Redfish service.
+                            This is optional.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPostResourceEx (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  IN  UINTN             ContentSize OPTIONAL,
+  IN  CHAR8             *ContentType OPTIONAL,
+  OUT REDFISH_RESPONSE  *Response
+  );
+
+/**
+  Perform HTTP DELETE to delete redfish resource on given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP DELETE.
+  @param[in]  Uri           Target resource URI.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpDeleteResource (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  OUT REDFISH_RESPONSE  *Response
+  );
+
+/**
+  Perform HTTP DELETE to delete redfish resource on given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP DELETE.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       JSON represented properties to be deleted. This is
+                            optional.
+  @param[in]  ContentSize   Size of the Content to be send to Redfish service.
+                            This is optional. When ContentSize is 0, ContentSize
+                            is the size of Content if Content is not NULL.
+  @param[in]  ContentType   Type of the Content to be send to Redfish service.
+                            This is optional.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpDeleteResourceEx (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content OPTIONAL,
+  IN  UINTN             ContentSize OPTIONAL,
+  IN  CHAR8             *ContentType OPTIONAL,
+  OUT REDFISH_RESPONSE  *Response
+  );
+
+#endif
diff --git a/RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.c b/RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.c
new file mode 100644
index 0000000000..0a17952d63
--- /dev/null
+++ b/RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.c
@@ -0,0 +1,585 @@
+/** @file
+  Redfish HTTP cache library helps Redfish application to get Redfish resource
+  from BMC with cache mechanism enabled.
+
+  Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/RedfishHttpLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiLib.h>
+
+EDKII_REDFISH_HTTP_PROTOCOL  *mRedfishHttpProtocol = NULL;
+
+/**
+  This function create Redfish service. It's caller's responsibility to free returned
+  Redfish service by calling FreeService ().
+
+  @param[in]  RedfishConfigServiceInfo   Redfish config service information.
+
+  @retval     REDFISH_SERVICE  Redfish service is created.
+  @retval     NULL             Errors occur.
+
+**/
+REDFISH_SERVICE
+RedfishCreateService (
+  IN  REDFISH_CONFIG_SERVICE_INFORMATION  *RedfishConfigServiceInfo
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return NULL;
+  }
+
+  return mRedfishHttpProtocol->CreateService (
+                                 mRedfishHttpProtocol,
+                                 RedfishConfigServiceInfo
+                                 );
+}
+
+/**
+  This function free resources in Redfish service. RedfishService is no longer available
+  after this function returns successfully.
+
+  @param[in]  RedfishService  Pointer to Redfish service to be released.
+
+  @retval     EFI_SUCCESS     Resrouce is released successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishCleanupService (
+  IN  REDFISH_SERVICE  RedfishService
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->FreeService (
+                                 mRedfishHttpProtocol,
+                                 RedfishService
+                                 );
+}
+
+/**
+  This function returns JSON value in given RedfishPayload. Returned JSON value
+  is a reference to the JSON value in RedfishPayload. Any modification to returned
+  JSON value will change JSON value in RedfishPayload.
+
+  @param[in]  RedfishPayload  Pointer to Redfish payload.
+
+  @retval     EDKII_JSON_VALUE   JSON value is returned.
+  @retval     NULL               Errors occur.
+
+**/
+EDKII_JSON_VALUE
+RedfishJsonInPayload (
+  IN  REDFISH_PAYLOAD  RedfishPayload
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return NULL;
+  }
+
+  return mRedfishHttpProtocol->JsonInPayload (
+                                 mRedfishHttpProtocol,
+                                 RedfishPayload
+                                 );
+}
+
+/**
+  This function free resources in Request. Request is no longer available
+  after this function returns successfully.
+
+  @param[in]  Request      HTTP request to be released.
+
+  @retval     EFI_SUCCESS     Resrouce is released successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpFreeRequest (
+  IN  REDFISH_REQUEST  *Request
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->FreeRequest (
+                                 mRedfishHttpProtocol,
+                                 Request
+                                 );
+}
+
+/**
+  This function free resources in Response. Response is no longer available
+  after this function returns successfully.
+
+  @param[in]  Response     HTTP response to be released.
+
+  @retval     EFI_SUCCESS     Resrouce is released successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpFreeResponse (
+  IN  REDFISH_RESPONSE  *Response
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->FreeResponse (
+                                 mRedfishHttpProtocol,
+                                 Response
+                                 );
+}
+
+/**
+  This function expire the cached response of given URI.
+
+  @param[in]  Uri          Target response of URI.
+
+  @retval     EFI_SUCCESS     Target response is expired successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpExpireResponse (
+  IN  EFI_STRING  Uri
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->ExpireResponse (
+                                 mRedfishHttpProtocol,
+                                 Uri
+                                 );
+}
+
+/**
+  Get redfish resource from given resource URI with cache mechanism
+  supported. It's caller's responsibility to Response by calling
+  RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP GET.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Request       Additional request context. This is optional.
+  @param[out] Response      HTTP response from redfish service.
+  @param[in]  UseCache      If it is TRUE, this function will search for
+                            cache first. If it is FALSE, this function
+                            will query Redfish URI directly.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpGetResource (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  REDFISH_REQUEST   *Request OPTIONAL,
+  OUT REDFISH_RESPONSE  *Response,
+  IN  BOOLEAN           UseCache
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->GetResource (
+                                 mRedfishHttpProtocol,
+                                 Service,
+                                 Uri,
+                                 Request,
+                                 Response,
+                                 UseCache
+                                 );
+}
+
+/**
+  Perform HTTP PATCH to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP PATCH.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to patch.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPatchResource (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  OUT REDFISH_RESPONSE  *Response
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->PatchResource (
+                                 mRedfishHttpProtocol,
+                                 Service,
+                                 Uri,
+                                 Content,
+                                 0,
+                                 NULL,
+                                 Response
+                                 );
+}
+
+/**
+  Perform HTTP PATCH to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP PATCH.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to patch.
+  @param[in]  ContentSize   Size of the Content to be send to Redfish service.
+                            This is optional. When ContentSize is 0, ContentSize
+                            is the size of Content.
+  @param[in]  ContentType   Type of the Content to be send to Redfish service.
+                            This is optional.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPatchResourceEx (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  IN  UINTN             ContentSize OPTIONAL,
+  IN  CHAR8             *ContentType OPTIONAL,
+  OUT REDFISH_RESPONSE  *Response
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->PatchResource (
+                                 mRedfishHttpProtocol,
+                                 Service,
+                                 Uri,
+                                 Content,
+                                 ContentSize,
+                                 ContentType,
+                                 Response
+                                 );
+}
+
+/**
+  Perform HTTP PUT to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP PUT.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to put.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPutResource (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  OUT REDFISH_RESPONSE  *Response
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->PutResource (
+                                 mRedfishHttpProtocol,
+                                 Service,
+                                 Uri,
+                                 Content,
+                                 0,
+                                 NULL,
+                                 Response
+                                 );
+}
+
+/**
+  Perform HTTP PUT to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP PUT.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to put.
+  @param[in]  ContentSize   Size of the Content to be send to Redfish service.
+                            This is optional. When ContentSize is 0, ContentSize
+                            is the size of Content.
+  @param[in]  ContentType   Type of the Content to be send to Redfish service.
+                            This is optional.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPutResourceEx (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  IN  UINTN             ContentSize OPTIONAL,
+  IN  CHAR8             *ContentType OPTIONAL,
+  OUT REDFISH_RESPONSE  *Response
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->PutResource (
+                                 mRedfishHttpProtocol,
+                                 Service,
+                                 Uri,
+                                 Content,
+                                 ContentSize,
+                                 ContentType,
+                                 Response
+                                 );
+}
+
+/**
+  Perform HTTP POST to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP POST.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to post.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPostResource (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  OUT REDFISH_RESPONSE  *Response
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->PostResource (
+                                 mRedfishHttpProtocol,
+                                 Service,
+                                 Uri,
+                                 Content,
+                                 0,
+                                 NULL,
+                                 Response
+                                 );
+}
+
+/**
+  Perform HTTP POST to send redfish resource to given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP POST.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       Data to post.
+  @param[in]  ContentSize   Size of the Content to be send to Redfish service.
+                            This is optional. When ContentSize is 0, ContentSize
+                            is the size of Content.
+  @param[in]  ContentType   Type of the Content to be send to Redfish service.
+                            This is optional.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpPostResourceEx (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content,
+  IN  UINTN             ContentSize OPTIONAL,
+  IN  CHAR8             *ContentType OPTIONAL,
+  OUT REDFISH_RESPONSE  *Response
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->PostResource (
+                                 mRedfishHttpProtocol,
+                                 Service,
+                                 Uri,
+                                 Content,
+                                 ContentSize,
+                                 ContentType,
+                                 Response
+                                 );
+}
+
+/**
+  Perform HTTP DELETE to delete redfish resource on given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP DELETE.
+  @param[in]  Uri           Target resource URI.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpDeleteResource (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  OUT REDFISH_RESPONSE  *Response
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->DeleteResource (
+                                 mRedfishHttpProtocol,
+                                 Service,
+                                 Uri,
+                                 NULL,
+                                 0,
+                                 NULL,
+                                 Response
+                                 );
+}
+
+/**
+  Perform HTTP DELETE to delete redfish resource on given resource URI.
+  It's caller's responsibility to free Response by calling RedfishHttpFreeResponse ().
+
+  @param[in]  Service       Redfish service instance to perform HTTP DELETE.
+  @param[in]  Uri           Target resource URI.
+  @param[in]  Content       JSON represented properties to be deleted. This is
+                            optional.
+  @param[in]  ContentSize   Size of the Content to be send to Redfish service.
+                            This is optional. When ContentSize is 0, ContentSize
+                            is the size of Content if Content is not NULL.
+  @param[in]  ContentType   Type of the Content to be send to Redfish service.
+                            This is optional.
+  @param[out] Response      HTTP response from redfish service.
+
+  @retval     EFI_SUCCESS     Resrouce is returned successfully.
+  @retval     Others          Errors occur.
+
+**/
+EFI_STATUS
+RedfishHttpDeleteResourceEx (
+  IN  REDFISH_SERVICE   Service,
+  IN  EFI_STRING        Uri,
+  IN  CHAR8             *Content OPTIONAL,
+  IN  UINTN             ContentSize OPTIONAL,
+  IN  CHAR8             *ContentType OPTIONAL,
+  OUT REDFISH_RESPONSE  *Response
+  )
+{
+  if (mRedfishHttpProtocol == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  return mRedfishHttpProtocol->DeleteResource (
+                                 mRedfishHttpProtocol,
+                                 Service,
+                                 Uri,
+                                 Content,
+                                 ContentSize,
+                                 ContentType,
+                                 Response
+                                 );
+}
+
+/**
+  Callback function when gEdkIIRedfishHttpProtocolGuid is installed.
+
+  @param[in] Event    Event whose notification function is being invoked.
+  @param[in] Context  Pointer to the notification function's context.
+**/
+VOID
+EFIAPI
+RedfishHttpProtocolIsReady (
+  IN  EFI_EVENT  Event,
+  IN  VOID       *Context
+  )
+{
+  EFI_STATUS  Status;
+
+  if (mRedfishHttpProtocol != NULL) {
+    gBS->CloseEvent (Event);
+    return;
+  }
+
+  Status = gBS->LocateProtocol (
+                  &gEdkIIRedfishHttpProtocolGuid,
+                  NULL,
+                  (VOID **)&mRedfishHttpProtocol
+                  );
+  if (EFI_ERROR (Status)) {
+    return;
+  }
+
+  gBS->CloseEvent (Event);
+}
+
+/**
+
+  Initial HTTP library instance.
+
+  @param[in] ImageHandle     The image handle.
+  @param[in] SystemTable     The system table.
+
+  @retval  EFI_SUCCESS  Initial library successfully.
+  @retval  Other        Return error status.
+
+**/
+EFI_STATUS
+EFIAPI
+RedfishHttpConstructor (
+  IN EFI_HANDLE        ImageHandle,
+  IN EFI_SYSTEM_TABLE  *SystemTable
+  )
+{
+  VOID  *Registration;
+
+  EfiCreateProtocolNotifyEvent (
+    &gEdkIIRedfishHttpProtocolGuid,
+    TPL_CALLBACK,
+    RedfishHttpProtocolIsReady,
+    NULL,
+    &Registration
+    );
+
+  return EFI_SUCCESS;
+}
--
2.34.1

-The information contained in this message may be confidential and proprietary to American Megatrends (AMI). This communication is intended to be read only by the individual or entity to whom it is addressed or by their designee. If the reader of this message is not the intended recipient, you are on notice that any distribution of this message, in any form, is strictly prohibited. Please promptly notify the sender by reply e-mail or by telephone at 770-246-8600, and then delete or destroy all copies of the transmission.


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#115819): https://edk2.groups.io/g/devel/message/115819
Mute This Topic: https://groups.io/mt/104505405/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2024-02-22 14:17 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-02-22  9:11 [edk2-devel] [PATCH v2 3/6] RedfishPkg: introduce RedfishHttpLib Nickle Wang via groups.io
2024-02-22 14:17 ` Igor Kulchytskyy via groups.io

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox