public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Chang, Abner via groups.io" <abner.chang=amd.com@groups.io>
To: "devel@edk2.groups.io" <devel@edk2.groups.io>,
	"nicklew@nvidia.com" <nicklew@nvidia.com>
Cc: Igor Kulchytskyy <igork@ami.com>
Subject: Re: [edk2-devel] [edk2-redfish-client][PATCH 1/2] RedfishClientPkg: Remove RedfishLib
Date: Wed, 06 Mar 2024 22:02:20 -0800	[thread overview]
Message-ID: <LV8PR12MB945244DE0798FDF6AE56084EEA202@LV8PR12MB9452.namprd12.prod.outlook.com> (raw)
In-Reply-To: <20240306141011.22590-1-nicklew@nvidia.com>

[AMD Official Use Only - General]

Reviewed-by: Abner Chang <abner.chang@amd.com>

> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Nickle
> Wang via groups.io
> Sent: Wednesday, March 6, 2024 10:11 PM
> To: devel@edk2.groups.io
> Cc: Chang, Abner <Abner.Chang@amd.com>; Igor Kulchytskyy
> <igork@ami.com>
> Subject: [edk2-devel] [edk2-redfish-client][PATCH 1/2] RedfishClientPkg:
> Remove RedfishLib
>
> Caution: This message originated from an External Source. Use proper caution
> when opening attachments, clicking links, or responding.
>
>
> RedfishLib is no longer required in RedfishClientPkg.
> Remove this library and corresponding definitions.
>
> Signed-off-by: Nickle Wang <nicklew@nvidia.com>
> Cc: Abner Chang <abner.chang@amd.com>
> Cc: Igor Kulchytskyy <igork@ami.com>
> ---
>  RedfishClientPkg/RedfishClientPkg.dec         |    5 -
>  RedfishClientPkg/RedfishClientLibs.dsc.inc    |    1 -
>  RedfishClientPkg/RedfishClientPkg.dsc         |    1 -
>  .../PrivateLibrary/RedfishLib/RedfishLib.inf  |   62 -
>  .../PrivateInclude/Library/RedfishLib.h       |  616 ------
>  .../PrivateLibrary/RedfishLib/RedfishMisc.h   |   82 -
>  .../edk2libredfish/include/redfish.h          |   25 -
>  .../edk2libredfish/include/redfishPayload.h   |  136 --
>  .../edk2libredfish/include/redfishService.h   |  203 --
>  .../edk2libredfish/include/redpath.h          |   49 -
>  .../PrivateLibrary/RedfishLib/RedfishLib.c    | 1352 ------------
>  .../PrivateLibrary/RedfishLib/RedfishMisc.c   |  207 --
>  .../RedfishLib/edk2libredfish/src/payload.c   |  918 --------
>  .../RedfishLib/edk2libredfish/src/redpath.c   |  224 --
>  .../RedfishLib/edk2libredfish/src/service.c   | 1882 -----------------
>  15 files changed, 5763 deletions(-)
>  delete mode 100644
> RedfishClientPkg/PrivateLibrary/RedfishLib/RedfishLib.inf
>  delete mode 100644 RedfishClientPkg/PrivateInclude/Library/RedfishLib.h
>  delete mode 100644
> RedfishClientPkg/PrivateLibrary/RedfishLib/RedfishMisc.h
>  delete mode 100644
> RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfish.h
>  delete mode 100644
> RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishPay
> load.h
>  delete mode 100644
> RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishSer
> vice.h
>  delete mode 100644
> RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redpath.h
>  delete mode 100644 RedfishClientPkg/PrivateLibrary/RedfishLib/RedfishLib.c
>  delete mode 100644
> RedfishClientPkg/PrivateLibrary/RedfishLib/RedfishMisc.c
>  delete mode 100644
> RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/payload.c
>  delete mode 100644
> RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/redpath.c
>  delete mode 100644
> RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c
>
> diff --git a/RedfishClientPkg/RedfishClientPkg.dec
> b/RedfishClientPkg/RedfishClientPkg.dec
> index aa018d714..d147135d4 100644
> --- a/RedfishClientPkg/RedfishClientPkg.dec
> +++ b/RedfishClientPkg/RedfishClientPkg.dec
> @@ -28,11 +28,6 @@
>    RedfishEventLib|Include/Library/RedfishEventLib.h
>    RedfishVersionLib|Include/Library/RedfishVersionLib.h
>
> -[LibraryClasses.Common.Private]
> -  ##  @libraryclass Redfish Helper Library
> -  #   Library provides Redfish helper functions.
> -  RedfishLib|PrivateInclude/Library/RedfishLib.h
> -
>  [Protocols]
>    ## Include/Protocol/EdkIIRedfishFeature.h
>    gEdkIIRedfishFeatureProtocolGuid        = { 0x785CC694, 0x4930, 0xEFBF,
> { 0x2A, 0xCB, 0xA4, 0xB6, 0xA1, 0xCC, 0xAA, 0x34 } }
> diff --git a/RedfishClientPkg/RedfishClientLibs.dsc.inc
> b/RedfishClientPkg/RedfishClientLibs.dsc.inc
> index 8ec27baa3..6599926ab 100644
> --- a/RedfishClientPkg/RedfishClientLibs.dsc.inc
> +++ b/RedfishClientPkg/RedfishClientLibs.dsc.inc
> @@ -31,7 +31,6 @@
>
>    NetLib|NetworkPkg/Library/DxeNetLib/DxeNetLib.inf
>    HttpLib|NetworkPkg/Library/DxeHttpLib/DxeHttpLib.inf
> -  RedfishLib|RedfishClientPkg/PrivateLibrary/RedfishLib/RedfishLib.inf
>
> RedfishFeatureUtilityLib|RedfishClientPkg/Library/RedfishFeatureUtilityLib/R
> edfishFeatureUtilityLib.inf
>
> RedfishPlatformConfigLib|RedfishPkg/Library/RedfishPlatformConfigLib/Red
> fishPlatformConfigLib.inf
>
> RedfishContentCodingLib|RedfishPkg/Library/RedfishContentCodingLibNull/
> RedfishContentCodingLibNull.inf
> diff --git a/RedfishClientPkg/RedfishClientPkg.dsc
> b/RedfishClientPkg/RedfishClientPkg.dsc
> index f37bf93ac..28d15580a 100644
> --- a/RedfishClientPkg/RedfishClientPkg.dsc
> +++ b/RedfishClientPkg/RedfishClientPkg.dsc
> @@ -59,7 +59,6 @@
>  [Components]
>
>
> RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib.inf
> -  RedfishClientPkg/PrivateLibrary/RedfishLib/RedfishLib.inf
>    RedfishClientPkg/Library/RedfishAddendumLib/RedfishAddendumLib.inf
>
>    !include RedfishClientPkg/RedfishClient.dsc.inc
> diff --git a/RedfishClientPkg/PrivateLibrary/RedfishLib/RedfishLib.inf
> b/RedfishClientPkg/PrivateLibrary/RedfishLib/RedfishLib.inf
> deleted file mode 100644
> index a54e397d1..000000000
> --- a/RedfishClientPkg/PrivateLibrary/RedfishLib/RedfishLib.inf
> +++ /dev/null
> @@ -1,62 +0,0 @@
> -## @file
> -#  RedfishLib Library implementation.
> -#
> -#  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> -#  (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
> -#
> -#    SPDX-License-Identifier: BSD-2-Clause-Patent
> -#
> -##
> -
> -[Defines]
> -  INF_VERSION                    = 0x0001001b
> -  BASE_NAME                      = DxeRedfishLib
> -  FILE_GUID                      = 9C2CA9CF-4F79-11E8-A7D1-8CDCD426C973
> -  MODULE_TYPE                    = DXE_DRIVER
> -  VERSION_STRING                 = 1.0
> -  LIBRARY_CLASS                  = RedfishLib| DXE_DRIVER UEFI_APPLICATION
> UEFI_DRIVER
> -
> -#
> -#  VALID_ARCHITECTURES           = IA32 X64 ARM AARCH64 RISCV64
> -#
> -
> -[Sources]
> -  edk2libredfish/src/redpath.c
> -  edk2libredfish/src/service.c
> -  edk2libredfish/src/payload.c
> -  edk2libredfish/include/redfish.h
> -  edk2libredfish/include/redfishPayload.h
> -  edk2libredfish/include/redfishService.h
> -  edk2libredfish/include/redpath.h
> -  RedfishLib.c
> -  RedfishMisc.h
> -  RedfishMisc.c
> -
> -[Packages]
> -  MdePkg/MdePkg.dec
> -  MdeModulePkg/MdeModulePkg.dec
> -  NetworkPkg/NetworkPkg.dec
> -  RedfishPkg/RedfishPkg.dec
> -  RedfishClientPkg/RedfishClientPkg.dec
> -
> -[LibraryClasses]
> -  BaseLib
> -  BaseMemoryLib
> -  DebugLib
> -  JsonLib
> -  HttpLib
> -  MemoryAllocationLib
> -  NetLib
> -  RedfishContentCodingLib
> -  RedfishCrtLib
> -  UefiBootServicesTableLib
> -  UefiLib
> -
> -[Protocols]
> -  gEfiRestExServiceBindingProtocolGuid  ## Consumed
> -  gEfiRestExProtocolGuid                ## Consumed
> -  gEdkIIRedfishCredentialProtocolGuid   ## Consumed
> -
> -[BuildOptions]
> -  MSFT:*_*_*_CC_FLAGS = /U_WIN32 /UWIN64 /U_MSC_VER
> -  GCC:*_*_*_CC_FLAGS = -Wno-unused-function -Wno-unused-but-set-
> variable
> diff --git a/RedfishClientPkg/PrivateInclude/Library/RedfishLib.h
> b/RedfishClientPkg/PrivateInclude/Library/RedfishLib.h
> deleted file mode 100644
> index b2488abbd..000000000
> --- a/RedfishClientPkg/PrivateInclude/Library/RedfishLib.h
> +++ /dev/null
> @@ -1,616 +0,0 @@
> -/** @file
> -  This library provides a set of utility APIs that allow to
> create/read/update/delete
> -  (CRUD) Redfish resources and provide basic query abilities by using
> [URI/RedPath]
> -  (https://github.com/DMTF/libredfish).
> -
> -  The query language is based on XPath (https://www.w3.org/TR/1999/REC-
> xpath-19991116/).
> -  This library and query language essentially treat the entire Redfish Service like
> it
> -  was a single JSON document. In other words whenever it encounters an
> odata.id in JSON
> -  document, it will retrieve the new JSON document (if needed). We name the
> path as
> -  RedPath:
> -
> -  Expression       Description
> -
> -  nodename         Selects the JSON entity with the name "nodename".
> -                   If the value of nodename is an object with "@odata.id",
> -                   it will continue get the value from "@odata.id".
> -
> -  /                Selects from the root node
> -
> -  [index]           Selects the index number JSON entity from an array or
> -                   object. If the JSON entity is one collection (has
> -                   Members & Members@odata.count), means to get the index
> -                   member in "Members". Index number >=1, 1 means to return
> -                   the first instance.
> -
> -  [XXX]            Operation on JSON entity.
> -                   If the JSON entity is one collection (has Members &
> -                   Members@odata.count), means to get all elements in
> -                   "Members". If the JSON entity is one array, means to
> -                   get all elements in array. Others will match the nodename
> -                   directly (e.g. JSON_OBJECT, JSON_STRING, JSON_TRUE,
> -                   JSON_FALSE, JSON_INTEGER).
> -
> -  [nodename]       Selects all the elements from an JSON entity that
> -                   contain a property named "nodename"
> -
> -  [name=value]     Selects all the elements from an JSON entity where
> -                   the property "name" is equal to "value"
> -
> -  [name~value]     Selects all the elements from an JSON entity where
> -                   the string property "name" is equal to "value" using
> -                   case insensitive comparison.
> -
> -  [name<value]     Selects all the elements from an JSON entity where
> -                   the property "name" is less than "value"
> -
> -  [name<=value]    Selects all the elements from an JSON entity where
> -                   the property "name" is less than or equal to "value"
> -
> -  [name>value]     Selects all the elements from an JSON entity where
> -                   the property "name" is greater than "value"
> -
> -  [name>=value]    Selects all the elements from an JSON entity where
> -                   the property "name" is greater than or equal to "value"
> -
> -  Some examples:
> -
> -    /v1/Chassis[1]        - Will return the first Chassis instance.
> -    /v1/Chassis[SKU=1234] - Will return all Chassis instances with a SKU field
> equal to 1234.
> -    /v1/Systems[Storage]  - Will return all the System instances that have
> Storage field populated.
> -
> -  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> -  (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
> -
> -  SPDX-License-Identifier: BSD-2-Clause-Patent
> -
> -**/
> -
> -#ifndef REDFISH_LIB_H_
> -#define REDFISH_LIB_H_
> -
> -#include <Library/JsonLib.h>
> -
> -#include <Protocol/Http.h>
> -#include <Protocol/EdkIIRedfishConfigHandler.h>
> -
> -#define ODATA_TYPE_NAME_MAX_SIZE  128
> -#define ODATA_TYPE_MAX_SIZE       128
> -
> -///
> -/// Library class public defines
> -///
> -typedef  VOID  *REDFISH_SERVICE;
> -typedef  VOID  *REDFISH_PAYLOAD;
> -
> -///
> -/// Library class public structures/unions
> -///
> -typedef struct {
> -  EFI_HTTP_STATUS_CODE    *StatusCode;
> -  UINTN                   HeaderCount;
> -  EFI_HTTP_HEADER         *Headers;
> -  REDFISH_PAYLOAD         Payload;
> -} REDFISH_RESPONSE;
> -
> -///
> -/// Odata type-name mapping structure.
> -///
> -typedef struct {
> -  CONST CHAR8    OdataTypeName[ODATA_TYPE_NAME_MAX_SIZE];
> -  CONST CHAR8    OdataType[ODATA_TYPE_MAX_SIZE];
> -} REDFISH_ODATA_TYPE_MAPPING;
> -
> -/**
> -  This function uses REST EX protocol provided in RedfishConfigServiceInfo.
> -  The service enumerator will also handle the authentication flow
> automatically
> -  if HTTP basic auth or Redfish session login is configured to use.
> -
> -  Callers are responsible for freeing the returned service by
> RedfishCleanupService().
> -
> -  @param[in]  RedfishConfigServiceInfo Redfish service information the EFI
> Redfish
> -                                       feature driver communicates with.
> -
> -  @return     New created Redfish Service, or NULL if error happens.
> -
> -**/
> -REDFISH_SERVICE
> -EFIAPI
> -RedfishCreateService (
> -  IN  REDFISH_CONFIG_SERVICE_INFORMATION  *RedfishConfigServiceInfo
> -  );
> -
> -/**
> -  Free the Service and all its related resources.
> -
> -  @param[in]    RedfishService     The Service to access the Redfish resources.
> -
> -**/
> -VOID
> -EFIAPI
> -RedfishCleanupService (
> -  IN REDFISH_SERVICE  RedfishService
> -  );
> -
> -/**
> -  Create REDFISH_PAYLOAD instance in local with JSON represented resource
> value and
> -  the Redfish Service.
> -
> -  The returned REDFISH_PAYLOAD can be used to create or update Redfish
> resource in
> -  server side.
> -
> -  Callers are responsible for freeing the returned payload by
> RedfishCleanupPayload().
> -
> -  @param[in]    Value                 JSON Value of the redfish resource.
> -  @param[in]    RedfishService        The Service to access the Redfish resources.
> -
> -  @return     REDFISH_PAYLOAD instance of the resource, or NULL if error
> happens.
> -
> -**/
> -REDFISH_PAYLOAD
> -EFIAPI
> -RedfishCreatePayload (
> -  IN EDKII_JSON_VALUE  Value,
> -  IN REDFISH_SERVICE   RedfishService
> -  );
> -
> -/**
> -  Free the RedfishPayload and all its related resources.
> -
> -  @param[in]    Payload        Payload to be freed.
> -
> -**/
> -VOID
> -EFIAPI
> -RedfishCleanupPayload (
> -  IN REDFISH_PAYLOAD  Payload
> -  );
> -
> -/**
> -  This function returns the decoded JSON value of a REDFISH_PAYLOAD.
> -
> -  Caller doesn't need to free the returned JSON value because it will be
> released
> -  in corresponding RedfishCleanupPayload() function.
> -
> -  @param[in]    Payload     A REDFISH_PAYLOAD instance.
> -
> -  @return     Decoded JSON value of the payload.
> -
> -**/
> -EDKII_JSON_VALUE
> -EFIAPI
> -RedfishJsonInPayload (
> -  IN REDFISH_PAYLOAD  Payload
> -  );
> -
> -/**
> -  Fill the input RedPath string with system UUID from SMBIOS table or use the
> customized
> -  ID if  FromSmbios == FALSE.
> -
> -  This is a helper function to build a RedPath string which can be used to
> address
> -  a Redfish resource for this computer system. The input PathString must have
> a Systems
> -  note in format of "Systems[UUID=%g]" or "Systems[UUID~%g]" to fill the
> UUID value.
> -
> -  Example:
> -    Use "/v1/Systems[UUID=%g]/Bios" to build a RedPath to address the
> "Bios" resource
> -    for this computer system.
> -
> -  @param[in]    RedPath        RedPath format to be build.
> -  @param[in]    FromSmbios     Get system UUID from SMBIOS as computer
> system instance ID.
> -  @param[in]    IdString       The computer system instance ID.
> -
> -  @return     Full RedPath with system UUID inside, or NULL if error happens.
> -
> -**/
> -CHAR8 *
> -EFIAPI
> -RedfishBuildPathWithSystemUuid (
> -  IN CONST CHAR8  *RedPath,
> -  IN BOOLEAN      FromSmbios,
> -  IN CHAR8        *IdString OPTIONAL
> -  );
> -
> -/**
> -  Get a redfish response addressed by a RedPath string, including HTTP
> StatusCode, Headers
> -  and Payload which record any HTTP response messages.
> -
> -  Callers are responsible for freeing the HTTP StatusCode, Headers and
> Payload returned in
> -  redfish response data.
> -
> -  @param[in]    RedfishService        The Service to access the Redfish resources.
> -  @param[in]    RedPath               RedPath string to address a resource, must
> start
> -                                      from the root node.
> -  @param[out]   RedResponse           Pointer to the Redfish response data.
> -
> -  @retval EFI_SUCCESS             The opeartion is successful, indicates the HTTP
> StatusCode is not
> -                                  NULL and the value is 2XX. The corresponding redfish
> resource has
> -                                  been returned in Payload within RedResponse.
> -  @retval EFI_INVALID_PARAMETER   RedfishService, RedPath, or
> RedResponse is NULL.
> -  @retval EFI_DEVICE_ERROR        An unexpected system or network error
> occurred. Callers can get
> -                                  more error info from returned HTTP StatusCode, Headers
> and Payload
> -                                  within RedResponse:
> -                                  1. If the returned Payload is NULL, indicates any error
> happen.
> -                                  2. If the returned StatusCode is NULL, indicates any error
> happen.
> -                                  3. If the returned StatusCode is not 2XX, indicates any error
> happen.
> -**/
> -EFI_STATUS
> -EFIAPI
> -RedfishGetByService (
> -  IN     REDFISH_SERVICE   RedfishService,
> -  IN     CONST CHAR8       *RedPath,
> -  OUT    REDFISH_RESPONSE  *RedResponse
> -  );
> -
> -/**
> -  Get a redfish response addressed by URI, including HTTP StatusCode,
> Headers
> -  and Payload which record any HTTP response messages.
> -
> -  Callers are responsible for freeing the HTTP StatusCode, Headers and
> Payload returned in
> -  redfish response data.
> -
> -  @param[in]    RedfishService    The Service to access the URI resources.
> -  @param[in]    URI               String to address a resource.
> -  @param[out]   RedResponse       Pointer to the Redfish response data.
> -
> -  @retval EFI_SUCCESS             The opeartion is successful, indicates the HTTP
> StatusCode is not
> -                                  NULL and the value is 2XX. The corresponding redfish
> resource has
> -                                  been returned in Payload within RedResponse.
> -  @retval EFI_INVALID_PARAMETER   RedfishService, RedPath, or
> RedResponse is NULL.
> -  @retval EFI_DEVICE_ERROR        An unexpected system or network error
> occurred. Callers can get
> -                                  more error info from returned HTTP StatusCode, Headers
> and Payload
> -                                  within RedResponse:
> -                                  1. If the returned Payload is NULL, indicates any error
> happen.
> -                                  2. If the returned StatusCode is NULL, indicates any error
> happen.
> -                                  3. If the returned StatusCode is not 2XX, indicates any error
> happen.
> -**/
> -EFI_STATUS
> -EFIAPI
> -RedfishGetByUri (
> -  IN     REDFISH_SERVICE   RedfishService,
> -  IN     CONST CHAR8       *Uri,
> -  OUT    REDFISH_RESPONSE  *RedResponse
> -  );
> -
> -/**
> -  Get a redfish response addressed by the input Payload and relative RedPath
> string,
> -  including HTTP StatusCode, Headers and Payload which record any HTTP
> response messages.
> -
> -  Callers are responsible for freeing the HTTP StatusCode, Headers and
> Payload returned in
> -  redfish response data.
> -
> -  @param[in]    Payload           A existing REDFISH_PAYLOAD instance.
> -  @param[in]    RedPath           Relative RedPath string to address a resource
> inside Payload.
> -  @param[out]   RedResponse       Pointer to the Redfish response data.
> -
> -  @retval EFI_SUCCESS             The opeartion is successful:
> -                                  1. The HTTP StatusCode is NULL and the returned Payload in
> -                                  RedResponse is not NULL, indicates the Redfish resource has
> -                                  been parsed from the input payload directly.
> -                                  2. The HTTP StatusCode is not NULL and the value is 2XX,
> -                                  indicates the corresponding redfish resource has been
> returned
> -                                  in Payload within RedResponse.
> -  @retval EFI_INVALID_PARAMETER   Payload, RedPath, or RedResponse is
> NULL.
> -  @retval EFI_DEVICE_ERROR        An unexpected system or network error
> occurred. Callers can get
> -                                  more error info from returned HTTP StatusCode, Headers
> and Payload
> -                                  within RedResponse:
> -                                  1. If the returned Payload is NULL, indicates any error
> happen.
> -                                  2. If StatusCode is not NULL and the returned value of
> StatusCode
> -                                     is not 2XX, indicates any error happen.
> -**/
> -EFI_STATUS
> -EFIAPI
> -RedfishGetByPayload (
> -  IN     REDFISH_PAYLOAD   Payload,
> -  IN     CONST CHAR8       *RedPath,
> -  OUT    REDFISH_RESPONSE  *RedResponse
> -  );
> -
> -/**
> -  Use HTTP PATCH to perform updates on pre-existing Redfish resource.
> -
> -  This function uses the RedfishService to patch a Redfish resource addressed
> by
> -  Uri (only the relative path is required). Changes to one or more properties
> within
> -  the target resource are represented in the input Content, properties not
> specified
> -  in Content won't be changed by this request. The corresponding redfish
> response will
> -  returned, including HTTP StatusCode, Headers and Payload which record any
> HTTP response
> -  messages.
> -
> -  Callers are responsible for freeing the HTTP StatusCode, Headers and
> Payload returned in
> -  redfish response data.
> -
> -  @param[in]    RedfishService        The Service to access the Redfish resources.
> -  @param[in]    Uri                   Relative path to address the resource.
> -  @param[in]    Content               JSON represented properties to be update.
> -  @param[out]   RedResponse           Pointer to the Redfish response data.
> -
> -  @retval EFI_SUCCESS             The opeartion is successful, indicates the HTTP
> StatusCode is not
> -                                  NULL and the value is 2XX. The Redfish resource will be
> returned
> -                                  in Payload within RedResponse if server send it back in the
> HTTP
> -                                  response message body.
> -  @retval EFI_INVALID_PARAMETER   RedfishService, Uri, Content, or
> RedResponse is NULL.
> -  @retval EFI_DEVICE_ERROR        An unexpected system or network error
> occurred. Callers can get
> -                                  more error info from returned HTTP StatusCode, Headers
> and Payload
> -                                  within RedResponse:
> -                                  1. If the returned StatusCode is NULL, indicates any error
> happen.
> -                                  2. If the returned StatusCode is not NULL and the value is
> not 2XX,
> -                                     indicates any error happen.
> -**/
> -EFI_STATUS
> -EFIAPI
> -RedfishPatchToUri (
> -  IN     REDFISH_SERVICE   RedfishService,
> -  IN     CONST CHAR8       *Uri,
> -  IN     CONST CHAR8       *Content,
> -  OUT    REDFISH_RESPONSE  *RedResponse
> -  );
> -
> -/**
> -  Use HTTP PATCH to perform updates on target payload. Patch to odata.id in
> Payload directly.
> -
> -  This function uses the Payload to patch the Target. Changes to one or more
> properties
> -  within the target resource are represented in the input Payload, properties
> not specified
> -  in Payload won't be changed by this request. The corresponding redfish
> response will
> -  returned, including HTTP StatusCode, Headers and Payload which record any
> HTTP response
> -  messages.
> -
> -  Callers are responsible for freeing the HTTP StatusCode, Headers and
> Payload returned in
> -  redfish response data.
> -
> -  @param[in]    Target           The target payload to be updated.
> -  @param[in]    Payload          Palyoad with properties to be changed.
> -  @param[out]   RedResponse      Pointer to the Redfish response data.
> -
> -  @retval EFI_SUCCESS             The opeartion is successful, indicates the HTTP
> StatusCode is not
> -                                  NULL and the value is 2XX. The Redfish resource will be
> returned
> -                                  in Payload within RedResponse if server send it back in the
> HTTP
> -                                  response message body.
> -  @retval EFI_INVALID_PARAMETER   Target, Payload, or RedResponse is
> NULL.
> -  @retval EFI_DEVICE_ERROR        An unexpected system or network error
> occurred. Callers can get
> -                                  more error info from returned HTTP StatusCode, Headers
> and Payload
> -                                  within RedResponse:
> -                                  1. If the returned StatusCode is NULL, indicates any error
> happen.
> -                                  2. If the returned StatusCode is not NULL and the value is
> not 2XX,
> -                                     indicates any error happen.
> -**/
> -EFI_STATUS
> -EFIAPI
> -RedfishPatchToPayload (
> -  IN     REDFISH_PAYLOAD   Target,
> -  IN     REDFISH_PAYLOAD   Payload,
> -  OUT    REDFISH_RESPONSE  *RedResponse
> -  );
> -
> -/**
> -  Use HTTP POST to create a new resource in target payload.
> -
> -  The POST request should be submitted to the Resource Collection in which
> the new resource
> -  is to belong. The Resource Collection is addressed by Target payload. The
> Redfish may
> -  ignore any service controlled properties. The corresponding redfish response
> will returned,
> -  including HTTP StatusCode, Headers and Payload which record any HTTP
> response messages.
> -
> -  Callers are responsible for freeing the HTTP StatusCode, Headers and
> Payload returned in
> -  redfish response data.
> -
> -  @param[in]    Target          Target payload of the Resource Collection.
> -  @param[in]    Payload         The new resource to be created.
> -  @param[out]   RedResponse     Pointer to the Redfish response data.
> -
> -  @retval EFI_SUCCESS             The opeartion is successful, indicates the HTTP
> StatusCode is not
> -                                  NULL and the value is 2XX. The Redfish resource will be
> returned
> -                                  in Payload within RedResponse if server send it back in the
> HTTP
> -                                  response message body.
> -  @retval EFI_INVALID_PARAMETER   Target, Payload, or RedResponse is
> NULL.
> -  @retval EFI_DEVICE_ERROR        An unexpected system or network error
> occurred. Callers can get
> -                                  more error info from returned HTTP StatusCode, Headers
> and Payload
> -                                  within RedResponse:
> -                                  1. If the returned StatusCode is NULL, indicates any error
> happen.
> -                                  2. If the returned StatusCode is not NULL and the value is
> not 2XX,
> -                                     indicates any error happen.
> -**/
> -EFI_STATUS
> -EFIAPI
> -RedfishPostToPayload (
> -  IN     REDFISH_PAYLOAD   Target,
> -  IN     REDFISH_PAYLOAD   Payload,
> -  OUT    REDFISH_RESPONSE  *RedResponse
> -  );
> -
> -/**
> -  Use HTTP DELETE to remove a resource.
> -
> -  This function uses the RedfishService to remove a Redfish resource which is
> addressed
> -  by input Uri (only the relative path is required). The corresponding redfish
> response will
> -  returned, including HTTP StatusCode, Headers and Payload which record any
> HTTP response
> -  messages.
> -
> -  Callers are responsible for freeing the HTTP StatusCode, Headers and
> Payload returned in
> -  redfish response data.
> -
> -  @param[in]    RedfishService        The Service to access the Redfish resources.
> -  @param[in]    Uri                   Relative path to address the resource.
> -  @param[out]   RedResponse           Pointer to the Redfish response data.
> -
> -  @retval EFI_SUCCESS             The opeartion is successful, indicates the HTTP
> StatusCode is not
> -                                  NULL and the value is 2XX, the Redfish resource has been
> removed.
> -                                  If there is any message returned from server, it will be
> returned
> -                                  in Payload within RedResponse.
> -  @retval EFI_INVALID_PARAMETER   RedfishService, Uri, or RedResponse is
> NULL.
> -  @retval EFI_DEVICE_ERROR        An unexpected system or network error
> occurred. Callers can get
> -                                  more error info from returned HTTP StatusCode, Headers
> and Payload
> -                                  within RedResponse:
> -                                  1. If the returned StatusCode is NULL, indicates any error
> happen.
> -                                  2. If the returned StatusCode is not NULL and the value is
> not 2XX,
> -                                     indicates any error happen.
> -**/
> -EFI_STATUS
> -EFIAPI
> -RedfishDeleteByUri (
> -  IN     REDFISH_SERVICE   RedfishService,
> -  IN     CONST CHAR8       *Uri,
> -  OUT    REDFISH_RESPONSE  *RedResponse
> -  );
> -
> -/**
> -  Dump text in fractions.
> -
> -  @param[in]  String   ASCII string to dump.
> -
> -**/
> -VOID
> -RedfishDumpJsonStringFractions (
> -  IN CHAR8  *String
> -  );
> -
> -/**
> -  Extract the JSON text content from REDFISH_PAYLOAD and dump to debug
> console.
> -
> -  @param[in]  Payload       The Redfish payload to dump.
> -
> -**/
> -VOID
> -RedfishDumpPayload (
> -  IN REDFISH_PAYLOAD  Payload
> -  );
> -
> -/**
> -  Dump text in JSON value.
> -
> -  @param[in]  JsonValue       The Redfish JSON value to dump.
> -
> -**/
> -VOID
> -RedfishDumpJson (
> -  IN EDKII_JSON_VALUE  JsonValue
> -  );
> -
> -/**
> -  This function will cleanup the HTTP header and Redfish payload resources.
> -
> -  @param[in]  StatusCode        The status code in HTTP response message.
> -  @param[in]  HeaderCount       Number of HTTP header structures in Headers
> list.
> -  @param[in]  Headers           Array containing list of HTTP headers.
> -  @param[in]  Payload           The Redfish payload to dump.
> -
> -**/
> -VOID
> -RedfishFreeResponse (
> -  IN EFI_HTTP_STATUS_CODE  *StatusCode,
> -  IN UINTN                 HeaderCount,
> -  IN EFI_HTTP_HEADER       *Headers,
> -  IN REDFISH_PAYLOAD       Payload
> -  );
> -
> -/**
> -  Check if the "@odata.type" in Payload is valid or not.
> -
> -  @param[in]  Payload                  The Redfish payload to be checked.
> -  @param[in]  OdataTypeName            OdataType will be retrived from
> mapping list.
> -  @param[in]  OdataTypeMappingList     The list of OdataType.
> -  @param[in]  OdataTypeMappingListSize The number of mapping list
> -
> -  @return TRUE if the "@odata.type" in Payload is valid, otherwise FALSE.
> -
> -**/
> -BOOLEAN
> -RedfishIsValidOdataType (
> -  IN REDFISH_PAYLOAD             Payload,
> -  IN CONST CHAR8                 *OdataTypeName,
> -  IN REDFISH_ODATA_TYPE_MAPPING  *OdataTypeMappingList,
> -  IN UINTN                       OdataTypeMappingListSize
> -  );
> -
> -/**
> -  Check if the payload is collection
> -
> -  @param[in]  Payload   The Redfish payload to be checked.
> -
> -  @return TRUE if the payload is  collection.
> -
> -**/
> -BOOLEAN
> -RedfishIsPayloadCollection (
> -  IN REDFISH_PAYLOAD  Payload
> -  );
> -
> -/**
> -  Get collection size.
> -
> -  @param[in]  Payload         The Redfish collection payload
> -  @param[in]  CollectionSize  Size of this collection
> -
> -  @return EFI_SUCCESS              Coolection size is returned in CollectionSize
> -  @return EFI_INVALID_PARAMETER    The payload is not a collection.
> -**/
> -EFI_STATUS
> -RedfishGetCollectionSize (
> -  IN REDFISH_PAYLOAD  Payload,
> -  IN UINTN            *CollectionSize
> -  );
> -
> -/**
> -  Get Redfish payload of collection member
> -
> -  @param[in]  Payload    The Redfish collection payload
> -  @param[in]  Index      Index of collection member
> -
> -  @return NULL           Fail to get collection member.
> -  @return Non NULL       Payload is returned.
> -**/
> -REDFISH_PAYLOAD
> -RedfishGetPayloadByIndex (
> -  IN REDFISH_PAYLOAD  Payload,
> -  IN UINTN            Index
> -  );
> -
> -/**
> -  Check and return Redfish resource of the given Redpath.
> -
> -  @param[in]  RedfishService  Pointer to REDFISH_SERVICE
> -  @param[in]  Redpath         Redpath of the resource.
> -  @param[in]  Response        Optional return the resource.
> -
> -  @return EFI_STATUS
> -**/
> -EFI_STATUS
> -RedfishCheckIfRedpathExist (
> -  IN REDFISH_SERVICE   RedfishService,
> -  IN CHAR8             *Redpath,
> -  IN REDFISH_RESPONSE  *Response OPTIONAL
> -  );
> -
> -/**
> -  This function returns the string of Redfish service version.
> -
> -  @param[in]  RedfishService      Redfish service instance.
> -  @param[out] ServiceVersionStr   Redfish service string.
> -
> -  @return     EFI_STATUS
> -
> -**/
> -EFI_STATUS
> -RedfishGetServiceVersion (
> -  IN  REDFISH_SERVICE  RedfishService,
> -  OUT CHAR8            **ServiceVersionStr
> -  );
> -
> -/**
> -  This function returns the string of Redfish service version.
> -
> -  @param[in]   ServiceVerisonStr The string of Redfish service version.
> -  @param[in]   Url               The URL to build Redpath with ID.
> -                                 Start with "/", for example "/Registries"
> -  @param[in]   Id                ID string
> -  @param[out]  Redpath           Pointer to retrive Redpath, caller has to free
> -                                 the memory allocated for this string.
> -  @return     EFI_STATUS
> -
> -**/
> -EFI_STATUS
> -RedfishBuildRedpathUseId (
> -  IN  CHAR8  *ServiceVerisonStr,
> -  IN  CHAR8  *Url,
> -  IN  CHAR8  *Id,
> -  OUT CHAR8  **Redpath
> -  );
> -
> -#endif
> diff --git a/RedfishClientPkg/PrivateLibrary/RedfishLib/RedfishMisc.h
> b/RedfishClientPkg/PrivateLibrary/RedfishLib/RedfishMisc.h
> deleted file mode 100644
> index 3b066c117..000000000
> --- a/RedfishClientPkg/PrivateLibrary/RedfishLib/RedfishMisc.h
> +++ /dev/null
> @@ -1,82 +0,0 @@
> -/** @file
> -  Internal Functions for RedfishLib.
> -
> -  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> -  (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
> -
> -  SPDX-License-Identifier: BSD-2-Clause-Patent
> -
> -**/
> -
> -#ifndef DXE_REDFISH_MISC_LIB_H_
> -#define DXE_REDFISH_MISC_LIB_H_
> -
> -#include <Library/BaseLib.h>
> -#include <Library/BaseMemoryLib.h>
> -#include <Library/DebugLib.h>
> -#include <Library/JsonLib.h>
> -#include <Library/MemoryAllocationLib.h>
> -#include <Library/PrintLib.h>
> -#include <Library/RedfishLib.h>
> -#include <Library/UefiLib.h>
> -#include <Protocol/EdkIIRedfishCredential.h>
> -#include <redfish.h>
> -
> -#define ARRAY_SIZE(Array)  (sizeof (Array) / sizeof ((Array)[0]))
> -
> -/**
> -  Creates a REDFISH_SERVICE which can be later used to access the Redfish
> resources.
> -
> -  This function will configure REST EX child according to parameters described
> in
> -  Redfish network host interface in SMBIOS type 42 record. The service
> enumerator will also
> -  handle the authentication flow automatically if HTTP basic auth or Redfish
> session
> -  login is configured to use.
> -
> -  @param[in]  RedfishConfigServiceInfo Redfish service information the EFI
> Redfish
> -                                       feature driver communicates with.
> -  @param[in]  AuthMethod   None, HTTP basic auth, or Redfish session login.
> -  @param[in]  UserId       User Name used for authentication.
> -  @param[in]  Password     Password used for authentication.
> -
> -  @return     New created Redfish service, or NULL if error happens.
> -
> -**/
> -REDFISH_SERVICE
> -RedfishCreateLibredfishService (
> -  IN REDFISH_CONFIG_SERVICE_INFORMATION  *RedfishConfigServiceInfo,
> -  IN EDKII_REDFISH_AUTH_METHOD           AuthMethod,
> -  IN CHAR8                               *UserId,
> -  IN CHAR8                               *Password
> -  );
> -
> -/**
> -  Retrieve platform's Redfish authentication information.
> -
> -  This functions returns the Redfish authentication method together with the
> user
> -  Id and password.
> -  For AuthMethodNone, UserId and Password will point to NULL which
> means authentication
> -  is not required to access the Redfish service.
> -  For AuthMethodHttpBasic, the UserId and Password could be used for
> -  HTTP header authentication as defined by RFC7235. For
> AuthMethodRedfishSession,
> -  the UserId and Password could be used for Redfish session login as defined
> by
> -  Redfish API specification (DSP0266).
> -
> -  Callers are responsible for freeing the returned string storage pointed by
> UserId
> -  and Password.
> -
> -  @param[out]  AuthMethod          Type of Redfish authentication method.
> -  @param[out]  UserId              The pointer to store the returned UserId string.
> -  @param[out]  Password            The pointer to store the returned Password
> string.
> -
> -  @retval EFI_SUCCESS              Get the authentication information successfully.
> -  @retval EFI_INVALID_PARAMETER    AuthMethod or UserId or Password is
> NULL.
> -  @retval EFI_UNSUPPORTED          Unsupported authentication method is
> found.
> -**/
> -EFI_STATUS
> -RedfishGetAuthInfo (
> -  OUT  EDKII_REDFISH_AUTH_METHOD  *AuthMethod,
> -  OUT  CHAR8                      **UserId,
> -  OUT  CHAR8                      **Password
> -  );
> -
> -#endif
> diff --git
> a/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfish.
> h
> b/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfish.
> h
> deleted file mode 100644
> index e9b9b3fa5..000000000
> ---
> a/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfish.
> h
> +++ /dev/null
> @@ -1,25 +0,0 @@
> -/** @file
> -  This file is cloned from DMTF libredfish library tag v1.0.0 and maintained
> -  by EDKII.
> -
> -//----------------------------------------------------------------------------
> -// Copyright Notice:
> -// Copyright 2017 Distributed Management Task Force, Inc. All rights
> reserved.
> -// License: BSD 3-Clause License. For full text see link:
> https://github.com/DMTF/libredfish/LICENSE.md
> -//----------------------------------------------------------------------------
> -
> -  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> -  (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
> -
> -  SPDX-License-Identifier: BSD-2-Clause-Patent
> -
> -**/
> -
> -#ifndef LIBREDFISH_REDFISH_H_
> -#define LIBREDFISH_REDFISH_H_
> -
> -#include <redfishService.h>
> -#include <redfishPayload.h>
> -#include <redpath.h>
> -
> -#endif
> diff --git
> a/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishP
> ayload.h
> b/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishP
> ayload.h
> deleted file mode 100644
> index 4e91b724c..000000000
> ---
> a/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishP
> ayload.h
> +++ /dev/null
> @@ -1,136 +0,0 @@
> -/** @file
> -  This file is cloned from DMTF libredfish library tag v1.0.0 and maintained
> -  by EDKII.
> -
> -//----------------------------------------------------------------------------
> -// Copyright Notice:
> -// Copyright 2017 Distributed Management Task Force, Inc. All rights
> reserved.
> -// License: BSD 3-Clause License. For full text see link:
> https://github.com/DMTF/libredfish/LICENSE.md
> -//----------------------------------------------------------------------------
> -
> -  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> -  (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>
> -  Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
> -
> -  SPDX-License-Identifier: BSD-2-Clause-Patent
> -
> -**/
> -
> -#ifndef LIBREDFISH_REDFISH_PAYLOAD_H_
> -#define LIBREDFISH_REDFISH_PAYLOAD_H_
> -
> -#include <Include/Library/RedfishCrtLib.h>
> -#include <Library/JsonLib.h>
> -#include <jansson.h>
> -#include <redfishService.h>
> -#include <redpath.h>
> -
> -redfishPayload *
> -createRedfishPayload (
> -  json_t          *value,
> -  redfishService  *service
> -  );
> -
> -redfishPayload *
> -getPayloadByNodeName (
> -  redfishPayload        *payload,
> -  const char            *nodeName,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -redfishPayload *
> -getPayloadByIndex (
> -  redfishPayload        *payload,
> -  size_t                index,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -redfishPayload *
> -getPayloadForPath (
> -  redfishPayload        *payload,
> -  redPathNode           *redpath,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -redfishPayload *
> -getPayloadForPathString (
> -  redfishPayload        *payload,
> -  const char            *string,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -redfishPayload *
> -patchPayload (
> -  redfishPayload        *target,
> -  redfishPayload        *payload,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -redfishPayload *
> -patchPayloadEx (
> -  redfishPayload        *target,
> -  redfishPayload        *payload,
> -  EFI_HTTP_HEADER       **Headers,
> -  UINTN                 *HeaderCount,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -redfishPayload *
> -postContentToPayload (
> -  redfishPayload        *target,
> -  const char            *data,
> -  size_t                dataSize,
> -  const char            *contentType,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -redfishPayload *
> -postContentToPayloadEx (
> -  redfishPayload        *target,
> -  const char            *data,
> -  size_t                dataSize,
> -  const char            *contentType,
> -  EFI_HTTP_HEADER       **Headers,
> -  UINTN                 *HeaderCount,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -redfishPayload *
> -postPayload (
> -  redfishPayload        *target,
> -  redfishPayload        *payload,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -redfishPayload *
> -postPayloadEx (
> -  redfishPayload        *target,
> -  redfishPayload        *payload,
> -  EFI_HTTP_HEADER       **Headers,
> -  UINTN                 *HeaderCount,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -void
> -cleanupPayload (
> -  redfishPayload  *payload
> -  );
> -
> -bool
> -isPayloadCollection (
> -  redfishPayload  *Payload
> -  );
> -
> -size_t
> -getCollectionSize (
> -  redfishPayload  *payload
> -  );
> -
> -redfishPayload *
> -getPayloadByIndex (
> -  redfishPayload        *payload,
> -  size_t                index,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -#endif
> diff --git
> a/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishS
> ervice.h
> b/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishS
> ervice.h
> deleted file mode 100644
> index c2e0fd321..000000000
> ---
> a/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishS
> ervice.h
> +++ /dev/null
> @@ -1,203 +0,0 @@
> -/** @file
> -  This file is cloned from DMTF libredfish library tag v1.0.0 and maintained
> -  by EDKII.
> -
> -//----------------------------------------------------------------------------
> -// Copyright Notice:
> -// Copyright 2017 Distributed Management Task Force, Inc. All rights
> reserved.
> -// License: BSD 3-Clause License. For full text see link:
> https://github.com/DMTF/libredfish/LICENSE.md
> -//----------------------------------------------------------------------------
> -
> -  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> -  (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>
> -  Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
> -
> -  SPDX-License-Identifier: BSD-2-Clause-Patent
> -
> -**/
> -
> -#ifndef LIBREDFISH_REDFISH_SERVICE_H_
> -#define LIBREDFISH_REDFISH_SERVICE_H_
> -
> -#include <IndustryStandard/Http11.h>
> -
> -#include <Library/BaseLib.h>
> -#include <Library/BaseMemoryLib.h>
> -#include <Library/DebugLib.h>
> -#include <Library/HttpLib.h>
> -#include <Library/MemoryAllocationLib.h>
> -#include <Library/NetLib.h>
> -#include <Library/RedfishContentCodingLib.h>
> -#include <Library/UefiRuntimeServicesTableLib.h>
> -#include <Library/UefiBootServicesTableLib.h>
> -
> -#include <Include/Library/RedfishCrtLib.h>
> -
> -#include <Protocol/EdkIIRedfishConfigHandler.h>
> -#include <Protocol/RestEx.h>
> -
> -#include <jansson.h>
> -
> -typedef struct {
> -  char                    *host;
> -  json_t                  *versions;
> -  unsigned int            flags;
> -  char                    *sessionToken;
> -  char                    *basicAuthStr;
> -  //
> -  // point to the <HOST> part in above "host" field, which will be put into
> -  // the "Host" header of HTTP request message.
> -  //
> -  char                    *HostHeaderValue;
> -  EFI_REST_EX_PROTOCOL    *RestEx;
> -} redfishService;
> -
> -typedef struct {
> -  json_t            *json;
> -  redfishService    *service;
> -} redfishPayload;
> -
> -#define REDFISH_AUTH_BASIC         0
> -#define REDFISH_AUTH_BEARER_TOKEN  1
> -#define REDFISH_AUTH_SESSION       2
> -
> -#define REDFISH_HTTP_RESPONSE_TIMEOUT  5000       /// 5 seconds in uints
> of millisecond.
> -
> -///
> -/// Library class public defines
> -///
> -#define HTTP_FLAG   L"http://"
> -#define HTTPS_FLAG  L"https://"
> -
> -///
> -/// The redfish first URL should be "/redfish/v1/", while we use "/redfish/v1"
> here without "/"
> -/// in the end is to avoid the 301 Perment redirect response from Redfish
> profile simulator.
> -///
> -#define REDFISH_FIRST_URL  L"/redfish/v1"
> -
> -typedef struct {
> -  unsigned int    authType;
> -  union {
> -    struct {
> -      char    *username;
> -      char    *password;
> -    } userPass;
> -    struct {
> -      char    *token;
> -    } authToken;
> -  } authCodes;
> -} enumeratorAuthentication;
> -
> -// Values for flags
> -#define REDFISH_FLAG_SERVICE_NO_VERSION_DOC  0x00000001// The
> Redfish Service lacks the version document (in violation of the Redfish spec)
> -redfishService *
> -createServiceEnumerator (
> -  REDFISH_CONFIG_SERVICE_INFORMATION  *RedfishConfigServiceInfo,
> -  const char                          *rootUri,
> -  enumeratorAuthentication            *auth,
> -  unsigned int                        flags
> -  );
> -
> -json_t *
> -getUriFromService (
> -  redfishService        *service,
> -  const char            *uri,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -json_t *
> -getUriFromServiceEx (
> -  redfishService        *service,
> -  const char            *uri,
> -  EFI_HTTP_HEADER       **Headers,
> -  UINTN                 *HeaderCount,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -json_t *
> -patchUriFromService (
> -  redfishService        *service,
> -  const char            *uri,
> -  const char            *content,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -json_t *
> -patchUriFromServiceEx (
> -  redfishService        *service,
> -  const char            *uri,
> -  const char            *content,
> -  EFI_HTTP_HEADER       **Headers,
> -  UINTN                 *HeaderCount,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -json_t *
> -postUriFromService (
> -  redfishService        *service,
> -  const char            *uri,
> -  const char            *content,
> -  size_t                contentLength,
> -  const char            *contentType,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -json_t *
> -postUriFromServiceEx (
> -  redfishService        *service,
> -  const char            *uri,
> -  const char            *content,
> -  size_t                contentLength,
> -  const char            *contentType,
> -  EFI_HTTP_HEADER       **Headers,
> -  UINTN                 *HeaderCount,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -json_t *
> -putUriFromServiceEx (
> -  redfishService        *service,
> -  const char            *uri,
> -  const char            *content,
> -  size_t                contentLength,
> -  const char            *contentType,
> -  EFI_HTTP_HEADER       **Headers,
> -  UINTN                 *HeaderCount,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -json_t *
> -deleteUriFromService (
> -  redfishService        *service,
> -  const char            *uri,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -json_t *
> -deleteUriFromServiceEx (
> -  redfishService        *service,
> -  const char            *uri,
> -  const char            *content,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -redfishPayload *
> -getRedfishServiceRoot (
> -  redfishService        *service,
> -  const char            *version,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -redfishPayload *
> -getPayloadByPath (
> -  redfishService        *service,
> -  const char            *path,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -void
> -cleanupServiceEnumerator (
> -  redfishService  *service
> -  );
> -
> -#endif
> diff --git
> a/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redpath
> .h
> b/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redpath
> .h
> deleted file mode 100644
> index c1a1568bf..000000000
> ---
> a/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redpath
> .h
> +++ /dev/null
> @@ -1,49 +0,0 @@
> -/** @file
> -  This file is cloned from DMTF libredfish library tag v1.0.0 and maintained
> -  by EDKII.
> -
> -//----------------------------------------------------------------------------
> -// Copyright Notice:
> -// Copyright 2017 Distributed Management Task Force, Inc. All rights
> reserved.
> -// License: BSD 3-Clause License. For full text see link:
> https://github.com/DMTF/libredfish/LICENSE.md
> -//----------------------------------------------------------------------------
> -
> -  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> -  (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
> -
> -  SPDX-License-Identifier: BSD-2-Clause-Patent
> -
> -**/
> -
> -#ifndef LIBREDFISH_REDPATH_H_
> -#define LIBREDFISH_REDPATH_H_
> -
> -#include <Include/Library/RedfishCrtLib.h>
> -
> -#include <jansson.h>
> -
> -typedef struct _redPathNode {
> -  bool                   isRoot;
> -  bool                   isIndex;
> -
> -  char                   *version;
> -  char                   *nodeName;
> -  size_t                 index;
> -  char                   *op;
> -  char                   *propName;
> -  char                   *value;
> -
> -  struct _redPathNode    *next;
> -} redPathNode;
> -
> -redPathNode *
> -parseRedPath (
> -  const char  *path
> -  );
> -
> -void
> -cleanupRedPath (
> -  redPathNode  *node
> -  );
> -
> -#endif
> diff --git a/RedfishClientPkg/PrivateLibrary/RedfishLib/RedfishLib.c
> b/RedfishClientPkg/PrivateLibrary/RedfishLib/RedfishLib.c
> deleted file mode 100644
> index 9dc649912..000000000
> --- a/RedfishClientPkg/PrivateLibrary/RedfishLib/RedfishLib.c
> +++ /dev/null
> @@ -1,1352 +0,0 @@
> -/** @file
> -  Provides a set of utility APIs that allow to create/read/update/delete
> -  (CRUD) Redfish resources and provide basic query.
> -
> -  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> -  (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>
> -  Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
> -
> -  SPDX-License-Identifier: BSD-2-Clause-Patent
> -
> -**/
> -
> -#include "RedfishMisc.h"
> -
> -/**
> -  This function uses REST EX protocol provided in RedfishConfigServiceInfo.
> -  The service enumerator will also handle the authentication flow
> automatically
> -  if HTTP basic auth or Redfish session login is configured to use.
> -
> -  Callers are responsible for freeing the returned service by
> RedfishCleanupService().
> -
> -  @param[in]  RedfishConfigServiceInfo Redfish service information the EFI
> Redfish
> -                                       feature driver communicates with.
> -
> -  @return     New created Redfish Service, or NULL if error happens.
> -
> -**/
> -REDFISH_SERVICE
> -EFIAPI
> -RedfishCreateService (
> -  IN  REDFISH_CONFIG_SERVICE_INFORMATION  *RedfishConfigServiceInfo
> -  )
> -{
> -  REDFISH_SERVICE            RedfishService;
> -  EDKII_REDFISH_AUTH_METHOD  AuthMethod;
> -  CHAR8                      *UserId;
> -  CHAR8                      *Password;
> -  EFI_STATUS                 Status;
> -
> -  RedfishService = NULL;
> -  UserId         = NULL;
> -  Password       = NULL;
> -
> -  //
> -  // Check Input Parameters.
> -  //
> -  if (RedfishConfigServiceInfo == NULL) {
> -    return NULL;
> -  }
> -
> -  //
> -  // Get Authentication Configuration.
> -  //
> -  Status = RedfishGetAuthInfo (&AuthMethod, &UserId, &Password);
> -  if (EFI_ERROR (Status)) {
> -    goto ON_EXIT;
> -  }
> -
> -  //
> -  // Create a redfish service node based on Redfish network host interface.
> -  //
> -  RedfishService = RedfishCreateLibredfishService (
> -                     RedfishConfigServiceInfo,
> -                     AuthMethod,
> -                     UserId,
> -                     Password
> -                     );
> -
> -ON_EXIT:
> -  if (UserId != NULL) {
> -    FreePool (UserId);
> -  }
> -
> -  if (Password != NULL) {
> -    FreePool (Password);
> -  }
> -
> -  return RedfishService;
> -}
> -
> -/**
> -  Free the Service and all its related resources.
> -
> -  @param[in]    RedfishService     The Service to access the Redfish resources.
> -
> -**/
> -VOID
> -EFIAPI
> -RedfishCleanupService (
> -  IN REDFISH_SERVICE  RedfishService
> -  )
> -{
> -  if (RedfishService == NULL) {
> -    return;
> -  }
> -
> -  cleanupServiceEnumerator (RedfishService);
> -}
> -
> -/**
> -  Create REDFISH_PAYLOAD instance in local with JSON represented resource
> value and
> -  the Redfish Service.
> -
> -  The returned REDFISH_PAYLOAD can be used to create or update Redfish
> resource in
> -  server side.
> -
> -  Callers are responsible for freeing the returned payload by
> RedfishCleanupPayload().
> -
> -  @param[in]    Value                 JSON Value of the redfish resource.
> -  @param[in]    RedfishService        The Service to access the Redfish resources.
> -
> -  @return     REDFISH_PAYLOAD instance of the resource, or NULL if error
> happens.
> -
> -**/
> -REDFISH_PAYLOAD
> -EFIAPI
> -RedfishCreatePayload (
> -  IN EDKII_JSON_VALUE  Value,
> -  IN REDFISH_SERVICE   RedfishService
> -  )
> -{
> -  EDKII_JSON_VALUE  CopyValue;
> -
> -  CopyValue = JsonValueClone (Value);
> -  return createRedfishPayload (CopyValue, RedfishService);
> -}
> -
> -/**
> -  Free the RedfishPayload and all its related resources.
> -
> -  @param[in]    Payload        Payload to be freed.
> -
> -**/
> -VOID
> -EFIAPI
> -RedfishCleanupPayload (
> -  IN REDFISH_PAYLOAD  Payload
> -  )
> -{
> -  if (Payload == NULL) {
> -    return;
> -  }
> -
> -  cleanupPayload ((redfishPayload *)Payload);
> -}
> -
> -/**
> -  This function returns the decoded JSON value of a REDFISH_PAYLOAD.
> -
> -  Caller doesn't need to free the returned JSON value because it will be
> released
> -  in corresponding RedfishCleanupPayload() function.
> -
> -  @param[in]    Payload     A REDFISH_PAYLOAD instance.
> -
> -  @return     Decoded JSON value of the payload.
> -
> -**/
> -EDKII_JSON_VALUE
> -EFIAPI
> -RedfishJsonInPayload (
> -  IN REDFISH_PAYLOAD  Payload
> -  )
> -{
> -  if (Payload == NULL) {
> -    return NULL;
> -  }
> -
> -  return ((redfishPayload *)Payload)->json;
> -}
> -
> -/**
> -  This function returns the Redfish service of a REDFISH_PAYLOAD.
> -
> -  Caller doesn't need to free the returned JSON value because it will be
> released
> -  in corresponding RedfishCleanupService() function.
> -
> -  @param[in]    Payload     A REDFISH_PAYLOAD instance.
> -
> -  @return     Redfish service of the payload.
> -
> -**/
> -REDFISH_SERVICE
> -EFIAPI
> -RedfishServiceInPayload (
> -  IN REDFISH_PAYLOAD  Payload
> -  )
> -{
> -  if (Payload == NULL) {
> -    return NULL;
> -  }
> -
> -  return ((redfishPayload *)Payload)->service;
> -}
> -
> -/**
> -  Fill the input RedPath string with system UUID from SMBIOS table or use the
> customized
> -  ID if  FromSmbios == FALSE.
> -
> -  This is a helper function to build a RedPath string which can be used to
> address
> -  a Redfish resource for this computer system. The input PathString must have
> a Systems
> -  note in format of "Systems[UUID=%g]" or "Systems[UUID~%g]" to fill the
> UUID value.
> -
> -  Example:
> -    Use "/v1/Systems[UUID=%g]/Bios" to build a RedPath to address the
> "Bios" resource
> -    for this computer system.
> -
> -  @param[in]    RedPath        RedPath format to be build.
> -  @param[in]    FromSmbios     Get system UUID from SMBIOS as computer
> system instance ID.
> -  @param[in]    IdString       The computer system instance ID.
> -
> -  @return     Full RedPath with system UUID inside, or NULL if error happens.
> -
> -**/
> -CHAR8 *
> -EFIAPI
> -RedfishBuildPathWithSystemUuid (
> -  IN CONST CHAR8  *RedPath,
> -  IN BOOLEAN      FromSmbios,
> -  IN CHAR8        *IdString OPTIONAL
> -  )
> -{
> -  UINTN       BufSize;
> -  CHAR8       *RetRedPath;
> -  EFI_GUID    SystemUuid;
> -  EFI_STATUS  Status;
> -
> -  if (RedPath == NULL) {
> -    return NULL;
> -  }
> -
> -  //
> -  // Find system UUID from SMBIOS table.
> -  //
> -  if (FromSmbios) {
> -    Status = NetLibGetSystemGuid (&SystemUuid);
> -    if (EFI_ERROR (Status)) {
> -      return NULL;
> -    }
> -
> -    // AsciiStrLen ("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx") = 36
> -    BufSize = AsciiStrSize (RedPath) + AsciiStrLen ("XXXXXXXX-XXXX-XXXX-
> XXXX-XXXXXXXXXXXX");
> -  } else {
> -    BufSize = AsciiStrSize (RedPath) + AsciiStrLen (IdString);
> -  }
> -
> -  RetRedPath = AllocateZeroPool (BufSize);
> -  if (RetRedPath == NULL) {
> -    return NULL;
> -  }
> -
> -  if (FromSmbios) {
> -    AsciiSPrint (RetRedPath, BufSize, RedPath, &SystemUuid);
> -  } else {
> -    AsciiSPrint (RetRedPath, BufSize, RedPath, IdString);
> -  }
> -
> -  return RetRedPath;
> -}
> -
> -/**
> -  Get a redfish response addressed by a RedPath string, including HTTP
> StatusCode, Headers
> -  and Payload which record any HTTP response messages.
> -
> -  Callers are responsible for freeing the HTTP StatusCode, Headers and
> Payload returned in
> -  redfish response data.
> -
> -  @param[in]    RedfishService        The Service to access the Redfish resources.
> -  @param[in]    RedPath               RedPath string to address a resource, must
> start
> -                                      from the root node.
> -  @param[out]   RedResponse           Pointer to the Redfish response data.
> -
> -  @retval EFI_SUCCESS             The operation is successful, indicates the HTTP
> StatusCode is not
> -                                  NULL and the value is 2XX. The corresponding redfish
> resource has
> -                                  been returned in Payload within RedResponse.
> -  @retval EFI_INVALID_PARAMETER   RedfishService, RedPath, or
> RedResponse is NULL.
> -  @retval EFI_DEVICE_ERROR        An unexpected system or network error
> occurred. Callers can get
> -                                  more error info from returned HTTP StatusCode, Headers
> and Payload
> -                                  within RedResponse:
> -                                  1. If the returned Payload is NULL, indicates any error
> happen.
> -                                  2. If the returned StatusCode is NULL, indicates any error
> happen.
> -                                  3. If the returned StatusCode is not 2XX, indicates any error
> happen.
> -**/
> -EFI_STATUS
> -EFIAPI
> -RedfishGetByService (
> -  IN     REDFISH_SERVICE   RedfishService,
> -  IN     CONST CHAR8       *RedPath,
> -  OUT    REDFISH_RESPONSE  *RedResponse
> -  )
> -{
> -  if ((RedfishService == NULL) || (RedPath == NULL) || (RedResponse ==
> NULL)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
> -
> -  RedResponse->Payload = (REDFISH_PAYLOAD)getPayloadByPath
> (RedfishService, RedPath, &(RedResponse->StatusCode));
> -
> -  //
> -  // 1. If the returned Payload is NULL, indicates any error happen.
> -  // 2. If the returned StatusCode is NULL, indicates any error happen.
> -  //
> -  if ((RedResponse->Payload == NULL) || (RedResponse->StatusCode ==
> NULL)) {
> -    return EFI_DEVICE_ERROR;
> -  }
> -
> -  //
> -  // 3. If the returned StatusCode is not 2XX, indicates any error happen.
> -  //    NOTE: If there is any error message returned from server, it will be
> returned in
> -  //          Payload within RedResponse.
> -  //
> -  if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
> -      (*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT))
> -  {
> -    return EFI_DEVICE_ERROR;
> -  }
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Get a redfish response addressed by URI, including HTTP StatusCode,
> Headers
> -  and Payload which record any HTTP response messages.
> -
> -  Callers are responsible for freeing the HTTP StatusCode, Headers and
> Payload returned in
> -  redfish response data.
> -
> -  @param[in]    RedfishService    The Service to access the URI resources.
> -  @param[in]    Uri               String to address a resource.
> -  @param[out]   RedResponse       Pointer to the Redfish response data.
> -
> -  @retval EFI_SUCCESS             The operation is successful, indicates the HTTP
> StatusCode is not
> -                                  NULL and the value is 2XX. The corresponding redfish
> resource has
> -                                  been returned in Payload within RedResponse.
> -  @retval EFI_INVALID_PARAMETER   RedfishService, RedPath, or
> RedResponse is NULL.
> -  @retval EFI_DEVICE_ERROR        An unexpected system or network error
> occurred. Callers can get
> -                                  more error info from returned HTTP StatusCode, Headers
> and Payload
> -                                  within RedResponse:
> -                                  1. If the returned Payload is NULL, indicates any error
> happen.
> -                                  2. If the returned StatusCode is NULL, indicates any error
> happen.
> -                                  3. If the returned StatusCode is not 2XX, indicates any error
> happen.
> -**/
> -EFI_STATUS
> -EFIAPI
> -RedfishGetByUri (
> -  IN     REDFISH_SERVICE   RedfishService,
> -  IN     CONST CHAR8       *Uri,
> -  OUT    REDFISH_RESPONSE  *RedResponse
> -  )
> -{
> -  EDKII_JSON_VALUE  JsonValue;
> -
> -  if ((RedfishService == NULL) || (Uri == NULL) || (RedResponse == NULL)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
> -
> -  JsonValue            = getUriFromServiceEx (RedfishService, Uri, &RedResponse-
> >Headers, &RedResponse->HeaderCount, &RedResponse->StatusCode);
> -  RedResponse->Payload = createRedfishPayload (JsonValue, RedfishService);
> -
> -  //
> -  // 1. If the returned Payload is NULL, indicates any error happen.
> -  // 2. If the returned StatusCode is NULL, indicates any error happen.
> -  //
> -  if ((RedResponse->Payload == NULL) || (RedResponse->StatusCode ==
> NULL)) {
> -    return EFI_DEVICE_ERROR;
> -  }
> -
> -  //
> -  // 3. If the returned StatusCode is not 2XX, indicates any error happen.
> -  //    NOTE: If there is any error message returned from server, it will be
> returned in
> -  //          Payload within RedResponse.
> -  //
> -  if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
> -      (*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT))
> -  {
> -    return EFI_DEVICE_ERROR;
> -  }
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Get a redfish response addressed by the input Payload and relative RedPath
> string,
> -  including HTTP StatusCode, Headers and Payload which record any HTTP
> response messages.
> -
> -  Callers are responsible for freeing the HTTP StatusCode, Headers and
> Payload returned in
> -  redfish response data.
> -
> -  @param[in]    Payload           A existing REDFISH_PAYLOAD instance.
> -  @param[in]    RedPath           Relative RedPath string to address a resource
> inside Payload.
> -  @param[out]   RedResponse       Pointer to the Redfish response data.
> -
> -  @retval EFI_SUCCESS             The operation is successful:
> -                                  1. The HTTP StatusCode is NULL and the returned Payload in
> -                                  RedResponse is not NULL, indicates the Redfish resource has
> -                                  been parsed from the input payload directly.
> -                                  2. The HTTP StatusCode is not NULL and the value is 2XX,
> -                                  indicates the corresponding redfish resource has been
> returned
> -                                  in Payload within RedResponse.
> -  @retval EFI_INVALID_PARAMETER   Payload, RedPath, or RedResponse is
> NULL.
> -  @retval EFI_DEVICE_ERROR        An unexpected system or network error
> occurred. Callers can get
> -                                  more error info from returned HTTP StatusCode, Headers
> and Payload
> -                                  within RedResponse:
> -                                  1. If the returned Payload is NULL, indicates any error
> happen.
> -                                  2. If StatusCode is not NULL and the returned value of
> StatusCode
> -                                     is not 2XX, indicates any error happen.
> -**/
> -EFI_STATUS
> -EFIAPI
> -RedfishGetByPayload (
> -  IN     REDFISH_PAYLOAD   Payload,
> -  IN     CONST CHAR8       *RedPath,
> -  OUT    REDFISH_RESPONSE  *RedResponse
> -  )
> -{
> -  if ((Payload == NULL) || (RedPath == NULL) || (RedResponse == NULL)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
> -
> -  RedResponse->Payload = (REDFISH_PAYLOAD)getPayloadForPathString
> (Payload, RedPath, &(RedResponse->StatusCode));
> -
> -  //
> -  // 1. If the returned Payload is NULL, indicates any error happen.
> -  //
> -  if (RedResponse->Payload == NULL) {
> -    return EFI_DEVICE_ERROR;
> -  }
> -
> -  //
> -  // 2. If StatusCode is not NULL and the returned value of StatusCode is not
> 2XX, indicates any
> -  //    error happen.
> -  //    NOTE: If there is any error message returned from server, it will be
> returned in
> -  //          Payload within RedResponse.
> -  //
> -  if ((RedResponse->StatusCode != NULL) && \
> -      ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
> -       (*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT)
> -      ))
> -  {
> -    return EFI_DEVICE_ERROR;
> -  }
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Use HTTP PATCH to perform updates on pre-existing Redfish resource.
> -
> -  This function uses the RedfishService to patch a Redfish resource addressed
> by
> -  Uri (only the relative path is required). Changes to one or more properties
> within
> -  the target resource are represented in the input Content, properties not
> specified
> -  in Content won't be changed by this request. The corresponding redfish
> response will
> -  returned, including HTTP StatusCode, Headers and Payload which record any
> HTTP response
> -  messages.
> -
> -  Callers are responsible for freeing the HTTP StatusCode, Headers and
> Payload returned in
> -  redfish response data.
> -
> -  @param[in]    RedfishService        The Service to access the Redfish resources.
> -  @param[in]    Uri                   Relative path to address the resource.
> -  @param[in]    Content               JSON represented properties to be update.
> -  @param[out]   RedResponse           Pointer to the Redfish response data.
> -
> -  @retval EFI_SUCCESS             The operation is successful, indicates the HTTP
> StatusCode is not
> -                                  NULL and the value is 2XX. The Redfish resource will be
> returned
> -                                  in Payload within RedResponse if server send it back in the
> HTTP
> -                                  response message body.
> -  @retval EFI_INVALID_PARAMETER   RedfishService, Uri, Content, or
> RedResponse is NULL.
> -  @retval EFI_DEVICE_ERROR        An unexpected system or network error
> occurred. Callers can get
> -                                  more error info from returned HTTP StatusCode, Headers
> and Payload
> -                                  within RedResponse:
> -                                  1. If the returned StatusCode is NULL, indicates any error
> happen.
> -                                  2. If the returned StatusCode is not NULL and the value is
> not 2XX,
> -                                     indicates any error happen.
> -**/
> -EFI_STATUS
> -EFIAPI
> -RedfishPatchToUri (
> -  IN     REDFISH_SERVICE   RedfishService,
> -  IN     CONST CHAR8       *Uri,
> -  IN     CONST CHAR8       *Content,
> -  OUT    REDFISH_RESPONSE  *RedResponse
> -  )
> -{
> -  EFI_STATUS        Status;
> -  EDKII_JSON_VALUE  JsonValue;
> -
> -  Status    = EFI_SUCCESS;
> -  JsonValue = NULL;
> -
> -  if ((RedfishService == NULL) || (Uri == NULL) || (Content == NULL) ||
> (RedResponse == NULL)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
> -
> -  JsonValue = (EDKII_JSON_VALUE)patchUriFromServiceEx (
> -                                  RedfishService,
> -                                  Uri,
> -                                  Content,
> -                                  &(RedResponse->Headers),
> -                                  &(RedResponse->HeaderCount),
> -                                  &(RedResponse->StatusCode)
> -                                  );
> -
> -  //
> -  // 1. If the returned StatusCode is NULL, indicates any error happen.
> -  //
> -  if (RedResponse->StatusCode == NULL) {
> -    Status = EFI_DEVICE_ERROR;
> -    goto ON_EXIT;
> -  }
> -
> -  //
> -  // 2. If the returned StatusCode is not NULL and the value is not 2XX,
> indicates any error happen.
> -  //    NOTE: If there is any error message returned from server, it will be
> returned in
> -  //          Payload within RedResponse.
> -  //
> -  if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
> -      (*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT))
> -  {
> -    Status = EFI_DEVICE_ERROR;
> -  }
> -
> -ON_EXIT:
> -  if (JsonValue != NULL) {
> -    RedResponse->Payload = createRedfishPayload (JsonValue, RedfishService);
> -    if (RedResponse->Payload == NULL) {
> -      //
> -      // Ignore the error when create RedfishPayload, just free the JsonValue
> since it's not what
> -      // we care about if the returned StatusCode is 2XX.
> -      //
> -      JsonValueFree (JsonValue);
> -    }
> -  }
> -
> -  return Status;
> -}
> -
> -/**
> -  Use HTTP PATCH to perform updates on target payload. Patch to odata.id in
> Payload directly.
> -
> -  This function uses the Payload to patch the Target. Changes to one or more
> properties
> -  within the target resource are represented in the input Payload, properties
> not specified
> -  in Payload won't be changed by this request. The corresponding redfish
> response will
> -  returned, including HTTP StatusCode, Headers and Payload which record any
> HTTP response
> -  messages.
> -
> -  Callers are responsible for freeing the HTTP StatusCode, Headers and
> Payload returned in
> -  redfish response data.
> -
> -  @param[in]    Target           The target payload to be updated.
> -  @param[in]    Payload          Payload with properties to be changed.
> -  @param[out]   RedResponse      Pointer to the Redfish response data.
> -
> -  @retval EFI_SUCCESS             The operation is successful, indicates the HTTP
> StatusCode is not
> -                                  NULL and the value is 2XX. The Redfish resource will be
> returned
> -                                  in Payload within RedResponse if server send it back in the
> HTTP
> -                                  response message body.
> -  @retval EFI_INVALID_PARAMETER   Target, Payload, or RedResponse is
> NULL.
> -  @retval EFI_DEVICE_ERROR        An unexpected system or network error
> occurred. Callers can get
> -                                  more error info from returned HTTP StatusCode, Headers
> and Payload
> -                                  within RedResponse:
> -                                  1. If the returned StatusCode is NULL, indicates any error
> happen.
> -                                  2. If the returned StatusCode is not NULL and the value is
> not 2XX,
> -                                     indicates any error happen.
> -**/
> -EFI_STATUS
> -EFIAPI
> -RedfishPatchToPayload (
> -  IN     REDFISH_PAYLOAD   Target,
> -  IN     REDFISH_PAYLOAD   Payload,
> -  OUT    REDFISH_RESPONSE  *RedResponse
> -  )
> -{
> -  if ((Target == NULL) || (Payload == NULL) || (RedResponse == NULL)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
> -
> -  RedResponse->Payload = (REDFISH_PAYLOAD)patchPayloadEx (
> -                                            Target,
> -                                            Payload,
> -                                            &RedResponse->Headers,
> -                                            &RedResponse->HeaderCount,
> -                                            &(RedResponse->StatusCode)
> -                                            );
> -
> -  //
> -  // 1. If the returned StatusCode is NULL, indicates any error happen.
> -  //
> -  if (RedResponse->StatusCode == NULL) {
> -    return EFI_DEVICE_ERROR;
> -  }
> -
> -  //
> -  // 2. If the returned StatusCode is not NULL and the value is not 2XX,
> indicates any error happen.
> -  //    NOTE: If there is any error message returned from server, it will be
> returned in
> -  //          Payload within RedResponse.
> -  //
> -  if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
> -      (*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT))
> -  {
> -    return EFI_DEVICE_ERROR;
> -  }
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Use HTTP POST to create new Redfish resource in the Resource Collection.
> -
> -  The POST request should be submitted to the Resource Collection in which
> the new resource
> -  is to belong. The Resource Collection is addressed by URI. The Redfish may
> -  ignore any service controlled properties. The corresponding redfish response
> will returned,
> -  including HTTP StatusCode, Headers and Payload which record any HTTP
> response messages.
> -
> -  Callers are responsible for freeing the HTTP StatusCode, Headers and
> Payload returned in
> -  redfish response data.
> -
> -  @param[in]    RedfishService        The Service to access the Redfish resources.
> -  @param[in]    Uri                   Relative path to address the resource.
> -  @param[in]    Content               JSON represented properties to be update.
> -  @param[in]    ContentSize           Size of the Content to be send to Redfish
> service
> -  @param[in]    ContentType           Type of the Content to be send to Redfish
> service
> -  @param[out]   RedResponse           Pointer to the Redfish response data.
> -
> -  @retval EFI_SUCCESS             The operation is successful, indicates the HTTP
> StatusCode is not
> -                                  NULL and the value is 2XX. The Redfish resource will be
> returned
> -                                  in Payload within RedResponse if server send it back in the
> HTTP
> -                                  response message body.
> -  @retval EFI_INVALID_PARAMETER   RedfishService, Uri, Content, or
> RedResponse is NULL.
> -  @retval EFI_DEVICE_ERROR        An unexpected system or network error
> occurred. Callers can get
> -                                  more error info from returned HTTP StatusCode, Headers
> and Payload
> -                                  within RedResponse:
> -                                  1. If the returned StatusCode is NULL, indicates any error
> happen.
> -                                  2. If the returned StatusCode is not NULL and the value is
> not 2XX,
> -                                     indicates any error happen.
> -**/
> -EFI_STATUS
> -EFIAPI
> -RedfishPostToUri (
> -  IN     REDFISH_SERVICE   RedfishService,
> -  IN     CONST CHAR8       *Uri,
> -  IN     CONST CHAR8       *Content,
> -  IN     UINTN             ContentSize OPTIONAL,
> -  IN     CONST CHAR8       *ContentType OPTIONAL,
> -  OUT    REDFISH_RESPONSE  *RedResponse
> -  )
> -{
> -  EFI_STATUS        Status;
> -  EDKII_JSON_VALUE  JsonValue;
> -
> -  Status    = EFI_SUCCESS;
> -  JsonValue = NULL;
> -
> -  if ((RedfishService == NULL) || (Uri == NULL) || (Content == NULL) ||
> (RedResponse == NULL)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
> -
> -  JsonValue = (EDKII_JSON_VALUE)postUriFromServiceEx (
> -                                  RedfishService,
> -                                  Uri,
> -                                  Content,
> -                                  ContentSize,
> -                                  ContentType,
> -                                  &(RedResponse->Headers),
> -                                  &(RedResponse->HeaderCount),
> -                                  &(RedResponse->StatusCode)
> -                                  );
> -
> -  //
> -  // 1. If the returned StatusCode is NULL, indicates any error happen.
> -  //
> -  if (RedResponse->StatusCode == NULL) {
> -    Status = EFI_DEVICE_ERROR;
> -    goto ON_EXIT;
> -  }
> -
> -  //
> -  // 2. If the returned StatusCode is not NULL and the value is not 2XX,
> indicates any error happen.
> -  //    NOTE: If there is any error message returned from server, it will be
> returned in
> -  //          Payload within RedResponse.
> -  //
> -  if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
> -      (*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT))
> -  {
> -    Status = EFI_DEVICE_ERROR;
> -  }
> -
> -ON_EXIT:
> -  if (JsonValue != NULL) {
> -    RedResponse->Payload = createRedfishPayload (JsonValue, RedfishService);
> -    if (RedResponse->Payload == NULL) {
> -      //
> -      // Ignore the error when create RedfishPayload, just free the JsonValue
> since it's not what
> -      // we care about if the returned StatusCode is 2XX.
> -      //
> -      JsonValueFree (JsonValue);
> -    }
> -  }
> -
> -  return Status;
> -}
> -
> -/**
> -  Use HTTP POST to create a new resource in target payload.
> -
> -  The POST request should be submitted to the Resource Collection in which
> the new resource
> -  is to belong. The Resource Collection is addressed by Target payload. The
> Redfish may
> -  ignore any service controlled properties. The corresponding redfish response
> will returned,
> -  including HTTP StatusCode, Headers and Payload which record any HTTP
> response messages.
> -
> -  Callers are responsible for freeing the HTTP StatusCode, Headers and
> Payload returned in
> -  redfish response data.
> -
> -  @param[in]    Target          Target payload of the Resource Collection.
> -  @param[in]    Payload         The new resource to be created.
> -  @param[out]   RedResponse     Pointer to the Redfish response data.
> -
> -  @retval EFI_SUCCESS             The operation is successful, indicates the HTTP
> StatusCode is not
> -                                  NULL and the value is 2XX. The Redfish resource will be
> returned
> -                                  in Payload within RedResponse if server send it back in the
> HTTP
> -                                  response message body.
> -  @retval EFI_INVALID_PARAMETER   Target, Payload, or RedResponse is
> NULL.
> -  @retval EFI_DEVICE_ERROR        An unexpected system or network error
> occurred. Callers can get
> -                                  more error info from returned HTTP StatusCode, Headers
> and Payload
> -                                  within RedResponse:
> -                                  1. If the returned StatusCode is NULL, indicates any error
> happen.
> -                                  2. If the returned StatusCode is not NULL and the value is
> not 2XX,
> -                                     indicates any error happen.
> -**/
> -EFI_STATUS
> -EFIAPI
> -RedfishPostToPayload (
> -  IN     REDFISH_PAYLOAD   Target,
> -  IN     REDFISH_PAYLOAD   Payload,
> -  OUT    REDFISH_RESPONSE  *RedResponse
> -  )
> -{
> -  if ((Target == NULL) || (Payload == NULL) || (RedResponse == NULL)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
> -
> -  RedResponse->Payload = (REDFISH_PAYLOAD)postPayloadEx (
> -                                            Target,
> -                                            Payload,
> -                                            &RedResponse->Headers,
> -                                            &RedResponse->HeaderCount,
> -                                            &(RedResponse->StatusCode)
> -                                            );
> -
> -  //
> -  // 1. If the returned StatusCode is NULL, indicates any error happen.
> -  //
> -  if (RedResponse->StatusCode == NULL) {
> -    return EFI_DEVICE_ERROR;
> -  }
> -
> -  //
> -  // 2. If the returned StatusCode is not NULL and the value is not 2XX,
> indicates any error happen.
> -  //    NOTE: If there is any error message returned from server, it will be
> returned in
> -  //          Payload within RedResponse.
> -  //
> -  if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
> -      (*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT))
> -  {
> -    return EFI_DEVICE_ERROR;
> -  }
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Use HTTP DELETE to remove a resource.
> -
> -  This function uses the RedfishService to remove a Redfish resource which is
> addressed
> -  by input Uri (only the relative path is required). The corresponding redfish
> response will
> -  returned, including HTTP StatusCode, Headers and Payload which record any
> HTTP response
> -  messages.
> -
> -  Callers are responsible for freeing the HTTP StatusCode, Headers and
> Payload returned in
> -  redfish response data.
> -
> -  @param[in]    RedfishService        The Service to access the Redfish resources.
> -  @param[in]    Uri                   Relative path to address the resource.
> -  @param[out]   RedResponse           Pointer to the Redfish response data.
> -
> -  @retval EFI_SUCCESS             The operation is successful, indicates the HTTP
> StatusCode is not
> -                                  NULL and the value is 2XX, the Redfish resource has been
> removed.
> -                                  If there is any message returned from server, it will be
> returned
> -                                  in Payload within RedResponse.
> -  @retval EFI_INVALID_PARAMETER   RedfishService, Uri, or RedResponse is
> NULL.
> -  @retval EFI_DEVICE_ERROR        An unexpected system or network error
> occurred. Callers can get
> -                                  more error info from returned HTTP StatusCode, Headers
> and Payload
> -                                  within RedResponse:
> -                                  1. If the returned StatusCode is NULL, indicates any error
> happen.
> -                                  2. If the returned StatusCode is not NULL and the value is
> not 2XX,
> -                                     indicates any error happen.
> -**/
> -EFI_STATUS
> -EFIAPI
> -RedfishDeleteByUri (
> -  IN     REDFISH_SERVICE   RedfishService,
> -  IN     CONST CHAR8       *Uri,
> -  OUT    REDFISH_RESPONSE  *RedResponse
> -  )
> -{
> -  EFI_STATUS        Status;
> -  EDKII_JSON_VALUE  JsonValue;
> -
> -  Status    = EFI_SUCCESS;
> -  JsonValue = NULL;
> -
> -  if ((RedfishService == NULL) || (Uri == NULL) || (RedResponse == NULL)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
> -
> -  JsonValue = (EDKII_JSON_VALUE)deleteUriFromService (
> -                                  RedfishService,
> -                                  Uri,
> -                                  &(RedResponse->StatusCode)
> -                                  );
> -
> -  //
> -  // 1. If the returned StatusCode is NULL, indicates any error happen.
> -  //
> -  if (RedResponse->StatusCode == NULL) {
> -    Status = EFI_DEVICE_ERROR;
> -    goto ON_EXIT;
> -  }
> -
> -  //
> -  // 2. If the returned StatusCode is not NULL and the value is not 2XX,
> indicates any error happen.
> -  //    NOTE: If there is any error message returned from server, it will be
> returned in
> -  //          Payload within RedResponse.
> -  //
> -  if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
> -      (*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT))
> -  {
> -    Status = EFI_DEVICE_ERROR;
> -  }
> -
> -ON_EXIT:
> -  if (JsonValue != NULL) {
> -    RedResponse->Payload = createRedfishPayload (JsonValue, RedfishService);
> -    if (RedResponse->Payload == NULL) {
> -      //
> -      // Ignore the error when create RedfishPayload, just free the JsonValue
> since it's not what
> -      // we care about if the returned StatusCode is 2XX.
> -      //
> -      JsonValueFree (JsonValue);
> -    }
> -  }
> -
> -  return Status;
> -}
> -
> -/**
> -  Use HTTP DELETE to remove a resource.
> -
> -  This function uses the RedfishService to remove a Redfish resource which is
> addressed
> -  by input Uri (only the relative path is required). The corresponding redfish
> response will
> -  returned, including HTTP StatusCode, Headers and Payload which record any
> HTTP response
> -  messages.
> -
> -  Callers are responsible for freeing the HTTP StatusCode, Headers and
> Payload returned in
> -  redfish response data.
> -
> -  @param[in]    RedfishService        The Service to access the Redfish resources.
> -  @param[in]    Uri                   Relative path to address the resource.
> -  @param[in]    Content               JSON represented properties to be deleted.
> -  @param[out]   RedResponse           Pointer to the Redfish response data.
> -
> -  @retval EFI_SUCCESS             The operation is successful, indicates the HTTP
> StatusCode is not
> -                                  NULL and the value is 2XX, the Redfish resource has been
> removed.
> -                                  If there is any message returned from server, it will be
> returned
> -                                  in Payload within RedResponse.
> -  @retval EFI_INVALID_PARAMETER   RedfishService, Uri, or RedResponse is
> NULL.
> -  @retval EFI_DEVICE_ERROR        An unexpected system or network error
> occurred. Callers can get
> -                                  more error info from returned HTTP StatusCode, Headers
> and Payload
> -                                  within RedResponse:
> -                                  1. If the returned StatusCode is NULL, indicates any error
> happen.
> -                                  2. If the returned StatusCode is not NULL and the value is
> not 2XX,
> -                                     indicates any error happen.
> -**/
> -EFI_STATUS
> -EFIAPI
> -RedfishDeleteByUriEx (
> -  IN     REDFISH_SERVICE   RedfishService,
> -  IN     CONST CHAR8       *Uri,
> -  IN     CONST CHAR8       *Content,
> -  OUT    REDFISH_RESPONSE  *RedResponse
> -  )
> -{
> -  EFI_STATUS        Status;
> -  EDKII_JSON_VALUE  JsonValue;
> -
> -  Status    = EFI_SUCCESS;
> -  JsonValue = NULL;
> -
> -  if ((RedfishService == NULL) || (Content == NULL) || (Uri == NULL) ||
> (RedResponse == NULL)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
> -
> -  JsonValue = (EDKII_JSON_VALUE)deleteUriFromServiceEx (
> -                                  RedfishService,
> -                                  Uri,
> -                                  Content,
> -                                  &(RedResponse->StatusCode)
> -                                  );
> -
> -  //
> -  // 1. If the returned StatusCode is NULL, indicates any error happen.
> -  //
> -  if (RedResponse->StatusCode == NULL) {
> -    Status = EFI_DEVICE_ERROR;
> -    goto ON_EXIT;
> -  }
> -
> -  //
> -  // 2. If the returned StatusCode is not NULL and the value is not 2XX,
> indicates any error happen.
> -  //    NOTE: If there is any error message returned from server, it will be
> returned in
> -  //          Payload within RedResponse.
> -  //
> -  if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
> -      (*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT))
> -  {
> -    Status = EFI_DEVICE_ERROR;
> -  }
> -
> -ON_EXIT:
> -  if (JsonValue != NULL) {
> -    RedResponse->Payload = createRedfishPayload (JsonValue, RedfishService);
> -    if (RedResponse->Payload == NULL) {
> -      //
> -      // Ignore the error when create RedfishPayload, just free the JsonValue
> since it's not what
> -      // we care about if the returned StatusCode is 2XX.
> -      //
> -      JsonValueFree (JsonValue);
> -    }
> -  }
> -
> -  return Status;
> -}
> -
> -/**
> -  Dump text in fractions.
> -
> -  @param[in]  String   ASCII string to dump.
> -
> -**/
> -VOID
> -RedfishDumpJsonStringFractions (
> -  IN CHAR8  *String
> -  )
> -{
> -  CHAR8  *NextFraction;
> -  UINTN  StringFractionSize;
> -  UINTN  StrLen;
> -  UINTN  Count;
> -  CHAR8  BackupChar;
> -
> -  StringFractionSize = 200;
> -  if (String == NULL) {
> -    return;
> -  }
> -
> -  DEBUG ((DEBUG_MANAGEABILITY, "JSON text:\n"));
> -  NextFraction = String;
> -  StrLen       = AsciiStrLen (String);
> -  if (StrLen == 0) {
> -    return;
> -  }
> -
> -  for (Count = 0; Count < (StrLen / StringFractionSize); Count++) {
> -    BackupChar                           = *(NextFraction + StringFractionSize);
> -    *(NextFraction + StringFractionSize) = 0;
> -    DEBUG ((DEBUG_MANAGEABILITY, "%a", NextFraction));
> -    *(NextFraction + StringFractionSize) = BackupChar;
> -    NextFraction                        += StringFractionSize;
> -  }
> -
> -  if ((StrLen % StringFractionSize) != 0) {
> -    DEBUG ((DEBUG_MANAGEABILITY, "%a\n\n", NextFraction));
> -  }
> -}
> -
> -/**
> -  Dump text in JSON value.
> -
> -  @param[in]  JsonValue       The Redfish JSON value to dump.
> -
> -**/
> -VOID
> -RedfishDumpJson (
> -  IN EDKII_JSON_VALUE  JsonValue
> -  )
> -{
> -  CHAR8  *String;
> -
> -  String = JsonDumpString (JsonValue, 0);
> -  if (String == NULL) {
> -    return;
> -  }
> -
> -  RedfishDumpJsonStringFractions (String);
> -  FreePool (String);
> -}
> -
> -/**
> -  Extract the JSON text content from REDFISH_PAYLOAD and dump to debug
> console.
> -
> -  @param[in]  Payload       The Redfish payload to dump.
> -
> -**/
> -VOID
> -RedfishDumpPayload (
> -  IN REDFISH_PAYLOAD  Payload
> -  )
> -{
> -  EDKII_JSON_VALUE  JsonValue;
> -  CHAR8             *String;
> -
> -  JsonValue = NULL;
> -  String    = NULL;
> -
> -  if (Payload == NULL) {
> -    return;
> -  }
> -
> -  JsonValue = RedfishJsonInPayload (Payload);
> -  if (JsonValue == NULL) {
> -    return;
> -  }
> -
> -  String = JsonDumpString (JsonValue, 0);
> -  if (String == NULL) {
> -    return;
> -  }
> -
> -  RedfishDumpJsonStringFractions (String);
> -  FreePool (String);
> -}
> -
> -/**
> -  This function will cleanup the HTTP header and Redfish payload resources.
> -
> -  @param[in]  StatusCode        The status code in HTTP response message.
> -  @param[in]  HeaderCount       Number of HTTP header structures in Headers
> list.
> -  @param[in]  Headers           Array containing list of HTTP headers.
> -  @param[in]  Payload           The Redfish payload to dump.
> -
> -**/
> -VOID
> -RedfishFreeResponse (
> -  IN EFI_HTTP_STATUS_CODE  *StatusCode,
> -  IN UINTN                 HeaderCount,
> -  IN EFI_HTTP_HEADER       *Headers,
> -  IN REDFISH_PAYLOAD       Payload
> -  )
> -{
> -  if (StatusCode != NULL) {
> -    FreePool (StatusCode);
> -    StatusCode = NULL;
> -  }
> -
> -  if ((HeaderCount != 0) && (Headers != NULL)) {
> -    HttpFreeHeaderFields (Headers, HeaderCount);
> -    Headers = NULL;
> -  }
> -
> -  if (Payload != NULL) {
> -    RedfishCleanupPayload (Payload);
> -    Payload = NULL;
> -  }
> -}
> -
> -/**
> -  Check if the "@odata.type" in Payload is valid or not.
> -
> -  @param[in]  Payload                  The Redfish payload to be checked.
> -  @param[in]  OdataTypeName            OdataType will be retrieved from
> mapping list.
> -  @param[in]  OdataTypeMappingList     The list of OdataType.
> -  @param[in]  OdataTypeMappingListSize The number of mapping list
> -
> -  @return TRUE if the "@odata.type" in Payload is valid, otherwise FALSE.
> -
> -**/
> -BOOLEAN
> -RedfishIsValidOdataType (
> -  IN REDFISH_PAYLOAD             Payload,
> -  IN CONST CHAR8                 *OdataTypeName,
> -  IN REDFISH_ODATA_TYPE_MAPPING  *OdataTypeMappingList,
> -  IN UINTN                       OdataTypeMappingListSize
> -  )
> -{
> -  UINTN             Index;
> -  EDKII_JSON_VALUE  OdataType;
> -  EDKII_JSON_VALUE  JsonValue;
> -
> -  if ((Payload == NULL) || (OdataTypeName == NULL)) {
> -    return FALSE;
> -  }
> -
> -  JsonValue = RedfishJsonInPayload (Payload);
> -  if (!JsonValueIsObject (JsonValue)) {
> -    return FALSE;
> -  }
> -
> -  OdataType = JsonObjectGetValue (JsonValueGetObject (JsonValue),
> "@odata.type");
> -  if (!JsonValueIsString (OdataType) || (JsonValueGetAsciiString (OdataType)
> == NULL)) {
> -    return FALSE;
> -  }
> -
> -  for (Index = 0; Index < OdataTypeMappingListSize; Index++) {
> -    if ((AsciiStrCmp (OdataTypeMappingList[Index].OdataTypeName,
> OdataTypeName) == 0) &&
> -        (AsciiStrCmp (OdataTypeMappingList[Index].OdataType,
> JsonValueGetAsciiString (OdataType)) == 0))
> -    {
> -      return TRUE;
> -    }
> -  }
> -
> -  DEBUG ((DEBUG_MANAGEABILITY, "%a: This Odata type is not in the list.\n",
> __func__));
> -  return FALSE;
> -}
> -
> -/**
> -  Check if the payload is collection
> -
> -  @param[in]  Payload                  The Redfish payload to be checked.
> -
> -  @return TRUE if the payload is  collection.
> -
> -**/
> -BOOLEAN
> -RedfishIsPayloadCollection (
> -  IN REDFISH_PAYLOAD  Payload
> -  )
> -{
> -  return isPayloadCollection (Payload);
> -}
> -
> -/**
> -  Get collection size.
> -
> -  @param[in]  Payload         The Redfish collection payload
> -  @param[in]  CollectionSize  Size of this collection
> -
> -  @return EFI_SUCCESS              Collection size is returned in CollectionSize
> -  @return EFI_INVALID_PARAMETER    The payload is not a collection.
> -**/
> -EFI_STATUS
> -RedfishGetCollectionSize (
> -  IN REDFISH_PAYLOAD  Payload,
> -  IN UINTN            *CollectionSize
> -  )
> -{
> -  if ((Payload == NULL) || (CollectionSize == NULL)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  if (!RedfishIsPayloadCollection (Payload)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  *CollectionSize = (UINTN)getCollectionSize (Payload);
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Get Redfish payload of collection member
> -
> -  @param[in]  Payload    The Redfish collection payload
> -  @param[in]  Index      Index of collection member
> -
> -  @return NULL           Fail to get collection member.
> -  @return Non NULL       Payload is returned.
> -**/
> -REDFISH_PAYLOAD
> -RedfishGetPayloadByIndex (
> -  IN REDFISH_PAYLOAD  Payload,
> -  IN UINTN            Index
> -  )
> -{
> -  REDFISH_RESPONSE  RedfishResponse;
> -  REDFISH_PAYLOAD   PayloadReturn;
> -
> -  PayloadReturn = (VOID *)getPayloadByIndex (Payload, Index,
> &RedfishResponse.StatusCode);
> -  if ((PayloadReturn == NULL) ||
> -      ((*(RedfishResponse.StatusCode) < HTTP_STATUS_200_OK) &&
> (*(RedfishResponse.StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT)))
> -  {
> -    return NULL;
> -  }
> -
> -  return PayloadReturn;
> -}
> -
> -/**
> -  Check and return Redfish resource of the given Redpath.
> -
> -  @param[in]  RedfishService  Pointer to REDFISH_SERVICE
> -  @param[in]  Redpath         Redpath of the resource.
> -  @param[in]  Response        Optional return the resource.
> -
> -  @return EFI_STATUS
> -**/
> -EFI_STATUS
> -RedfishCheckIfRedpathExist (
> -  IN REDFISH_SERVICE   RedfishService,
> -  IN CHAR8             *Redpath,
> -  IN REDFISH_RESPONSE  *Response OPTIONAL
> -  )
> -{
> -  EFI_STATUS        Status;
> -  REDFISH_RESPONSE  TempResponse;
> -
> -  if (Redpath == NULL) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  Status = RedfishGetByService (RedfishService, Redpath, &TempResponse);
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -
> -  if (Response == NULL) {
> -    RedfishFreeResponse (
> -      TempResponse.StatusCode,
> -      TempResponse.HeaderCount,
> -      TempResponse.Headers,
> -      TempResponse.Payload
> -      );
> -  } else {
> -    CopyMem ((VOID *)Response, (VOID *)&TempResponse, sizeof
> (REDFISH_RESPONSE));
> -  }
> -
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Use HTTP PUT to create new Redfish resource in the Resource Collection.
> -
> -  This function uses the RedfishService to put a Redfish resource addressed by
> -  Uri (only the relative path is required). Changes to one or more properties
> within
> -  the target resource are represented in the input Content, properties not
> specified
> -  in Content won't be changed by this request. The corresponding redfish
> response will
> -  returned, including HTTP StatusCode, Headers and Payload which record any
> HTTP response
> -  messages.
> -
> -  Callers are responsible for freeing the HTTP StatusCode, Headers and
> Payload returned in
> -  redfish response data.
> -
> -  @param[in]    RedfishService        The Service to access the Redfish resources.
> -  @param[in]    Uri                   Relative path to address the resource.
> -  @param[in]    Content               JSON represented properties to be update.
> -  @param[in]    ContentSize           Size of the Content to be send to Redfish
> service
> -  @param[in]    ContentType           Type of the Content to be send to Redfish
> service
> -  @param[out]   RedResponse           Pointer to the Redfish response data.
> -
> -  @retval EFI_SUCCESS             The operation is successful, indicates the HTTP
> StatusCode is not
> -                                  NULL and the value is 2XX. The Redfish resource will be
> returned
> -                                  in Payload within RedResponse if server send it back in the
> HTTP
> -                                  response message body.
> -  @retval EFI_INVALID_PARAMETER   RedfishService, Uri, Content, or
> RedResponse is NULL.
> -  @retval EFI_DEVICE_ERROR        An unexpected system or network error
> occurred. Callers can get
> -                                  more error info from returned HTTP StatusCode, Headers
> and Payload
> -                                  within RedResponse:
> -                                  1. If the returned StatusCode is NULL, indicates any error
> happen.
> -                                  2. If the returned StatusCode is not NULL and the value is
> not 2XX,
> -                                     indicates any error happen.
> -**/
> -EFI_STATUS
> -EFIAPI
> -RedfishPutToUri (
> -  IN     REDFISH_SERVICE   RedfishService,
> -  IN     CONST CHAR8       *Uri,
> -  IN     CONST CHAR8       *Content,
> -  IN     UINTN             ContentSize OPTIONAL,
> -  IN     CONST CHAR8       *ContentType OPTIONAL,
> -  OUT    REDFISH_RESPONSE  *RedResponse
> -  )
> -{
> -  EFI_STATUS        Status;
> -  EDKII_JSON_VALUE  JsonValue;
> -
> -  Status    = EFI_SUCCESS;
> -  JsonValue = NULL;
> -
> -  if ((RedfishService == NULL) || (Uri == NULL) || (Content == NULL) ||
> (RedResponse == NULL)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
> -
> -  JsonValue = (EDKII_JSON_VALUE)putUriFromServiceEx (
> -                                  RedfishService,
> -                                  Uri,
> -                                  Content,
> -                                  ContentSize,
> -                                  ContentType,
> -                                  &(RedResponse->Headers),
> -                                  &(RedResponse->HeaderCount),
> -                                  &(RedResponse->StatusCode)
> -                                  );
> -
> -  //
> -  // 1. If the returned StatusCode is NULL, indicates any error happen.
> -  //
> -  if (RedResponse->StatusCode == NULL) {
> -    Status = EFI_DEVICE_ERROR;
> -    goto ON_EXIT;
> -  }
> -
> -  //
> -  // 2. If the returned StatusCode is not NULL and the value is not 2XX,
> indicates any error happen.
> -  //    NOTE: If there is any error message returned from server, it will be
> returned in
> -  //          Payload within RedResponse.
> -  //
> -  if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
> -      (*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT))
> -  {
> -    Status = EFI_DEVICE_ERROR;
> -  }
> -
> -ON_EXIT:
> -  if (JsonValue != NULL) {
> -    RedResponse->Payload = createRedfishPayload (JsonValue, RedfishService);
> -    if (RedResponse->Payload == NULL) {
> -      //
> -      // Ignore the error when create RedfishPayload, just free the JsonValue
> since it's not what
> -      // we care about if the returned StatusCode is 2XX.
> -      //
> -      JsonValueFree (JsonValue);
> -    }
> -  }
> -
> -  return Status;
> -}
> diff --git a/RedfishClientPkg/PrivateLibrary/RedfishLib/RedfishMisc.c
> b/RedfishClientPkg/PrivateLibrary/RedfishLib/RedfishMisc.c
> deleted file mode 100644
> index b6e9a1117..000000000
> --- a/RedfishClientPkg/PrivateLibrary/RedfishLib/RedfishMisc.c
> +++ /dev/null
> @@ -1,207 +0,0 @@
> -/** @file
> -  Internal Functions for RedfishLib.
> -
> -  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> -  (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
> -  Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
> -
> -  SPDX-License-Identifier: BSD-2-Clause-Patent
> -
> -**/
> -
> -#include "RedfishMisc.h"
> -
> -EDKII_REDFISH_CREDENTIAL_PROTOCOL  *mCredentialProtocol = NULL;
> -
> -/**
> -  This function returns the string of Redfish service version.
> -
> -  @param[in]   RedfishService Redfish service instance.
> -  @param[out]  ServiceVersionStr   Redfish service string.
> -
> -  @return     EFI_STATUS
> -
> -**/
> -EFI_STATUS
> -RedfishGetServiceVersion (
> -  IN  REDFISH_SERVICE  RedfishService,
> -  OUT CHAR8            **ServiceVersionStr
> -  )
> -{
> -  redfishService  *Redfish;
> -  CHAR8           **KeysArray;
> -  UINTN           KeysNum;
> -
> -  if ((RedfishService == NULL) || (ServiceVersionStr == NULL)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  Redfish = (redfishService *)RedfishService;
> -  if (Redfish->versions == NULL) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  KeysArray = JsonObjectGetKeys (Redfish->versions, &KeysNum);
> -  if ((KeysNum == 0) || (KeysArray  == NULL)) {
> -    return EFI_NOT_FOUND;
> -  }
> -
> -  *ServiceVersionStr = *KeysArray;
> -  return EFI_SUCCESS;
> -}
> -
> -/**
> -  Creates a REDFISH_SERVICE which can be later used to access the Redfish
> resources.
> -
> -  This function will configure REST EX child according to parameters described
> in
> -  Redfish network host interface in SMBIOS type 42 record. The service
> enumerator will also
> -  handle the authentication flow automatically if HTTP basic auth or Redfish
> session
> -  login is configured to use.
> -
> -  @param[in]  RedfishConfigServiceInfo Redfish service information the EFI
> Redfish
> -                                       feature driver communicates with.
> -  @param[in]  AuthMethod   None, HTTP basic auth, or Redfish session login.
> -  @param[in]  UserId       User Name used for authentication.
> -  @param[in]  Password     Password used for authentication.
> -
> -  @return     New created Redfish service, or NULL if error happens.
> -
> -**/
> -REDFISH_SERVICE
> -RedfishCreateLibredfishService (
> -  IN  REDFISH_CONFIG_SERVICE_INFORMATION  *RedfishConfigServiceInfo,
> -  IN  EDKII_REDFISH_AUTH_METHOD           AuthMethod,
> -  IN  CHAR8                               *UserId,
> -  IN  CHAR8                               *Password
> -  )
> -{
> -  UINTN                     Flags;
> -  enumeratorAuthentication  Auth;
> -  redfishService            *Redfish;
> -
> -  Redfish = NULL;
> -
> -  ZeroMem (&Auth, sizeof (Auth));
> -  if (AuthMethod == AuthMethodHttpBasic) {
> -    Auth.authType = REDFISH_AUTH_BASIC;
> -  } else if (AuthMethod == AuthMethodRedfishSession) {
> -    Auth.authType = REDFISH_AUTH_SESSION;
> -  }
> -
> -  Auth.authCodes.userPass.username = UserId;
> -  Auth.authCodes.userPass.password = Password;
> -
> -  Flags = REDFISH_FLAG_SERVICE_NO_VERSION_DOC;
> -
> -  if (AuthMethod != AuthMethodNone) {
> -    Redfish = createServiceEnumerator (RedfishConfigServiceInfo, NULL,
> &Auth, (unsigned int)Flags);
> -  } else {
> -    Redfish = createServiceEnumerator (RedfishConfigServiceInfo, NULL, NULL,
> (unsigned int)Flags);
> -  }
> -
> -  //
> -  // Zero the Password after use.
> -  //
> -  if (Password != NULL) {
> -    ZeroMem (Password, AsciiStrLen (Password));
> -  }
> -
> -  return (REDFISH_SERVICE)Redfish;
> -}
> -
> -/**
> -  Retrieve platform's Redfish authentication information.
> -
> -  This functions returns the Redfish authentication method together with the
> user
> -  Id and password.
> -  For AuthMethodNone, UserId and Password will point to NULL which
> means authentication
> -  is not required to access the Redfish service.
> -  For AuthMethodHttpBasic, the UserId and Password could be used for
> -  HTTP header authentication as defined by RFC7235. For
> AuthMethodRedfishSession,
> -  the UserId and Password could be used for Redfish session login as defined
> by
> -  Redfish API specification (DSP0266).
> -
> -  Callers are responsible for freeing the returned string storage pointed by
> UserId
> -  and Password.
> -
> -  @param[out]  AuthMethod          Type of Redfish authentication method.
> -  @param[out]  UserId              The pointer to store the returned UserId string.
> -  @param[out]  Password            The pointer to store the returned Password
> string.
> -
> -  @retval EFI_SUCCESS              Get the authentication information successfully.
> -  @retval EFI_INVALID_PARAMETER    AuthMethod or UserId or Password is
> NULL.
> -  @retval EFI_UNSUPPORTED          Unsupported authentication method is
> found.
> -**/
> -EFI_STATUS
> -RedfishGetAuthInfo (
> -  OUT  EDKII_REDFISH_AUTH_METHOD  *AuthMethod,
> -  OUT  CHAR8                      **UserId,
> -  OUT  CHAR8                      **Password
> -  )
> -{
> -  EFI_STATUS  Status;
> -
> -  if ((AuthMethod == NULL) || (UserId == NULL) || (Password == NULL)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  //
> -  // Locate Redfish Credential Protocol.
> -  //
> -  if (mCredentialProtocol == NULL) {
> -    Status = gBS->LocateProtocol (&gEdkIIRedfishCredentialProtocolGuid,
> NULL, (VOID **)&mCredentialProtocol);
> -    if (EFI_ERROR (Status)) {
> -      return EFI_UNSUPPORTED;
> -    }
> -  }
> -
> -  ASSERT (mCredentialProtocol != NULL);
> -
> -  Status = mCredentialProtocol->GetAuthInfo (mCredentialProtocol,
> AuthMethod, UserId, Password);
> -  if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "RedfishGetAuthInfo: failed to retrieve Redfish
> credential - %r\n", Status));
> -    return Status;
> -  }
> -
> -  return Status;
> -}
> -
> -/**
> -  This function returns the string of Redfish service version.
> -
> -  @param[in]   ServiceVersionStr The string of Redfish service version.
> -  @param[in]   Url               The URL to build Redpath with ID.
> -                                 Start with "/", for example "/Registries"
> -  @param[in]   Id                ID string
> -  @param[out]  Redpath           Pointer to retrieved Redpath, caller has to free
> -                                 the memory allocated for this string.
> -  @return     EFI_STATUS
> -
> -**/
> -EFI_STATUS
> -RedfishBuildRedpathUseId (
> -  IN  CHAR8  *ServiceVersionStr,
> -  IN  CHAR8  *Url,
> -  IN  CHAR8  *Id,
> -  OUT CHAR8  **Redpath
> -  )
> -{
> -  UINTN  RedpathSize;
> -
> -  if ((Redpath == NULL) || (ServiceVersionStr == NULL) || (Url == NULL) || (Id
> == NULL)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  RedpathSize = AsciiStrLen ("/") +
> -                AsciiStrLen (ServiceVersionStr) +
> -                AsciiStrLen (Url) +
> -                AsciiStrLen ("[Id=]") +
> -                AsciiStrLen (Id) + 1;
> -  *Redpath = AllocatePool (RedpathSize);
> -  if (*Redpath == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  AsciiSPrint (*Redpath, RedpathSize, "/%a%a[Id=%a]", ServiceVersionStr, Url,
> Id);
> -  return EFI_SUCCESS;
> -}
> diff --git
> a/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/payload.c
> b/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/payload.c
> deleted file mode 100644
> index d845d51fe..000000000
> --- a/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/payload.c
> +++ /dev/null
> @@ -1,918 +0,0 @@
> -/** @file
> -  This file is cloned from DMTF libredfish library tag v1.0.0 and maintained
> -  by EDKII.
> -
> -//----------------------------------------------------------------------------
> -// Copyright Notice:
> -// Copyright 2017 Distributed Management Task Force, Inc. All rights
> reserved.
> -// License: BSD 3-Clause License. For full text see link:
> https://github.com/DMTF/libredfish/LICENSE.md
> -//----------------------------------------------------------------------------
> -
> -  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> -  (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>
> -  Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
> -
> -  SPDX-License-Identifier: BSD-2-Clause-Patent
> -
> -**/
> -#include <redfishPayload.h>
> -
> -static redfishPayload *
> -getOpResult (
> -  redfishPayload        *payload,
> -  const char            *propName,
> -  const char            *op,
> -  const char            *value,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -static redfishPayload *
> -collectionEvalOp (
> -  redfishPayload        *payload,
> -  const char            *propName,
> -  const char            *op,
> -  const char            *value,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -static redfishPayload *
> -arrayEvalOp (
> -  redfishPayload        *payload,
> -  const char            *propName,
> -  const char            *op,
> -  const char            *value,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  );
> -
> -static redfishPayload *
> -createCollection (
> -  redfishService  *service,
> -  size_t          count,
> -  redfishPayload  **payloads
> -  );
> -
> -static json_t *
> -json_object_get_by_index (
> -  json_t  *json,
> -  size_t  index
> -  );
> -
> -bool
> -isPayloadCollection (
> -  redfishPayload  *payload
> -  )
> -{
> -  json_t  *members;
> -  json_t  *count;
> -
> -  if (!payload || !json_is_object (payload->json)) {
> -    return false;
> -  }
> -
> -  members = json_object_get (payload->json, "Members");
> -  count   = json_object_get (payload->json, "Members@odata.count");
> -  return ((members != NULL) && (count != NULL));
> -}
> -
> -size_t
> -getCollectionSize (
> -  redfishPayload  *payload
> -  )
> -{
> -  json_t  *members;
> -  json_t  *count;
> -
> -  if (!payload || !json_is_object (payload->json)) {
> -    return 0;
> -  }
> -
> -  members = json_object_get (payload->json, "Members");
> -  count   = json_object_get (payload->json, "Members@odata.count");
> -  if (!members || !count) {
> -    return 0;
> -  }
> -
> -  return (size_t)json_integer_value (count);
> -}
> -
> -bool
> -isPayloadArray (
> -  redfishPayload  *payload
> -  )
> -{
> -  if (!payload || !json_is_array (payload->json)) {
> -    return false;
> -  }
> -
> -  return true;
> -}
> -
> -char *
> -payloadToString (
> -  redfishPayload  *payload,
> -  bool            prettyPrint
> -  )
> -{
> -  size_t  flags = 0;
> -
> -  if (!payload) {
> -    return NULL;
> -  }
> -
> -  if (prettyPrint) {
> -    flags = JSON_INDENT (2);
> -  }
> -
> -  return json_dumps (payload->json, flags);
> -}
> -
> -redfishPayload *
> -createRedfishPayload (
> -  json_t          *value,
> -  redfishService  *service
> -  )
> -{
> -  redfishPayload  *payload;
> -
> -  payload = (redfishPayload *)malloc (sizeof (redfishPayload));
> -  if (payload != NULL) {
> -    payload->json    = value;
> -    payload->service = service;
> -  }
> -
> -  return payload;
> -}
> -
> -redfishPayload *
> -getPayloadByNodeName (
> -  redfishPayload        *payload,
> -  const char            *nodeName,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  json_t      *value;
> -  json_t      *odataId;
> -  const char  *uri;
> -
> -  if (!payload || !nodeName || (StatusCode == NULL)) {
> -    return NULL;
> -  }
> -
> -  *StatusCode = NULL;
> -
> -  value = json_object_get (payload->json, nodeName);
> -  if (value == NULL) {
> -    return NULL;
> -  }
> -
> -  json_incref (value);
> -  if (json_object_size (value) == 1) {
> -    odataId = json_object_get (value, "@odata.id");
> -    if (odataId != NULL) {
> -      json_incref (odataId);
> -      uri = json_string_value (odataId);
> -      json_decref (value);
> -      value = getUriFromService (payload->service, uri, StatusCode);
> -      json_decref (odataId);
> -      if ((value == NULL) || (*StatusCode == NULL)) {
> -        return NULL;
> -      }
> -    }
> -  }
> -
> -  if ((*StatusCode == NULL) || ((**StatusCode >= HTTP_STATUS_200_OK) &&
> (**StatusCode <= HTTP_STATUS_206_PARTIAL_CONTENT))) {
> -    if (json_is_string (value)) {
> -      odataId = json_object ();
> -      json_object_set (odataId, nodeName, value);
> -      json_decref (value);
> -      value = odataId;
> -    }
> -  }
> -
> -  return createRedfishPayload (value, payload->service);
> -}
> -
> -redfishPayload *
> -getPayloadByIndex (
> -  redfishPayload        *payload,
> -  size_t                index,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  json_t      *value = NULL;
> -  json_t      *odataId;
> -  const char  *uri;
> -  BOOLEAN     FromServerFlag = FALSE;
> -
> -  if (!payload || (StatusCode == NULL)) {
> -    return NULL;
> -  }
> -
> -  *StatusCode = NULL;
> -
> -  if (isPayloadCollection (payload)) {
> -    redfishPayload  *members = getPayloadByNodeName (payload,
> "Members", StatusCode);
> -    if (((*StatusCode == NULL) && (members == NULL)) ||
> -        ((*StatusCode != NULL) && ((**StatusCode < HTTP_STATUS_200_OK) ||
> (**StatusCode > HTTP_STATUS_206_PARTIAL_CONTENT))))
> -    {
> -      return members;
> -    }
> -
> -    if (*StatusCode != NULL) {
> -      //
> -      // The Payload (members) are retrived from server.
> -      //
> -      FreePool (*StatusCode);
> -      *StatusCode    = NULL;
> -      FromServerFlag = TRUE;
> -    }
> -
> -    redfishPayload  *ret = getPayloadByIndex (members, index, StatusCode);
> -    if ((*StatusCode == NULL) && (ret != NULL) && FromServerFlag) {
> -      //
> -      // In such a case, the Redfish resource is parsed from the input payload
> (members) directly.
> -      // Since the members are retrived from server, we still return
> HTTP_STATUS_200_OK.
> -      //
> -      *StatusCode = AllocateZeroPool (sizeof (EFI_HTTP_STATUS_CODE));
> -      if (*StatusCode == NULL) {
> -        ret = NULL;
> -      } else {
> -        **StatusCode = HTTP_STATUS_200_OK;
> -      }
> -    }
> -
> -    cleanupPayload (members);
> -    return ret;
> -  }
> -
> -  if (json_is_array (payload->json)) {
> -    //
> -    // The valid range for index is from 0 to the return value of json_array_size()
> minus 1
> -    //
> -    value = json_array_get (payload->json, index);
> -  } else if (json_is_object (payload->json)) {
> -    value = json_object_get_by_index (payload->json, index);
> -  }
> -
> -  if (value == NULL) {
> -    return NULL;
> -  }
> -
> -  json_incref (value);
> -  if (json_object_size (value) == 1) {
> -    odataId = json_object_get (value, "@odata.id");
> -    if (odataId != NULL) {
> -      uri = json_string_value (odataId);
> -      json_decref (value);
> -      value = getUriFromService (payload->service, uri, StatusCode);
> -      if (value == NULL) {
> -        return NULL;
> -      }
> -    }
> -  }
> -
> -  return createRedfishPayload (value, payload->service);
> -}
> -
> -redfishPayload *
> -getPayloadForPath (
> -  redfishPayload        *payload,
> -  redPathNode           *redpath,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  redfishPayload  *ret = NULL;
> -  redfishPayload  *tmp;
> -
> -  if (!payload || !redpath || (StatusCode == NULL)) {
> -    return NULL;
> -  }
> -
> -  *StatusCode = NULL;
> -  BOOLEAN  FromServerFlag = FALSE;
> -
> -  if (redpath->nodeName) {
> -    ret = getPayloadByNodeName (payload, redpath->nodeName,
> StatusCode);
> -    if (((*StatusCode == NULL) && (ret == NULL)) ||
> -        ((*StatusCode != NULL) && ((**StatusCode < HTTP_STATUS_200_OK) ||
> (**StatusCode > HTTP_STATUS_206_PARTIAL_CONTENT))))
> -    {
> -      //
> -      // Any error happen, return directly.
> -      //
> -      return ret;
> -    }
> -  } else if (redpath->isIndex) {
> -    ASSERT (redpath->index >= 1);
> -    ret = getPayloadByIndex (payload, redpath->index - 1, StatusCode);
> -    if (((*StatusCode == NULL) && (ret == NULL)) ||
> -        ((*StatusCode != NULL) && ((**StatusCode < HTTP_STATUS_200_OK) ||
> (**StatusCode > HTTP_STATUS_206_PARTIAL_CONTENT))))
> -    {
> -      //
> -      // Any error happen, return directly.
> -      //
> -      return ret;
> -    }
> -  } else if (redpath->op) {
> -    ret = getOpResult (payload, redpath->propName, redpath->op, redpath-
> >value, StatusCode);
> -    if (((*StatusCode == NULL) && (ret == NULL)) ||
> -        ((*StatusCode != NULL) && ((**StatusCode < HTTP_STATUS_200_OK) ||
> (**StatusCode > HTTP_STATUS_206_PARTIAL_CONTENT))))
> -    {
> -      //
> -      // Any error happen, return directly.
> -      //
> -      return ret;
> -    }
> -  } else {
> -    return NULL;
> -  }
> -
> -  if ((redpath->next == NULL) || (ret == NULL)) {
> -    return ret;
> -  } else {
> -    if (*StatusCode != NULL) {
> -      FreePool (*StatusCode);
> -      *StatusCode    = NULL;
> -      FromServerFlag = TRUE;
> -    }
> -
> -    tmp = getPayloadForPath (ret, redpath->next, StatusCode);
> -    if ((*StatusCode == NULL) && (tmp != NULL) && FromServerFlag) {
> -      //
> -      // In such a case, the Redfish resource is parsed from the input payload
> (ret) directly.
> -      // Since the ret are retrived from server, we still return
> HTTP_STATUS_200_OK.
> -      //
> -      *StatusCode = AllocateZeroPool (sizeof (EFI_HTTP_STATUS_CODE));
> -      if (*StatusCode == NULL) {
> -        tmp = NULL;
> -      } else {
> -        **StatusCode = HTTP_STATUS_200_OK;
> -      }
> -    }
> -
> -    cleanupPayload (ret);
> -    return tmp;
> -  }
> -}
> -
> -redfishPayload *
> -getPayloadForPathString (
> -  redfishPayload        *payload,
> -  const char            *string,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  redPathNode     *redpath;
> -  redfishPayload  *ret;
> -
> -  if (!string || (StatusCode == NULL)) {
> -    return NULL;
> -  }
> -
> -  *StatusCode = NULL;
> -
> -  redpath = parseRedPath (string);
> -  if (redpath == NULL) {
> -    return NULL;
> -  }
> -
> -  ret = getPayloadForPath (payload, redpath, StatusCode);
> -  cleanupRedPath (redpath);
> -  return ret;
> -}
> -
> -redfishPayload *
> -patchPayloadEx (
> -  redfishPayload        *target,
> -  redfishPayload        *payload,
> -  EFI_HTTP_HEADER       **Headers,
> -  UINTN                 *HeaderCount,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  json_t  *json;
> -  char    *content;
> -  char    *uri;
> -
> -  if (!target || !payload || (StatusCode == NULL)) {
> -    return NULL;
> -  }
> -
> -  *StatusCode = NULL;
> -
> -  json = json_object_get (target->json, "@odata.id");
> -  if (json == NULL) {
> -    return NULL;
> -  }
> -
> -  uri = strdup (json_string_value (json));
> -
> -  content = json_dumps (payload->json, 0);
> -  json_decref (json);
> -
> -  json = patchUriFromServiceEx (target->service, uri, content, Headers,
> HeaderCount, StatusCode);
> -  free (uri);
> -  free (content);
> -  if (json == NULL) {
> -    return NULL;
> -  }
> -
> -  return createRedfishPayload (json, target->service);
> -}
> -
> -redfishPayload *
> -patchPayload (
> -  redfishPayload        *target,
> -  redfishPayload        *payload,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  json_t  *json;
> -  char    *content;
> -  char    *uri;
> -
> -  if (!target || !payload || (StatusCode == NULL)) {
> -    return NULL;
> -  }
> -
> -  *StatusCode = NULL;
> -
> -  json = json_object_get (target->json, "@odata.id");
> -  if (json == NULL) {
> -    return NULL;
> -  }
> -
> -  uri = strdup (json_string_value (json));
> -
> -  content = json_dumps (payload->json, 0);
> -  json_decref (json);
> -
> -  json = patchUriFromService (target->service, uri, content, StatusCode);
> -  free (uri);
> -  free (content);
> -  if (json == NULL) {
> -    return NULL;
> -  }
> -
> -  return createRedfishPayload (json, target->service);
> -}
> -
> -redfishPayload *
> -postContentToPayloadEx (
> -  redfishPayload        *target,
> -  const char            *data,
> -  size_t                dataSize,
> -  const char            *contentType,
> -  EFI_HTTP_HEADER       **Headers,
> -  UINTN                 *HeaderCount,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  json_t  *json;
> -  char    *uri;
> -
> -  if (!target || !data || (StatusCode == NULL)) {
> -    return NULL;
> -  }
> -
> -  *StatusCode = NULL;
> -
> -  json = json_object_get (target->json, "@odata.id");
> -  if (json == NULL) {
> -    json = json_object_get (target->json, "target");
> -    if (json == NULL) {
> -      return NULL;
> -    }
> -  }
> -
> -  uri  = strdup (json_string_value (json));
> -  json = postUriFromServiceEx (target->service, uri, data, dataSize,
> contentType, Headers, HeaderCount, StatusCode);
> -  free (uri);
> -  if (json == NULL) {
> -    return NULL;
> -  }
> -
> -  return createRedfishPayload (json, target->service);
> -}
> -
> -redfishPayload *
> -postContentToPayload (
> -  redfishPayload        *target,
> -  const char            *data,
> -  size_t                dataSize,
> -  const char            *contentType,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  json_t  *json;
> -  char    *uri;
> -
> -  if (!target || !data || (StatusCode == NULL)) {
> -    return NULL;
> -  }
> -
> -  *StatusCode = NULL;
> -
> -  json = json_object_get (target->json, "@odata.id");
> -  if (json == NULL) {
> -    json = json_object_get (target->json, "target");
> -    if (json == NULL) {
> -      return NULL;
> -    }
> -  }
> -
> -  uri  = strdup (json_string_value (json));
> -  json = postUriFromService (target->service, uri, data, dataSize, contentType,
> StatusCode);
> -  free (uri);
> -  if (json == NULL) {
> -    return NULL;
> -  }
> -
> -  return createRedfishPayload (json, target->service);
> -}
> -
> -redfishPayload *
> -postPayloadEx (
> -  redfishPayload        *target,
> -  redfishPayload        *payload,
> -  EFI_HTTP_HEADER       **Headers,
> -  UINTN                 *HeaderCount,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  char            *content;
> -  redfishPayload  *ret;
> -
> -  if (!target || !payload || (StatusCode == NULL)) {
> -    return NULL;
> -  }
> -
> -  *StatusCode = NULL;
> -
> -  if (!json_is_object (payload->json)) {
> -    return NULL;
> -  }
> -
> -  content = payloadToString (payload, false);
> -  ret     = postContentToPayloadEx (target, content, strlen (content), NULL,
> Headers, HeaderCount, StatusCode);
> -  free (content);
> -  return ret;
> -}
> -
> -redfishPayload *
> -postPayload (
> -  redfishPayload        *target,
> -  redfishPayload        *payload,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  char            *content;
> -  redfishPayload  *ret;
> -
> -  if (!target || !payload || (StatusCode == NULL)) {
> -    return NULL;
> -  }
> -
> -  *StatusCode = NULL;
> -
> -  if (!json_is_object (payload->json)) {
> -    return NULL;
> -  }
> -
> -  content = payloadToString (payload, false);
> -  ret     = postContentToPayload (target, content, strlen (content), NULL,
> StatusCode);
> -  free (content);
> -  return ret;
> -}
> -
> -void
> -cleanupPayload (
> -  redfishPayload  *payload
> -  )
> -{
> -  if (!payload) {
> -    return;
> -  }
> -
> -  json_decref (payload->json);
> -  // Don't free payload->service, let the caller handle cleaning up the service
> -  free (payload);
> -}
> -
> -static redfishPayload *
> -getOpResult (
> -  redfishPayload        *payload,
> -  const char            *propName,
> -  const char            *op,
> -  const char            *value,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  const char      *propStr;
> -  json_t          *stringProp;
> -  bool            ret = false;
> -  redfishPayload  *prop;
> -  long long       intVal, intPropVal;
> -  json_type       jsonType;
> -
> -  if (isPayloadCollection (payload)) {
> -    return collectionEvalOp (payload, propName, op, value, StatusCode);
> -  }
> -
> -  if (isPayloadArray (payload)) {
> -    return arrayEvalOp (payload, propName, op, value, StatusCode);
> -  }
> -
> -  prop = getPayloadByNodeName (payload, propName, StatusCode);
> -  if (((*StatusCode == NULL) && (prop == NULL)) ||
> -      ((*StatusCode != NULL) && ((**StatusCode < HTTP_STATUS_200_OK) ||
> (**StatusCode > HTTP_STATUS_206_PARTIAL_CONTENT))))
> -  {
> -    return prop;
> -  }
> -
> -  stringProp = prop->json;
> -  jsonType   =  JsonGetType (prop->json);
> -  switch (jsonType) {
> -    case JSON_OBJECT:
> -      stringProp = json_object_get (prop->json, propName);
> -    case JSON_STRING:
> -      if (strcmp (op, "=") == 0) {
> -        propStr = json_string_value (stringProp);
> -        if (propStr == NULL) {
> -          cleanupPayload (prop);
> -          return NULL;
> -        }
> -
> -        ret = (strcmp (propStr, value) == 0);
> -      } else if (strcmp (op, "~") == 0) {
> -        propStr = json_string_value (stringProp);
> -        if (propStr == NULL) {
> -          cleanupPayload (prop);
> -          return NULL;
> -        }
> -
> -        ret = (strcasecmp (propStr, value) == 0);
> -      }
> -
> -      break;
> -    case JSON_TRUE:
> -      if (strcmp (op, "=") == 0) {
> -        ret = (strcmp (value, "true") == 0);
> -      }
> -
> -      break;
> -    case JSON_FALSE:
> -      if (strcmp (op, "=") == 0) {
> -        ret = (strcmp (value, "false") == 0);
> -      }
> -
> -      break;
> -    case JSON_INTEGER:
> -      intPropVal = json_integer_value (prop->json);
> -      intVal     = strtoll (value, NULL, 0);
> -      if (strcmp (op, "=") == 0) {
> -        ret = (intPropVal == intVal);
> -      } else if (strcmp (op, "<") == 0) {
> -        ret = (intPropVal < intVal);
> -      } else if (strcmp (op, ">") == 0) {
> -        ret = (intPropVal > intVal);
> -      } else if (strcmp (op, "<=") == 0) {
> -        ret = (intPropVal <= intVal);
> -      } else if (strcmp (op, ">=") == 0) {
> -        ret = (intPropVal >= intVal);
> -      }
> -
> -      break;
> -    default:
> -      break;
> -  }
> -
> -  cleanupPayload (prop);
> -  if (ret) {
> -    return payload;
> -  } else {
> -    return NULL;
> -  }
> -}
> -
> -static redfishPayload *
> -collectionEvalOp (
> -  redfishPayload        *payload,
> -  const char            *propName,
> -  const char            *op,
> -  const char            *value,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  redfishPayload  *ret;
> -  redfishPayload  *tmp;
> -  redfishPayload  *members;
> -  redfishPayload  **valid;
> -  size_t          validMax;
> -  size_t          validCount = 0;
> -  size_t          i;
> -
> -  validMax = getCollectionSize (payload);
> -  if (validMax == 0) {
> -    return NULL;
> -  }
> -
> -  valid = (redfishPayload **)calloc (validMax, sizeof (redfishPayload *));
> -  if (valid == NULL) {
> -    return NULL;
> -  }
> -
> -  /*Technically getPayloadByIndex would do this, but this optimizes things*/
> -  members = getPayloadByNodeName (payload, "Members", StatusCode);
> -  if (((*StatusCode == NULL) && (members == NULL)) ||
> -      ((*StatusCode != NULL) && ((**StatusCode < HTTP_STATUS_200_OK) ||
> (**StatusCode > HTTP_STATUS_206_PARTIAL_CONTENT))))
> -  {
> -    return members;
> -  }
> -
> -  for (i = 0; i < validMax; i++) {
> -    if (*StatusCode != NULL) {
> -      FreePool (*StatusCode);
> -      *StatusCode = NULL;
> -    }
> -
> -    tmp = getPayloadByIndex (members, i, StatusCode);
> -    if (((*StatusCode == NULL) && (tmp == NULL)) ||
> -        ((*StatusCode != NULL) && ((**StatusCode < HTTP_STATUS_200_OK) ||
> (**StatusCode > HTTP_STATUS_206_PARTIAL_CONTENT))))
> -    {
> -      return tmp;
> -    }
> -
> -    if (*StatusCode != NULL) {
> -      FreePool (*StatusCode);
> -      *StatusCode = NULL;
> -    }
> -
> -    valid[validCount] = getOpResult (tmp, propName, op, value, StatusCode);
> -
> -    /*
> -    if ((*StatusCode == NULL && valid[validCount] == NULL) ||
> -        (*StatusCode != NULL && (**StatusCode < HTTP_STATUS_200_OK ||
> **StatusCode > HTTP_STATUS_206_PARTIAL_CONTENT))) {
> -      return valid[validCount];
> -    }
> -    */
> -    if (valid[validCount] != NULL) {
> -      validCount++;
> -    } else {
> -      cleanupPayload (tmp);
> -    }
> -  }
> -
> -  cleanupPayload (members);
> -  if (validCount == 0) {
> -    free (valid);
> -    return NULL;
> -  }
> -
> -  if (validCount == 1) {
> -    ret = valid[0];
> -    free (valid);
> -    return ret;
> -  } else {
> -    ret = createCollection (payload->service, validCount, valid);
> -    free (valid);
> -    return ret;
> -  }
> -}
> -
> -static redfishPayload *
> -arrayEvalOp (
> -  redfishPayload        *payload,
> -  const char            *propName,
> -  const char            *op,
> -  const char            *value,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  redfishPayload  *ret;
> -  redfishPayload  *tmp;
> -  redfishPayload  **valid;
> -  size_t          validMax;
> -  size_t          validCount = 0;
> -  size_t          i;
> -
> -  validMax = json_array_size (payload->json);
> -  if (validMax == 0) {
> -    return NULL;
> -  }
> -
> -  valid = (redfishPayload **)calloc (validMax, sizeof (redfishPayload *));
> -  if (valid == NULL) {
> -    return NULL;
> -  }
> -
> -  for (i = 0; i < validMax; i++) {
> -    if (*StatusCode != NULL) {
> -      FreePool (*StatusCode);
> -      *StatusCode = NULL;
> -    }
> -
> -    tmp = getPayloadByIndex (payload, i, StatusCode);
> -    if (((*StatusCode == NULL) && (tmp == NULL)) ||
> -        ((*StatusCode != NULL) && ((**StatusCode < HTTP_STATUS_200_OK) ||
> (**StatusCode > HTTP_STATUS_206_PARTIAL_CONTENT))))
> -    {
> -      return tmp;
> -    }
> -
> -    if (*StatusCode != NULL) {
> -      FreePool (*StatusCode);
> -      *StatusCode = NULL;
> -    }
> -
> -    valid[validCount] = getOpResult (tmp, propName, op, value, StatusCode);
> -
> -    /*
> -    if ((*StatusCode == NULL && valid[validCount] == NULL) ||
> -        (*StatusCode != NULL && (**StatusCode < HTTP_STATUS_200_OK ||
> **StatusCode > HTTP_STATUS_206_PARTIAL_CONTENT))) {
> -      return valid[validCount];
> -    }
> -    */
> -
> -    if (valid[validCount] != NULL) {
> -      validCount++;
> -    } else {
> -      cleanupPayload (tmp);
> -    }
> -  }
> -
> -  if (validCount == 0) {
> -    free (valid);
> -    return NULL;
> -  }
> -
> -  if (validCount == 1) {
> -    ret = valid[0];
> -    free (valid);
> -    return ret;
> -  } else {
> -    ret = createCollection (payload->service, validCount, valid);
> -    free (valid);
> -    return ret;
> -  }
> -}
> -
> -static redfishPayload *
> -createCollection (
> -  redfishService  *service,
> -  size_t          count,
> -  redfishPayload  **payloads
> -  )
> -{
> -  redfishPayload  *ret;
> -  json_t          *collectionJson = json_object ();
> -  json_t          *jcount         = json_integer ((json_int_t)count);
> -  json_t          *members        = json_array ();
> -  size_t          i;
> -
> -  if (!collectionJson) {
> -    return NULL;
> -  }
> -
> -  if (!members) {
> -    json_decref (collectionJson);
> -    return NULL;
> -  }
> -
> -  json_object_set (collectionJson, "Members@odata.count", jcount);
> -  json_decref (jcount);
> -  for (i = 0; i < count; i++) {
> -    json_array_append (members, payloads[i]->json);
> -    cleanupPayload (payloads[i]);
> -  }
> -
> -  json_object_set (collectionJson, "Members", members);
> -  json_decref (members);
> -
> -  ret = createRedfishPayload (collectionJson, service);
> -  return ret;
> -}
> -
> -static json_t *
> -json_object_get_by_index (
> -  json_t  *json,
> -  size_t  index
> -  )
> -{
> -  void    *iter;
> -  size_t  i;
> -
> -  iter = json_object_iter (json);
> -  for (i = 0; i < index; i++) {
> -    iter = json_object_iter_next (json, iter);
> -    if (iter == NULL) {
> -      break;
> -    }
> -  }
> -
> -  if (iter == NULL) {
> -    return NULL;
> -  }
> -
> -  return json_object_iter_value (iter);
> -}
> -
> -/* vim: set tabstop=4 shiftwidth=4 expandtab: */
> diff --git
> a/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/redpath.c
> b/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/redpath.c
> deleted file mode 100644
> index cf5ab8516..000000000
> --- a/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/redpath.c
> +++ /dev/null
> @@ -1,224 +0,0 @@
> -/** @file
> -  This file is cloned from DMTF libredfish library tag v1.0.0 and maintained
> -  by EDKII.
> -
> -//----------------------------------------------------------------------------
> -// Copyright Notice:
> -// Copyright 2017 Distributed Management Task Force, Inc. All rights
> reserved.
> -// License: BSD 3-Clause License. For full text see link:
> https://github.com/DMTF/libredfish/LICENSE.md
> -//----------------------------------------------------------------------------
> -
> -  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> -  (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
> -
> -  SPDX-License-Identifier: BSD-2-Clause-Patent
> -
> -**/
> -#include <redpath.h>
> -
> -static char *
> -getVersion (
> -  const char  *path,
> -  char        **end
> -  );
> -
> -static void
> -parseNode (
> -  const char   *path,
> -  redPathNode  *node,
> -  redPathNode  **end
> -  );
> -
> -static char *
> -getStringTill (
> -  const char  *string,
> -  const char  *terminator,
> -  char        **retEnd
> -  );
> -
> -redPathNode *
> -parseRedPath (
> -  const char  *path
> -  )
> -{
> -  redPathNode  *node;
> -  redPathNode  *endNode;
> -  char         *curPath;
> -  char         *end;
> -
> -  if (!path || (strlen (path) == 0)) {
> -    return NULL;
> -  }
> -
> -  node = (redPathNode *)calloc (1, sizeof (redPathNode));
> -  if (!node) {
> -    return NULL;
> -  }
> -
> -  if (path[0] == '/') {
> -    node->isRoot = true;
> -    if (path[1] == 'v') {
> -      node->version = getVersion (path+1, &curPath);
> -      if (curPath == NULL) {
> -        return node;
> -      }
> -
> -      if (curPath[0] == '/') {
> -        curPath++;
> -      }
> -
> -      node->next = parseRedPath (curPath);
> -    } else {
> -      node->next = parseRedPath (path+1);
> -    }
> -
> -    return node;
> -  }
> -
> -  node->isRoot = false;
> -  curPath      = getStringTill (path, "/", &end);
> -  endNode      = node;
> -  parseNode (curPath, node, &endNode);
> -  free (curPath);
> -  if (end != NULL) {
> -    endNode->next = parseRedPath (end+1);
> -  }
> -
> -  return node;
> -}
> -
> -void
> -cleanupRedPath (
> -  redPathNode  *node
> -  )
> -{
> -  if (!node) {
> -    return;
> -  }
> -
> -  cleanupRedPath (node->next);
> -  node->next = NULL;
> -  if (node->version) {
> -    free (node->version);
> -  }
> -
> -  if (node->nodeName) {
> -    free (node->nodeName);
> -  }
> -
> -  if (node->op) {
> -    free (node->op);
> -  }
> -
> -  if (node->propName) {
> -    free (node->propName);
> -  }
> -
> -  if (node->value) {
> -    free (node->value);
> -  }
> -
> -  free (node);
> -}
> -
> -static char *
> -getVersion (
> -  const char  *path,
> -  char        **end
> -  )
> -{
> -  return getStringTill (path, "/", end);
> -}
> -
> -static void
> -parseNode (
> -  const char   *path,
> -  redPathNode  *node,
> -  redPathNode  **end
> -  )
> -{
> -  char    *indexStart;
> -  char    *index;
> -  char    *indexEnd;
> -  char    *nodeName = getStringTill (path, "[", &indexStart);
> -  size_t  tmpIndex;
> -  char    *opChars;
> -
> -  node->nodeName = nodeName;
> -  if (indexStart == NULL) {
> -    *end = node;
> -    return;
> -  }
> -
> -  node->next = (redPathNode *)calloc (1, sizeof (redPathNode));
> -  if (!node->next) {
> -    return;
> -  }
> -
> -  // Skip past [
> -  indexStart++;
> -  *end     = node->next;
> -  index    = getStringTill (indexStart, "]", NULL);
> -  tmpIndex = (size_t)strtoull (index, &indexEnd, 0);
> -  if (indexEnd != index) {
> -    free (index);
> -    node->next->index   = tmpIndex;
> -    node->next->isIndex = true;
> -    return;
> -  }
> -
> -  opChars = strpbrk (index, "<>=~");
> -  if (opChars == NULL) {
> -    // TODO handle last() and position()
> -    node->next->op       = strdup ("exists");
> -    node->next->propName = index;
> -    return;
> -  }
> -
> -  node->next->propName = (char *)malloc ((opChars - index)+1);
> -  memcpy (node->next->propName, index, (opChars - index));
> -  node->next->propName[(opChars - index)] = 0;
> -
> -  tmpIndex = 1;
> -  while (1) {
> -    if ((opChars[tmpIndex] == '=') || (opChars[tmpIndex] == '<') ||
> (opChars[tmpIndex] == '>') || (opChars[tmpIndex] == '~')) {
> -      tmpIndex++;
> -      continue;
> -    }
> -
> -    break;
> -  }
> -
> -  node->next->op = (char *)malloc (tmpIndex+1);
> -  memcpy (node->next->op, opChars, tmpIndex);
> -  node->next->op[tmpIndex] = 0;
> -
> -  node->next->value = strdup (opChars+tmpIndex);
> -  free (index);
> -}
> -
> -static char *
> -getStringTill (
> -  const char  *string,
> -  const char  *terminator,
> -  char        **retEnd
> -  )
> -{
> -  char  *ret;
> -  char  *end;
> -
> -  end = strstr ((char *)string, terminator);
> -  if (retEnd) {
> -    *retEnd = end;
> -  }
> -
> -  if (end == NULL) {
> -    // No terminator
> -    return strdup (string);
> -  }
> -
> -  ret = (char *)malloc ((end-string)+1);
> -  memcpy (ret, string, (end-string));
> -  ret[(end-string)] = 0;
> -  return ret;
> -}
> diff --git
> a/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c
> b/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c
> deleted file mode 100644
> index 293ca59c0..000000000
> --- a/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c
> +++ /dev/null
> @@ -1,1882 +0,0 @@
> -/** @file
> -  This file is cloned from DMTF libredfish library tag v1.0.0 and maintained
> -  by EDKII.
> -
> -//----------------------------------------------------------------------------
> -// Copyright Notice:
> -// Copyright 2017 Distributed Management Task Force, Inc. All rights
> reserved.
> -// License: BSD 3-Clause License. For full text see link:
> https://github.com/DMTF/libredfish/LICENSE.md
> -//----------------------------------------------------------------------------
> -
> -  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> -  (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>
> -  Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
> -  Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR>
> -
> -  SPDX-License-Identifier: BSD-2-Clause-Patent
> -
> -**/
> -
> -#include <redfishService.h>
> -#include <redfishPayload.h>
> -#include <redpath.h>
> -
> -static int
> -initRest (
> -  redfishService  *service,
> -  void            *restProtocol
> -  );
> -
> -static redfishService *
> -createServiceEnumeratorNoAuth (
> -  const char    *host,
> -  const char    *rootUri,
> -  bool          enumerate,
> -  unsigned int  flags,
> -  void          *restProtocol
> -  );
> -
> -static redfishService *
> -createServiceEnumeratorBasicAuth (
> -  const char    *host,
> -  const char    *rootUri,
> -  const char    *username,
> -  const char    *password,
> -  unsigned int  flags,
> -  void          *restProtocol
> -  );
> -
> -static redfishService *
> -createServiceEnumeratorSessionAuth (
> -  const char    *host,
> -  const char    *rootUri,
> -  const char    *username,
> -  const char    *password,
> -  unsigned int  flags,
> -  void          *restProtocol
> -  );
> -
> -static char *
> -makeUrlForService (
> -  redfishService  *service,
> -  const char      *uri
> -  );
> -
> -static json_t *
> -getVersions (
> -  redfishService  *service,
> -  const char      *rootUri
> -  );
> -
> -static void
> -addStringToJsonObject (
> -  json_t      *object,
> -  const char  *key,
> -  const char  *value
> -  );
> -
> -CHAR16 *
> -C8ToC16 (
> -  CHAR8  *AsciiStr
> -  )
> -{
> -  CHAR16  *Str;
> -  UINTN   BufLen;
> -
> -  BufLen = (AsciiStrLen (AsciiStr) + 1) * 2;
> -  Str    = AllocatePool (BufLen);
> -  ASSERT (Str != NULL);
> -
> -  AsciiStrToUnicodeStrS (AsciiStr, Str, AsciiStrLen (AsciiStr) + 1);
> -
> -  return Str;
> -}
> -
> -VOID
> -RestConfigFreeHttpRequestData (
> -  IN EFI_HTTP_REQUEST_DATA  *RequestData
> -  )
> -{
> -  if (RequestData == NULL) {
> -    return;
> -  }
> -
> -  if (RequestData->Url != NULL) {
> -    FreePool (RequestData->Url);
> -  }
> -
> -  FreePool (RequestData);
> -}
> -
> -VOID
> -RestConfigFreeHttpMessage (
> -  IN EFI_HTTP_MESSAGE  *Message,
> -  IN BOOLEAN           IsRequest
> -  )
> -{
> -  if (Message == NULL) {
> -    return;
> -  }
> -
> -  if (IsRequest) {
> -    RestConfigFreeHttpRequestData (Message->Data.Request);
> -    Message->Data.Request = NULL;
> -  } else {
> -    if (Message->Data.Response != NULL) {
> -      FreePool (Message->Data.Response);
> -      Message->Data.Response = NULL;
> -    }
> -  }
> -
> -  if (Message->Headers != NULL) {
> -    FreePool (Message->Headers);
> -    Message->Headers = NULL;
> -  }
> -
> -  if (Message->Body != NULL) {
> -    FreePool (Message->Body);
> -    Message->Body = NULL;
> -  }
> -}
> -
> -/**
> -  Converts the Unicode string to ASCII string to a new allocated buffer.
> -
> -  @param[in]       String       Unicode string to be converted.
> -
> -  @return     Buffer points to ASCII string, or NULL if error happens.
> -
> -**/
> -CHAR8 *
> -UnicodeStrDupToAsciiStr (
> -  CONST CHAR16  *String
> -  )
> -{
> -  CHAR8       *AsciiStr;
> -  UINTN       BufLen;
> -  EFI_STATUS  Status;
> -
> -  BufLen   = StrLen (String) + 1;
> -  AsciiStr = AllocatePool (BufLen);
> -  if (AsciiStr == NULL) {
> -    return NULL;
> -  }
> -
> -  Status = UnicodeStrToAsciiStrS (String, AsciiStr, BufLen);
> -  if (EFI_ERROR (Status)) {
> -    return NULL;
> -  }
> -
> -  return AsciiStr;
> -}
> -
> -/**
> -  This function encodes the content.
> -
> -  @param[in]   ContentEncodedValue   HTTP conent encoded value.
> -  @param[in]   OriginalContent       Original content.
> -  @param[out]  EncodedContent        Pointer to receive encoded content.
> -  @param[out]  EncodedContentLength  Length of encoded content.
> -
> -  @retval EFI_SUCCESS              Content encoded successfully.
> -  @retval EFI_UNSUPPORTED          No source encoding funciton,
> -  @retval EFI_INVALID_PARAMETER    One of the given parameter is invalid.
> -
> -**/
> -EFI_STATUS
> -EncodeRequestContent (
> -  IN CHAR8   *ContentEncodedValue,
> -  IN CHAR8   *OriginalContent,
> -  OUT VOID   **EncodedContent,
> -  OUT UINTN  *EncodedContentLength
> -  )
> -{
> -  EFI_STATUS  Status;
> -  VOID        *EncodedPointer;
> -  UINTN       EncodedLength;
> -
> -  if ((OriginalContent == NULL) || (EncodedContent == NULL) ||
> (EncodedContentLength == NULL)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  Status = RedfishContentEncode (
> -             ContentEncodedValue,
> -             OriginalContent,
> -             AsciiStrLen (OriginalContent),
> -             &EncodedPointer,
> -             &EncodedLength
> -             );
> -  if (Status == EFI_SUCCESS) {
> -    *EncodedContent       = EncodedPointer;
> -    *EncodedContentLength = EncodedLength;
> -    return EFI_SUCCESS;
> -  }
> -
> -  return Status;
> -}
> -
> -/**
> -  This function decodes the content. The Memory block pointed by
> -  ContentPointer would be freed and replaced with the cooked Redfish
> -  payload.
> -
> -  @param[in]        ContentEncodedValue HTTP conent encoded value.
> -  @param[in, out]   ContentPointer      Pointer to encoded content.
> -                                        Pointer of decoded content when out.
> -  @param[in, out]   ContentLength       Pointer to the length of encoded
> content.
> -                                        Length of decoded content when out.
> -
> -  @retval EFI_SUCCESS              Functinos found.
> -  @retval EFI_UNSUPPORTED          No functions found.
> -  @retval EFI_INVALID_PARAMETER    One of the given parameter is invalid.
> -
> -**/
> -EFI_STATUS
> -DecodeResponseContent (
> -  IN CHAR8      *ContentEncodedValue,
> -  IN OUT VOID   **ContentPointer,
> -  IN OUT UINTN  *ContentLength
> -  )
> -{
> -  EFI_STATUS  Status;
> -  VOID        *DecodedPointer;
> -  UINTN       DecodedLength;
> -
> -  if (ContentEncodedValue == NULL) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  Status = RedfishContentDecode (
> -             ContentEncodedValue,
> -             *ContentPointer,
> -             *ContentLength,
> -             &DecodedPointer,
> -             &DecodedLength
> -             );
> -  if (Status == EFI_SUCCESS) {
> -    FreePool (*ContentPointer);
> -    *ContentPointer = DecodedPointer;
> -    *ContentLength  = DecodedLength;
> -  }
> -
> -  return Status;
> -}
> -
> -/**
> -  Create a HTTP URL string for specific Redfish resource.
> -
> -  This function build a URL string from the Redfish Host interface record and
> caller specified
> -  relative path of the resource.
> -
> -  Callers are responsible for freeing the returned string storage pointed by
> HttpUrl.
> -
> -  @param[in]   RedfishData         Redfish network host interface record.
> -  @param[in]   RelativePath        Relative path of a resource.
> -  @param[out]  HttpUrl             The pointer to store the returned URL string.
> -
> -  @retval EFI_SUCCESS              Build the URL string successfully.
> -  @retval EFI_INVALID_PARAMETER    RedfishData or HttpUrl is NULL.
> -  @retval EFI_OUT_OF_RESOURCES     There are not enough memory
> resources.
> -
> -**/
> -EFI_STATUS
> -RedfishBuildUrl (
> -  IN  REDFISH_CONFIG_SERVICE_INFORMATION  *RedfishConfigServiceInfo,
> -  IN  CHAR16                              *RelativePath    OPTIONAL,
> -  OUT CHAR16                              **HttpUrl
> -  )
> -{
> -  CHAR16  *Url;
> -  CHAR16  *UrlHead;
> -  UINTN   UrlLength;
> -  UINTN   PathLen;
> -
> -  if ((RedfishConfigServiceInfo == NULL) || (HttpUrl == NULL)) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  //
> -  // RFC2616: http_URL = "http(s):" "//" host [ ":" port ] [ abs_path [ "?"
> query ]]
> -  //
> -  if (RelativePath == NULL) {
> -    PathLen = 0;
> -  } else {
> -    PathLen = StrLen (RelativePath);
> -  }
> -
> -  UrlLength = StrLen (HTTPS_FLAG) + StrLen (REDFISH_FIRST_URL) + 1 + StrLen
> (RedfishConfigServiceInfo->RedfishServiceLocation) + PathLen;
> -  Url       = AllocateZeroPool (UrlLength * sizeof (CHAR16));
> -  if (Url == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  UrlHead = Url;
> -  //
> -  // Copy "http://" or "https://" according RedfishServiceIpPort.
> -  //
> -  if (!RedfishConfigServiceInfo->RedfishServiceUseHttps) {
> -    StrCpyS (Url, StrLen (HTTPS_FLAG) + 1, HTTP_FLAG);
> -    Url = Url + StrLen (HTTP_FLAG);
> -  } else {
> -    StrCpyS (Url, StrLen (HTTPS_FLAG) + 1, HTTPS_FLAG);
> -    Url = Url + StrLen (HTTPS_FLAG);
> -  }
> -
> -  StrCpyS (Url, StrLen (RedfishConfigServiceInfo->RedfishServiceLocation) + 1,
> RedfishConfigServiceInfo->RedfishServiceLocation);
> -  Url = Url + StrLen (RedfishConfigServiceInfo->RedfishServiceLocation);
> -
> -  //
> -  // Copy abs_path
> -  //
> -  if ((RelativePath != NULL) && (PathLen != 0)) {
> -    StrnCpyS (Url, UrlLength, RelativePath, PathLen);
> -  }
> -
> -  *HttpUrl = UrlHead;
> -  return EFI_SUCCESS;
> -}
> -
> -redfishService *
> -createServiceEnumerator (
> -  REDFISH_CONFIG_SERVICE_INFORMATION  *RedfishConfigServiceInfo,
> -  const char                          *rootUri,
> -  enumeratorAuthentication            *auth,
> -  unsigned int                        flags
> -  )
> -{
> -  EFI_STATUS            Status;
> -  CHAR16                *HttpUrl;
> -  CHAR8                 *AsciiHost;
> -  EFI_REST_EX_PROTOCOL  *RestEx;
> -  redfishService        *ret;
> -
> -  HttpUrl   = NULL;
> -  AsciiHost = NULL;
> -  RestEx    = NULL;
> -  ret       = NULL;
> -
> -  if (RedfishConfigServiceInfo->RedfishServiceRestExHandle == NULL) {
> -    goto ON_EXIT;
> -  }
> -
> -  Status = RedfishBuildUrl (RedfishConfigServiceInfo, NULL, &HttpUrl);
> -  if (EFI_ERROR (Status)) {
> -    goto ON_EXIT;
> -  }
> -
> -  ASSERT (HttpUrl != NULL);
> -
> -  AsciiHost = UnicodeStrDupToAsciiStr (HttpUrl);
> -  if (AsciiHost == NULL) {
> -    goto ON_EXIT;
> -  }
> -
> -  Status = gBS->HandleProtocol (
> -                  RedfishConfigServiceInfo->RedfishServiceRestExHandle,
> -                  &gEfiRestExProtocolGuid,
> -                  (VOID **)&RestEx
> -                  );
> -  if (EFI_ERROR (Status)) {
> -    goto ON_EXIT;
> -  }
> -
> -  if (auth == NULL) {
> -    ret = createServiceEnumeratorNoAuth (AsciiHost, rootUri, true, flags,
> RestEx);
> -  } else if (auth->authType == REDFISH_AUTH_BASIC) {
> -    ret = createServiceEnumeratorBasicAuth (AsciiHost, rootUri, auth-
> >authCodes.userPass.username, auth->authCodes.userPass.password, flags,
> RestEx);
> -  } else if (auth->authType == REDFISH_AUTH_SESSION) {
> -    ret = createServiceEnumeratorSessionAuth (AsciiHost, rootUri, auth-
> >authCodes.userPass.username, auth->authCodes.userPass.password, flags,
> RestEx);
> -  } else {
> -    goto ON_EXIT;
> -  }
> -
> -  ret->RestEx = RestEx;
> -ON_EXIT:
> -  if (HttpUrl != NULL) {
> -    FreePool (HttpUrl);
> -  }
> -
> -  if (AsciiHost != NULL) {
> -    FreePool (AsciiHost);
> -  }
> -
> -  return ret;
> -}
> -
> -EFI_HTTP_HEADER *
> -cloneHttpHeaders (
> -  EFI_HTTP_MESSAGE  *message,
> -  UINTN             *HeaderCount
> -  )
> -{
> -  EFI_HTTP_HEADER  *Buffer;
> -  UINTN            Index;
> -
> -  if ((message == NULL) || (HeaderCount == NULL)) {
> -    return NULL;
> -  }
> -
> -  *HeaderCount = message->HeaderCount;
> -  Buffer       = AllocatePool (sizeof (EFI_HTTP_HEADER) *  message-
> >HeaderCount);
> -  if (Buffer == NULL) {
> -    return NULL;
> -  }
> -
> -  for (Index = 0; Index < message->HeaderCount; Index++) {
> -    Buffer[Index].FieldName = AllocateCopyPool (AsciiStrSize (message-
> >Headers[Index].FieldName), message->Headers[Index].FieldName);
> -    ASSERT (Buffer[Index].FieldName != NULL);
> -    Buffer[Index].FieldValue = AllocateCopyPool (AsciiStrSize (message-
> >Headers[Index].FieldValue), message->Headers[Index].FieldValue);
> -    ASSERT (Buffer[Index].FieldValue != NULL);
> -  }
> -
> -  return Buffer;
> -}
> -
> -json_t *
> -getUriFromServiceEx (
> -  redfishService        *service,
> -  const char            *uri,
> -  EFI_HTTP_HEADER       **Headers OPTIONAL,
> -  UINTN                 *HeaderCount OPTIONAL,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  char                   *url;
> -  json_t                 *ret;
> -  HTTP_IO_HEADER         *HttpIoHeader = NULL;
> -  EFI_STATUS             Status;
> -  EFI_HTTP_REQUEST_DATA  *RequestData = NULL;
> -  EFI_HTTP_MESSAGE       *RequestMsg  = NULL;
> -  EFI_HTTP_MESSAGE       ResponseMsg;
> -  EFI_HTTP_HEADER        *ContentEncodedHeader;
> -
> -  if ((service == NULL) || (uri == NULL) || (StatusCode == NULL)) {
> -    return NULL;
> -  }
> -
> -  *StatusCode = NULL;
> -  if (HeaderCount != NULL) {
> -    *HeaderCount = 0;
> -  }
> -
> -  if (Headers != NULL) {
> -    *Headers = NULL;
> -  }
> -
> -  url = makeUrlForService (service, uri);
> -  if (!url) {
> -    return NULL;
> -  }
> -
> -  DEBUG ((DEBUG_MANAGEABILITY, "%a: %a\n", __func__, url));
> -
> -  //
> -  // Step 1: Create HTTP request message with 4 headers:
> -  //
> -  HttpIoHeader = HttpIoCreateHeader ((service->sessionToken || service-
> >basicAuthStr) ? 6 : 5);
> -  if (HttpIoHeader == NULL) {
> -    ret = NULL;
> -    goto ON_EXIT;
> -  }
> -
> -  if (service->sessionToken) {
> -    Status = HttpIoSetHeader (HttpIoHeader, "X-Auth-Token", service-
> >sessionToken);
> -    ASSERT_EFI_ERROR (Status);
> -  } else if (service->basicAuthStr) {
> -    Status = HttpIoSetHeader (HttpIoHeader, "Authorization", service-
> >basicAuthStr);
> -    ASSERT_EFI_ERROR (Status);
> -  }
> -
> -  Status = HttpIoSetHeader (HttpIoHeader, "Host", service-
> >HostHeaderValue);
> -  ASSERT_EFI_ERROR (Status);
> -  Status = HttpIoSetHeader (HttpIoHeader, "OData-Version", "4.0");
> -  ASSERT_EFI_ERROR (Status);
> -  Status = HttpIoSetHeader (HttpIoHeader, "Accept", "application/json");
> -  ASSERT_EFI_ERROR (Status);
> -  Status = HttpIoSetHeader (HttpIoHeader, "User-Agent", "libredfish");
> -  ASSERT_EFI_ERROR (Status);
> -  Status = HttpIoSetHeader (HttpIoHeader, "Connection", "Keep-Alive");
> -  ASSERT_EFI_ERROR (Status);
> -
> -  //
> -  // Step 2: build the rest of HTTP request info.
> -  //
> -  RequestData = AllocateZeroPool (sizeof (EFI_HTTP_REQUEST_DATA));
> -  if (RequestData == NULL) {
> -    ret = NULL;
> -    goto ON_EXIT;
> -  }
> -
> -  RequestData->Method = HttpMethodGet;
> -  RequestData->Url    = C8ToC16 (url);
> -
> -  //
> -  // Step 3: fill in EFI_HTTP_MESSAGE
> -  //
> -  RequestMsg = AllocateZeroPool (sizeof (EFI_HTTP_MESSAGE));
> -  if (RequestMsg == NULL) {
> -    ret = NULL;
> -    goto ON_EXIT;
> -  }
> -
> -  RequestMsg->Data.Request = RequestData;
> -  RequestMsg->HeaderCount  = HttpIoHeader->HeaderCount;
> -  RequestMsg->Headers      = HttpIoHeader->Headers;
> -
> -  ZeroMem (&ResponseMsg, sizeof (ResponseMsg));
> -
> -  //
> -  // Step 4: call RESTEx to get response from REST service.
> -  //
> -  Status = service->RestEx->SendReceive (service->RestEx, RequestMsg,
> &ResponseMsg);
> -  if (EFI_ERROR (Status)) {
> -    ret = NULL;
> -
> -    //
> -    // Deliver status code to caller when error happens so caller can do error
> handling.
> -    //
> -    if (ResponseMsg.Data.Response != NULL) {
> -      *StatusCode = AllocateZeroPool (sizeof (EFI_HTTP_STATUS_CODE));
> -      if (*StatusCode == NULL) {
> -        ret = NULL;
> -        goto ON_EXIT;
> -      }
> -
> -      //
> -      // The caller shall take the responsibility to free the buffer.
> -      //
> -      **StatusCode = ResponseMsg.Data.Response->StatusCode;
> -    }
> -
> -    goto ON_EXIT;
> -  }
> -
> -  //
> -  // Step 5: Return the HTTP StatusCode and Body message.
> -  //
> -  if (ResponseMsg.Data.Response != NULL) {
> -    *StatusCode = AllocateZeroPool (sizeof (EFI_HTTP_STATUS_CODE));
> -    if (*StatusCode == NULL) {
> -      ret = NULL;
> -      goto ON_EXIT;
> -    }
> -
> -    //
> -    // The caller shall take the responsibility to free the buffer.
> -    //
> -    **StatusCode = ResponseMsg.Data.Response->StatusCode;
> -  }
> -
> -  if ((ResponseMsg.Headers != NULL) && (Headers != NULL) &&
> (HeaderCount != NULL)) {
> -    *Headers = cloneHttpHeaders (&ResponseMsg, HeaderCount);
> -  }
> -
> -  if ((ResponseMsg.BodyLength != 0) && (ResponseMsg.Body != NULL)) {
> -    //
> -    // Check if data is encoded.
> -    //
> -    ContentEncodedHeader = HttpFindHeader (ResponseMsg.HeaderCount,
> ResponseMsg.Headers, HTTP_HEADER_CONTENT_ENCODING);
> -    if (ContentEncodedHeader != NULL) {
> -      //
> -      // The content is encoded.
> -      //
> -      Status = DecodeResponseContent (ContentEncodedHeader->FieldValue,
> &ResponseMsg.Body, &ResponseMsg.BodyLength);
> -      if (EFI_ERROR (Status)) {
> -        DEBUG ((DEBUG_ERROR, "%a: Failed to decompress the response
> content %r\n.", __func__, Status));
> -        ret = NULL;
> -        goto ON_EXIT;
> -      }
> -    }
> -
> -    ret = json_loadb (ResponseMsg.Body, ResponseMsg.BodyLength, 0, NULL);
> -  } else {
> -    //
> -    // There is no message body returned from server.
> -    //
> -    ret = NULL;
> -  }
> -
> -ON_EXIT:
> -  if (url != NULL) {
> -    free (url);
> -  }
> -
> -  if (HttpIoHeader != NULL) {
> -    HttpIoFreeHeader (HttpIoHeader);
> -  }
> -
> -  if (RequestData != NULL) {
> -    RestConfigFreeHttpRequestData (RequestData);
> -  }
> -
> -  if (RequestMsg != NULL) {
> -    FreePool (RequestMsg);
> -  }
> -
> -  RestConfigFreeHttpMessage (&ResponseMsg, FALSE);
> -
> -  return ret;
> -}
> -
> -json_t *
> -putUriFromServiceEx (
> -  redfishService        *service,
> -  const char            *uri,
> -  const char            *content,
> -  size_t                contentLength,
> -  const char            *contentType,
> -  EFI_HTTP_HEADER       **Headers OPTIONAL,
> -  UINTN                 *HeaderCount OPTIONAL,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  char                   *url;
> -  json_t                 *ret;
> -  HTTP_IO_HEADER         *HttpIoHeader = NULL;
> -  EFI_STATUS             Status;
> -  EFI_HTTP_REQUEST_DATA  *RequestData = NULL;
> -  EFI_HTTP_MESSAGE       *RequestMsg  = NULL;
> -  EFI_HTTP_MESSAGE       ResponseMsg;
> -  CHAR8                  ContentLengthStr[80];
> -  CHAR8                  *EncodedContent;
> -  UINTN                  EncodedContentLen;
> -
> -  if ((service == NULL) || (uri == NULL) || (content == NULL) || (StatusCode ==
> NULL)) {
> -    return NULL;
> -  }
> -
> -  *StatusCode = NULL;
> -  if (HeaderCount != NULL) {
> -    *HeaderCount = 0;
> -  }
> -
> -  if (Headers != NULL) {
> -    *Headers = NULL;
> -  }
> -
> -  url = makeUrlForService (service, uri);
> -  if (url == NULL) {
> -    return NULL;
> -  }
> -
> -  DEBUG ((DEBUG_MANAGEABILITY, "%a: %a\n", __func__, url));
> -
> -  if (contentLength == 0) {
> -    contentLength = strlen (content);
> -  }
> -
> -  //
> -  // Step 1: Create HTTP request message with 4 headers:
> -  //
> -  HttpIoHeader = HttpIoCreateHeader ((service->sessionToken != NULL ||
> service->basicAuthStr != NULL) ? 9 : 8);
> -  if (HttpIoHeader == NULL) {
> -    ret = NULL;
> -    goto ON_EXIT;
> -  }
> -
> -  if (service->sessionToken) {
> -    Status = HttpIoSetHeader (HttpIoHeader, "X-Auth-Token", service-
> >sessionToken);
> -    ASSERT_EFI_ERROR (Status);
> -  } else if (service->basicAuthStr) {
> -    Status = HttpIoSetHeader (HttpIoHeader, "Authorization", service-
> >basicAuthStr);
> -    ASSERT_EFI_ERROR (Status);
> -  }
> -
> -  if (contentType == NULL) {
> -    Status = HttpIoSetHeader (HttpIoHeader, "Content-Type",
> "application/json");
> -    ASSERT_EFI_ERROR (Status);
> -  } else {
> -    Status = HttpIoSetHeader (HttpIoHeader, "Content-Type", (CHAR8
> *)contentType);
> -    ASSERT_EFI_ERROR (Status);
> -  }
> -
> -  Status = HttpIoSetHeader (HttpIoHeader, "Host", service-
> >HostHeaderValue);
> -  ASSERT_EFI_ERROR (Status);
> -  Status = HttpIoSetHeader (HttpIoHeader, "Content-Type",
> "application/json");
> -  ASSERT_EFI_ERROR (Status);
> -  Status = HttpIoSetHeader (HttpIoHeader, "Accept", "application/json");
> -  ASSERT_EFI_ERROR (Status);
> -  Status = HttpIoSetHeader (HttpIoHeader, "User-Agent", "libredfish");
> -  ASSERT_EFI_ERROR (Status);
> -  Status = HttpIoSetHeader (HttpIoHeader, "Connection", "Keep-Alive");
> -  ASSERT_EFI_ERROR (Status);
> -
> -  AsciiSPrint (
> -    ContentLengthStr,
> -    sizeof (ContentLengthStr),
> -    "%lu",
> -    (UINT64)contentLength
> -    );
> -  Status = HttpIoSetHeader (HttpIoHeader, "Content-Length",
> ContentLengthStr);
> -  ASSERT_EFI_ERROR (Status);
> -  Status = HttpIoSetHeader (HttpIoHeader, "OData-Version", "4.0");
> -  ASSERT_EFI_ERROR (Status);
> -
> -  //
> -  // Step 2: build the rest of HTTP request info.
> -  //
> -  RequestData = AllocateZeroPool (sizeof (EFI_HTTP_REQUEST_DATA));
> -  if (RequestData == NULL) {
> -    ret = NULL;
> -    goto ON_EXIT;
> -  }
> -
> -  RequestData->Method = HttpMethodPut;
> -  RequestData->Url    = C8ToC16 (url);
> -
> -  //
> -  // Step 3: fill in EFI_HTTP_MESSAGE
> -  //
> -  RequestMsg = AllocateZeroPool (sizeof (EFI_HTTP_MESSAGE));
> -  if (RequestMsg == NULL) {
> -    ret = NULL;
> -    goto ON_EXIT;
> -  }
> -
> -  EncodedContent    = (CHAR8 *)content;
> -  EncodedContentLen = contentLength;
> -  //
> -  // We currently only support gzip Content-Encoding.
> -  //
> -  Status = EncodeRequestContent ((CHAR8
> *)HTTP_CONTENT_ENCODING_GZIP, (CHAR8 *)content, (VOID
> **)&EncodedContent, &EncodedContentLen);
> -  if (Status == EFI_INVALID_PARAMETER) {
> -    DEBUG ((DEBUG_ERROR, "%a: Error to encode content.\n", __func__));
> -    ret = NULL;
> -    goto ON_EXIT;
> -  } else if (Status == EFI_UNSUPPORTED) {
> -    DEBUG ((DEBUG_MANAGEABILITY, "No content coding for %a! Use raw
> data instead.\n", HTTP_CONTENT_ENCODING_GZIP));
> -    Status = HttpIoSetHeader (HttpIoHeader, "Content-Encoding",
> HTTP_CONTENT_ENCODING_IDENTITY);
> -    ASSERT_EFI_ERROR (Status);
> -  } else {
> -    Status = HttpIoSetHeader (HttpIoHeader, "Content-Encoding",
> HTTP_CONTENT_ENCODING_GZIP);
> -    ASSERT_EFI_ERROR (Status);
> -  }
> -
> -  RequestMsg->Data.Request = RequestData;
> -  RequestMsg->HeaderCount  = HttpIoHeader->HeaderCount;
> -  RequestMsg->Headers      = HttpIoHeader->Headers;
> -  RequestMsg->BodyLength   = EncodedContentLen;
> -  RequestMsg->Body         = (VOID *)EncodedContent;
> -
> -  ZeroMem (&ResponseMsg, sizeof (ResponseMsg));
> -
> -  //
> -  // Step 4: call RESTEx to get response from REST service.
> -  //
> -  Status = service->RestEx->SendReceive (service->RestEx, RequestMsg,
> &ResponseMsg);
> -  if (EFI_ERROR (Status)) {
> -    ret = NULL;
> -    goto ON_EXIT;
> -  }
> -
> -  //
> -  // Step 5: Return the HTTP StatusCode and Body message.
> -  //
> -  if (ResponseMsg.Data.Response != NULL) {
> -    *StatusCode = AllocateZeroPool (sizeof (EFI_HTTP_STATUS_CODE));
> -    if (*StatusCode == NULL) {
> -      ret = NULL;
> -      goto ON_EXIT;
> -    }
> -
> -    //
> -    // The caller shall take the responsibility to free the buffer.
> -    //
> -    **StatusCode = ResponseMsg.Data.Response->StatusCode;
> -  }
> -
> -  if ((ResponseMsg.Headers != NULL) && (Headers != NULL) &&
> (HeaderCount != NULL)) {
> -    *Headers = cloneHttpHeaders (&ResponseMsg, HeaderCount);
> -  }
> -
> -  if (EncodedContent != content) {
> -    FreePool (EncodedContent);
> -  }
> -
> -  if ((ResponseMsg.BodyLength != 0) && (ResponseMsg.Body != NULL)) {
> -    ret = json_loadb (ResponseMsg.Body, ResponseMsg.BodyLength, 0, NULL);
> -  } else {
> -    //
> -    // There is no message body returned from server.
> -    //
> -    ret = NULL;
> -  }
> -
> -ON_EXIT:
> -  if (url != NULL) {
> -    free (url);
> -  }
> -
> -  if (HttpIoHeader != NULL) {
> -    HttpIoFreeHeader (HttpIoHeader);
> -  }
> -
> -  if (RequestData != NULL) {
> -    RestConfigFreeHttpRequestData (RequestData);
> -  }
> -
> -  if (RequestMsg != NULL) {
> -    FreePool (RequestMsg);
> -  }
> -
> -  RestConfigFreeHttpMessage (&ResponseMsg, FALSE);
> -
> -  return ret;
> -}
> -
> -json_t *
> -patchUriFromServiceEx (
> -  redfishService        *service,
> -  const char            *uri,
> -  const char            *content,
> -  EFI_HTTP_HEADER       **Headers OPTIONAL,
> -  UINTN                 *HeaderCount OPTIONAL,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  char                   *url;
> -  json_t                 *ret;
> -  HTTP_IO_HEADER         *HttpIoHeader = NULL;
> -  EFI_STATUS             Status;
> -  EFI_HTTP_REQUEST_DATA  *RequestData = NULL;
> -  EFI_HTTP_MESSAGE       *RequestMsg  = NULL;
> -  EFI_HTTP_MESSAGE       ResponseMsg;
> -  CHAR8                  ContentLengthStr[80];
> -  CHAR8                  *EncodedContent;
> -  UINTN                  EncodedContentLen;
> -
> -  if ((service == NULL) || (uri == NULL) || (content == NULL) || (StatusCode ==
> NULL)) {
> -    return NULL;
> -  }
> -
> -  *StatusCode = NULL;
> -  if (HeaderCount != NULL) {
> -    *HeaderCount = 0;
> -  }
> -
> -  if (Headers != NULL) {
> -    *Headers = NULL;
> -  }
> -
> -  url = makeUrlForService (service, uri);
> -  if (!url) {
> -    return NULL;
> -  }
> -
> -  DEBUG ((DEBUG_MANAGEABILITY, "%a: %a\n", __func__, url));
> -
> -  //
> -  // Step 1: Create HTTP request message with 4 headers:
> -  //
> -  HttpIoHeader = HttpIoCreateHeader ((service->sessionToken || service-
> >basicAuthStr) ? 9 : 8);
> -  if (HttpIoHeader == NULL) {
> -    ret = NULL;
> -    goto ON_EXIT;
> -  }
> -
> -  if (service->sessionToken) {
> -    Status = HttpIoSetHeader (HttpIoHeader, "X-Auth-Token", service-
> >sessionToken);
> -    ASSERT_EFI_ERROR (Status);
> -  } else if (service->basicAuthStr) {
> -    Status = HttpIoSetHeader (HttpIoHeader, "Authorization", service-
> >basicAuthStr);
> -    ASSERT_EFI_ERROR (Status);
> -  }
> -
> -  Status = HttpIoSetHeader (HttpIoHeader, "Host", service-
> >HostHeaderValue);
> -  ASSERT_EFI_ERROR (Status);
> -  Status = HttpIoSetHeader (HttpIoHeader, "Content-Type",
> "application/json");
> -  ASSERT_EFI_ERROR (Status);
> -  Status = HttpIoSetHeader (HttpIoHeader, "Accept", "application/json");
> -  ASSERT_EFI_ERROR (Status);
> -  Status = HttpIoSetHeader (HttpIoHeader, "User-Agent", "libredfish");
> -  ASSERT_EFI_ERROR (Status);
> -  Status = HttpIoSetHeader (HttpIoHeader, "Connection", "Keep-Alive");
> -  ASSERT_EFI_ERROR (Status);
> -
> -  AsciiSPrint (
> -    ContentLengthStr,
> -    sizeof (ContentLengthStr),
> -    "%lu",
> -    (UINT64)strlen (content)
> -    );
> -  Status = HttpIoSetHeader (HttpIoHeader, "Content-Length",
> ContentLengthStr);
> -  ASSERT_EFI_ERROR (Status);
> -  Status = HttpIoSetHeader (HttpIoHeader, "OData-Version", "4.0");
> -  ASSERT_EFI_ERROR (Status);
> -
> -  //
> -  // Step 2: build the rest of HTTP request info.
> -  //
> -  RequestData = AllocateZeroPool (sizeof (EFI_HTTP_REQUEST_DATA));
> -  if (RequestData == NULL) {
> -    ret = NULL;
> -    goto ON_EXIT;
> -  }
> -
> -  RequestData->Method = HttpMethodPatch;
> -  RequestData->Url    = C8ToC16 (url);
> -
> -  //
> -  // Step 3: fill in EFI_HTTP_MESSAGE
> -  //
> -  RequestMsg = AllocateZeroPool (sizeof (EFI_HTTP_MESSAGE));
> -  if (RequestMsg == NULL) {
> -    ret = NULL;
> -    goto ON_EXIT;
> -  }
> -
> -  EncodedContent    = (CHAR8 *)content;
> -  EncodedContentLen = strlen (content);
> -  //
> -  // We currently only support gzip Content-Encoding.
> -  //
> -  Status = EncodeRequestContent ((CHAR8
> *)HTTP_CONTENT_ENCODING_GZIP, (CHAR8 *)content, (VOID
> **)&EncodedContent, &EncodedContentLen);
> -  if (Status == EFI_INVALID_PARAMETER) {
> -    DEBUG ((DEBUG_ERROR, "%a: Error to encode content.\n", __func__));
> -    ret = NULL;
> -    goto ON_EXIT;
> -  } else if (Status == EFI_UNSUPPORTED) {
> -    DEBUG ((DEBUG_MANAGEABILITY, "No content coding for %a! Use raw
> data instead.\n", HTTP_CONTENT_ENCODING_GZIP));
> -    Status = HttpIoSetHeader (HttpIoHeader, "Content-Encoding",
> HTTP_CONTENT_ENCODING_IDENTITY);
> -    ASSERT_EFI_ERROR (Status);
> -  } else {
> -    Status = HttpIoSetHeader (HttpIoHeader, "Content-Encoding",
> HTTP_CONTENT_ENCODING_GZIP);
> -    ASSERT_EFI_ERROR (Status);
> -  }
> -
> -  RequestMsg->Data.Request = RequestData;
> -  RequestMsg->HeaderCount  = HttpIoHeader->HeaderCount;
> -  RequestMsg->Headers      = HttpIoHeader->Headers;
> -  RequestMsg->BodyLength   = EncodedContentLen;
> -  RequestMsg->Body         = (VOID *)EncodedContent;
> -
> -  ZeroMem (&ResponseMsg, sizeof (ResponseMsg));
> -
> -  //
> -  // Step 4: call RESTEx to get response from REST service.
> -  //
> -  Status = service->RestEx->SendReceive (service->RestEx, RequestMsg,
> &ResponseMsg);
> -  if (EFI_ERROR (Status)) {
> -    ret = NULL;
> -    goto ON_EXIT;
> -  }
> -
> -  //
> -  // Step 5: Return the HTTP StatusCode and Body message.
> -  //
> -  if (ResponseMsg.Data.Response != NULL) {
> -    *StatusCode = AllocateZeroPool (sizeof (EFI_HTTP_STATUS_CODE));
> -    if (*StatusCode == NULL) {
> -      ret = NULL;
> -      goto ON_EXIT;
> -    }
> -
> -    //
> -    // The caller shall take the responsibility to free the buffer.
> -    //
> -    **StatusCode = ResponseMsg.Data.Response->StatusCode;
> -  }
> -
> -  if ((ResponseMsg.Headers != NULL) && (Headers != NULL) &&
> (HeaderCount != NULL)) {
> -    *Headers = cloneHttpHeaders (&ResponseMsg, HeaderCount);
> -  }
> -
> -  if (EncodedContent != content) {
> -    FreePool (EncodedContent);
> -  }
> -
> -  if ((ResponseMsg.BodyLength != 0) && (ResponseMsg.Body != NULL)) {
> -    ret = json_loadb (ResponseMsg.Body, ResponseMsg.BodyLength, 0, NULL);
> -  } else {
> -    //
> -    // There is no message body returned from server.
> -    //
> -    ret = NULL;
> -  }
> -
> -ON_EXIT:
> -  if (url != NULL) {
> -    free (url);
> -  }
> -
> -  if (HttpIoHeader != NULL) {
> -    HttpIoFreeHeader (HttpIoHeader);
> -  }
> -
> -  if (RequestData != NULL) {
> -    RestConfigFreeHttpRequestData (RequestData);
> -  }
> -
> -  if (RequestMsg != NULL) {
> -    FreePool (RequestMsg);
> -  }
> -
> -  RestConfigFreeHttpMessage (&ResponseMsg, FALSE);
> -
> -  return ret;
> -}
> -
> -json_t *
> -postUriFromServiceEx (
> -  redfishService        *service,
> -  const char            *uri,
> -  const char            *content,
> -  size_t                contentLength,
> -  const char            *contentType,
> -  EFI_HTTP_HEADER       **Headers OPTIONAL,
> -  UINTN                 *HeaderCount OPTIONAL,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  char                   *url = NULL;
> -  json_t                 *ret;
> -  HTTP_IO_HEADER         *HttpIoHeader = NULL;
> -  EFI_STATUS             Status;
> -  EFI_HTTP_REQUEST_DATA  *RequestData = NULL;
> -  EFI_HTTP_MESSAGE       *RequestMsg  = NULL;
> -  EFI_HTTP_MESSAGE       ResponseMsg;
> -  CHAR8                  ContentLengthStr[80];
> -  EFI_HTTP_HEADER        *HttpHeader = NULL;
> -
> -  ret = NULL;
> -
> -  if ((service == NULL) || (uri == NULL) || (content == NULL) || (StatusCode ==
> NULL)) {
> -    return NULL;
> -  }
> -
> -  *StatusCode = NULL;
> -  if (HeaderCount != NULL) {
> -    *HeaderCount = 0;
> -  }
> -
> -  if (Headers != NULL) {
> -    *Headers = NULL;
> -  }
> -
> -  url = makeUrlForService (service, uri);
> -  if (!url) {
> -    return NULL;
> -  }
> -
> -  DEBUG ((DEBUG_MANAGEABILITY, "%a: %a\n", __func__, url));
> -
> -  if (contentLength == 0) {
> -    contentLength = strlen (content);
> -  }
> -
> -  //
> -  // Step 1: Create HTTP request message with 4 headers:
> -  //
> -  HttpIoHeader = HttpIoCreateHeader ((service->sessionToken || service-
> >basicAuthStr) ? 8 : 7);
> -  if (HttpIoHeader == NULL) {
> -    goto ON_EXIT;
> -  }
> -
> -  if (service->sessionToken) {
> -    Status = HttpIoSetHeader (HttpIoHeader, "X-Auth-Token", service-
> >sessionToken);
> -    ASSERT_EFI_ERROR (Status);
> -  } else if (service->basicAuthStr) {
> -    Status = HttpIoSetHeader (HttpIoHeader, "Authorization", service-
> >basicAuthStr);
> -    ASSERT_EFI_ERROR (Status);
> -  }
> -
> -  if (contentType == NULL) {
> -    Status = HttpIoSetHeader (HttpIoHeader, "Content-Type",
> "application/json");
> -    ASSERT_EFI_ERROR (Status);
> -  } else {
> -    Status = HttpIoSetHeader (HttpIoHeader, "Content-Type", (CHAR8
> *)contentType);
> -    ASSERT_EFI_ERROR (Status);
> -  }
> -
> -  Status = HttpIoSetHeader (HttpIoHeader, "Host", service-
> >HostHeaderValue);
> -  ASSERT_EFI_ERROR (Status);
> -  Status = HttpIoSetHeader (HttpIoHeader, "Accept", "application/json");
> -  ASSERT_EFI_ERROR (Status);
> -  Status = HttpIoSetHeader (HttpIoHeader, "User-Agent", "libredfish");
> -  ASSERT_EFI_ERROR (Status);
> -  Status = HttpIoSetHeader (HttpIoHeader, "Connection", "Keep-Alive");
> -  ASSERT_EFI_ERROR (Status);
> -  AsciiSPrint (
> -    ContentLengthStr,
> -    sizeof (ContentLengthStr),
> -    "%lu",
> -    (UINT64)contentLength
> -    );
> -  Status = HttpIoSetHeader (HttpIoHeader, "Content-Length",
> ContentLengthStr);
> -  ASSERT_EFI_ERROR (Status);
> -  Status = HttpIoSetHeader (HttpIoHeader, "OData-Version", "4.0");
> -  ASSERT_EFI_ERROR (Status);
> -
> -  //
> -  // Step 2: build the rest of HTTP request info.
> -  //
> -  RequestData = AllocateZeroPool (sizeof (EFI_HTTP_REQUEST_DATA));
> -  if (RequestData == NULL) {
> -    goto ON_EXIT;
> -  }
> -
> -  RequestData->Method = HttpMethodPost;
> -  RequestData->Url    = C8ToC16 (url);
> -
> -  //
> -  // Step 3: fill in EFI_HTTP_MESSAGE
> -  //
> -  RequestMsg = AllocateZeroPool (sizeof (EFI_HTTP_MESSAGE));
> -  if (RequestMsg == NULL) {
> -    goto ON_EXIT;
> -  }
> -
> -  RequestMsg->Data.Request = RequestData;
> -  RequestMsg->HeaderCount  = HttpIoHeader->HeaderCount;
> -  RequestMsg->Headers      = HttpIoHeader->Headers;
> -  RequestMsg->BodyLength   = contentLength;
> -  RequestMsg->Body         = (VOID *)content;
> -
> -  ZeroMem (&ResponseMsg, sizeof (ResponseMsg));
> -
> -  //
> -  // Step 4: call RESTEx to get response from REST service.
> -  //
> -  Status = service->RestEx->SendReceive (service->RestEx, RequestMsg,
> &ResponseMsg);
> -  if (EFI_ERROR (Status)) {
> -    //
> -    // If there is no response to handle, go to error exit.
> -    //
> -    if (ResponseMsg.Data.Response == NULL) {
> -      goto ON_EXIT;
> -    }
> -  }
> -
> -  //
> -  // Step 5: Return the HTTP StatusCode and Body message.
> -  //
> -  if (ResponseMsg.Data.Response != NULL) {
> -    *StatusCode = AllocateZeroPool (sizeof (EFI_HTTP_STATUS_CODE));
> -    if (*StatusCode == NULL) {
> -      goto ON_EXIT;
> -    }
> -
> -    //
> -    // The caller shall take the responsibility to free the buffer.
> -    //
> -    **StatusCode = ResponseMsg.Data.Response->StatusCode;
> -  }
> -
> -  if ((ResponseMsg.Headers != NULL) && (Headers != NULL) &&
> (HeaderCount != NULL)) {
> -    *Headers = cloneHttpHeaders (&ResponseMsg, HeaderCount);
> -  }
> -
> -  if ((ResponseMsg.BodyLength != 0) && (ResponseMsg.Body != NULL)) {
> -    ret = json_loadb (ResponseMsg.Body, ResponseMsg.BodyLength, 0, NULL);
> -  }
> -
> -  //
> -  // Step 6: Parsing the HttpHeader to retrieve the X-Auth-Token if the HTTP
> StatusCode is correct.
> -  //
> -  if ((ResponseMsg.Data.Response != NULL) &&
> -      ((ResponseMsg.Data.Response->StatusCode == HTTP_STATUS_200_OK)
> ||
> -       (ResponseMsg.Data.Response->StatusCode ==
> HTTP_STATUS_204_NO_CONTENT)))
> -  {
> -    HttpHeader = HttpFindHeader (ResponseMsg.HeaderCount,
> ResponseMsg.Headers, "X-Auth-Token");
> -    if (HttpHeader != NULL) {
> -      if (service->sessionToken) {
> -        free (service->sessionToken);
> -      }
> -
> -      service->sessionToken = AllocateCopyPool (AsciiStrSize (HttpHeader-
> >FieldValue), HttpHeader->FieldValue);
> -    }
> -  }
> -
> -ON_EXIT:
> -  if (url != NULL) {
> -    free (url);
> -  }
> -
> -  if (HttpIoHeader != NULL) {
> -    HttpIoFreeHeader (HttpIoHeader);
> -  }
> -
> -  if (RequestData != NULL) {
> -    RestConfigFreeHttpRequestData (RequestData);
> -  }
> -
> -  if (RequestMsg != NULL) {
> -    FreePool (RequestMsg);
> -  }
> -
> -  RestConfigFreeHttpMessage (&ResponseMsg, FALSE);
> -
> -  return ret;
> -}
> -
> -json_t *
> -getUriFromService (
> -  redfishService        *service,
> -  const char            *uri,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  return getUriFromServiceEx (service, uri, NULL, NULL, StatusCode);
> -}
> -
> -json_t *
> -patchUriFromService (
> -  redfishService        *service,
> -  const char            *uri,
> -  const char            *content,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  return patchUriFromServiceEx (service, uri, content, NULL, NULL,
> StatusCode);
> -}
> -
> -json_t *
> -postUriFromService (
> -  redfishService        *service,
> -  const char            *uri,
> -  const char            *content,
> -  size_t                contentLength,
> -  const char            *contentType,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  return postUriFromServiceEx (service, uri, content, contentLength,
> contentType, NULL, NULL, StatusCode);
> -}
> -
> -json_t *
> -deleteUriFromServiceEx (
> -  redfishService        *service,
> -  const char            *uri,
> -  const char            *content,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  char                   *url;
> -  json_t                 *ret;
> -  HTTP_IO_HEADER         *HttpIoHeader = NULL;
> -  EFI_STATUS             Status;
> -  EFI_HTTP_REQUEST_DATA  *RequestData = NULL;
> -  EFI_HTTP_MESSAGE       *RequestMsg  = NULL;
> -  EFI_HTTP_MESSAGE       ResponseMsg;
> -  CHAR8                  ContentLengthStr[80];
> -  size_t                 contentLength;
> -
> -  ret           = NULL;
> -  contentLength = 0;
> -
> -  if ((service == NULL) || (uri == NULL) || (StatusCode == NULL)) {
> -    return NULL;
> -  }
> -
> -  *StatusCode = NULL;
> -
> -  url = makeUrlForService (service, uri);
> -  if (!url) {
> -    return NULL;
> -  }
> -
> -  DEBUG ((DEBUG_MANAGEABILITY, "libredfish: deleteUriFromService():
> %a\n", url));
> -
> -  //
> -  // Step 1: Create HTTP request message with 4 headers:
> -  //
> -  HttpIoHeader = HttpIoCreateHeader ((service->sessionToken || service-
> >basicAuthStr) ? 8 : 7);
> -  if (HttpIoHeader == NULL) {
> -    ret = NULL;
> -    goto ON_EXIT;
> -  }
> -
> -  if (service->sessionToken) {
> -    Status = HttpIoSetHeader (HttpIoHeader, "X-Auth-Token", service-
> >sessionToken);
> -    ASSERT_EFI_ERROR (Status);
> -  } else if (service->basicAuthStr) {
> -    Status = HttpIoSetHeader (HttpIoHeader, "Authorization", service-
> >basicAuthStr);
> -    ASSERT_EFI_ERROR (Status);
> -  }
> -
> -  Status = HttpIoSetHeader (HttpIoHeader, "Host", service-
> >HostHeaderValue);
> -  ASSERT_EFI_ERROR (Status);
> -  Status = HttpIoSetHeader (HttpIoHeader, "User-Agent", "libredfish");
> -  ASSERT_EFI_ERROR (Status);
> -  Status = HttpIoSetHeader (HttpIoHeader, "OData-Version", "4.0");
> -  ASSERT_EFI_ERROR (Status);
> -  Status = HttpIoSetHeader (HttpIoHeader, "Connection", "Keep-Alive");
> -  ASSERT_EFI_ERROR (Status);
> -
> -  Status = HttpIoSetHeader (HttpIoHeader, "Content-Type",
> "application/json");
> -  ASSERT_EFI_ERROR (Status);
> -
> -  if (content != NULL) {
> -    contentLength = strlen (content);
> -    AsciiSPrint (
> -      ContentLengthStr,
> -      sizeof (ContentLengthStr),
> -      "%lu",
> -      (UINT64)contentLength
> -      );
> -    Status = HttpIoSetHeader (HttpIoHeader, "Content-Length",
> ContentLengthStr);
> -    ASSERT_EFI_ERROR (Status);
> -    Status = HttpIoSetHeader (HttpIoHeader, "OData-Version", "4.0");
> -    ASSERT_EFI_ERROR (Status);
> -  }
> -
> -  //
> -  // Step 2: build the rest of HTTP request info.
> -  //
> -  RequestData = AllocateZeroPool (sizeof (EFI_HTTP_REQUEST_DATA));
> -  if (RequestData == NULL) {
> -    ret = NULL;
> -    goto ON_EXIT;
> -  }
> -
> -  RequestData->Method = HttpMethodDelete;
> -  RequestData->Url    = C8ToC16 (url);
> -
> -  //
> -  // Step 3: fill in EFI_HTTP_MESSAGE
> -  //
> -  RequestMsg = AllocateZeroPool (sizeof (EFI_HTTP_MESSAGE));
> -  if (RequestMsg == NULL) {
> -    ret = NULL;
> -    goto ON_EXIT;
> -  }
> -
> -  RequestMsg->Data.Request = RequestData;
> -  RequestMsg->HeaderCount  = HttpIoHeader->HeaderCount;
> -  RequestMsg->Headers      = HttpIoHeader->Headers;
> -
> -  if (content != NULL) {
> -    RequestMsg->BodyLength = contentLength;
> -    RequestMsg->Body       = (VOID *)content;
> -  }
> -
> -  ZeroMem (&ResponseMsg, sizeof (ResponseMsg));
> -
> -  //
> -  // Step 4: call RESTEx to get response from REST service.
> -  //
> -  Status = service->RestEx->SendReceive (service->RestEx, RequestMsg,
> &ResponseMsg);
> -  if (EFI_ERROR (Status)) {
> -    ret = NULL;
> -    goto ON_EXIT;
> -  }
> -
> -  //
> -  // Step 5: Return the HTTP StatusCode and Body message.
> -  //
> -  if (ResponseMsg.Data.Response != NULL) {
> -    *StatusCode = AllocateZeroPool (sizeof (EFI_HTTP_STATUS_CODE));
> -    if (*StatusCode == NULL) {
> -      ret = NULL;
> -      goto ON_EXIT;
> -    }
> -
> -    //
> -    // The caller shall take the responsibility to free the buffer.
> -    //
> -    **StatusCode = ResponseMsg.Data.Response->StatusCode;
> -  }
> -
> -  if ((ResponseMsg.BodyLength != 0) && (ResponseMsg.Body != NULL)) {
> -    ret = json_loadb (ResponseMsg.Body, ResponseMsg.BodyLength, 0, NULL);
> -  }
> -
> -ON_EXIT:
> -  if (url != NULL) {
> -    free (url);
> -  }
> -
> -  if (HttpIoHeader != NULL) {
> -    HttpIoFreeHeader (HttpIoHeader);
> -  }
> -
> -  if (RequestData != NULL) {
> -    RestConfigFreeHttpRequestData (RequestData);
> -  }
> -
> -  if (RequestMsg != NULL) {
> -    FreePool (RequestMsg);
> -  }
> -
> -  RestConfigFreeHttpMessage (&ResponseMsg, FALSE);
> -
> -  return ret;
> -}
> -
> -json_t *
> -deleteUriFromService (
> -  redfishService        *service,
> -  const char            *uri,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  return deleteUriFromServiceEx (service, uri, NULL, StatusCode);
> -}
> -
> -redfishPayload *
> -getRedfishServiceRoot (
> -  redfishService        *service,
> -  const char            *version,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  json_t      *value;
> -  json_t      *versionNode;
> -  const char  *verUrl;
> -
> -  if (version == NULL) {
> -    versionNode = json_object_get (service->versions, "v1");
> -  } else {
> -    versionNode = json_object_get (service->versions, version);
> -  }
> -
> -  if (versionNode == NULL) {
> -    return NULL;
> -  }
> -
> -  verUrl = json_string_value (versionNode);
> -  if (verUrl == NULL) {
> -    return NULL;
> -  }
> -
> -  value = getUriFromService (service, verUrl, StatusCode);
> -  if (value == NULL) {
> -    if ((service->flags & REDFISH_FLAG_SERVICE_NO_VERSION_DOC) == 0) {
> -      json_decref (versionNode);
> -    }
> -
> -    return NULL;
> -  }
> -
> -  return createRedfishPayload (value, service);
> -}
> -
> -redfishPayload *
> -getPayloadByPath (
> -  redfishService        *service,
> -  const char            *path,
> -  EFI_HTTP_STATUS_CODE  **StatusCode
> -  )
> -{
> -  redPathNode     *redpath;
> -  redfishPayload  *root;
> -  redfishPayload  *ret;
> -
> -  if (!service || !path || (StatusCode == NULL)) {
> -    return NULL;
> -  }
> -
> -  *StatusCode = NULL;
> -
> -  redpath = parseRedPath (path);
> -  if (!redpath) {
> -    return NULL;
> -  }
> -
> -  if (!redpath->isRoot) {
> -    cleanupRedPath (redpath);
> -    return NULL;
> -  }
> -
> -  root = getRedfishServiceRoot (service, redpath->version, StatusCode);
> -  if ((*StatusCode == NULL) || (**StatusCode < HTTP_STATUS_200_OK) ||
> (**StatusCode > HTTP_STATUS_206_PARTIAL_CONTENT)) {
> -    cleanupRedPath (redpath);
> -    return root;
> -  }
> -
> -  if (redpath->next == NULL) {
> -    cleanupRedPath (redpath);
> -    return root;
> -  }
> -
> -  FreePool (*StatusCode);
> -  *StatusCode = NULL;
> -
> -  ret = getPayloadForPath (root, redpath->next, StatusCode);
> -  if ((*StatusCode == NULL) && (ret != NULL)) {
> -    //
> -    // In such a case, the Redfish resource is parsed from the input payload
> (root) directly.
> -    // So, we still return HTTP_STATUS_200_OK.
> -    //
> -    *StatusCode = AllocateZeroPool (sizeof (EFI_HTTP_STATUS_CODE));
> -    if (*StatusCode == NULL) {
> -      ret = NULL;
> -    } else {
> -      **StatusCode = HTTP_STATUS_200_OK;
> -    }
> -  }
> -
> -  cleanupPayload (root);
> -  cleanupRedPath (redpath);
> -  return ret;
> -}
> -
> -void
> -cleanupServiceEnumerator (
> -  redfishService  *service
> -  )
> -{
> -  if (!service) {
> -    return;
> -  }
> -
> -  free (service->host);
> -  json_decref (service->versions);
> -  if (service->sessionToken != NULL) {
> -    ZeroMem (service->sessionToken, (UINTN)strlen (service->sessionToken));
> -    FreePool (service->sessionToken);
> -  }
> -
> -  if (service->basicAuthStr != NULL) {
> -    ZeroMem (service->basicAuthStr, (UINTN)strlen (service->basicAuthStr));
> -    FreePool (service->basicAuthStr);
> -  }
> -
> -  free (service);
> -}
> -
> -static int
> -initRest (
> -  redfishService  *service,
> -  void            *restProtocol
> -  )
> -{
> -  service->RestEx = restProtocol;
> -  return 0;
> -}
> -
> -static redfishService *
> -createServiceEnumeratorNoAuth (
> -  const char    *host,
> -  const char    *rootUri,
> -  bool          enumerate,
> -  unsigned int  flags,
> -  void          *restProtocol
> -  )
> -{
> -  redfishService  *ret;
> -  char            *HostStart;
> -
> -  ret = (redfishService *)calloc (1, sizeof (redfishService));
> -  if (initRest (ret, restProtocol) != 0) {
> -    free (ret);
> -    return NULL;
> -  }
> -
> -  ret->host  = AllocateCopyPool (AsciiStrSize (host), host);
> -  ret->flags = flags;
> -  if (enumerate) {
> -    ret->versions = getVersions (ret, rootUri);
> -  }
> -
> -  HostStart = strstr (ret->host, "//");
> -  if ((HostStart != NULL) && (*(HostStart + 2) != '\0')) {
> -    ret->HostHeaderValue = HostStart + 2;
> -  }
> -
> -  return ret;
> -}
> -
> -EFI_STATUS
> -createBasicAuthStr (
> -  IN  redfishService  *service,
> -  IN  CONST CHAR8     *UserId,
> -  IN  CONST CHAR8     *Password
> -  )
> -{
> -  EFI_STATUS  Status;
> -  CHAR8       *RawAuthValue;
> -  UINTN       RawAuthBufSize;
> -  CHAR8       *EnAuthValue;
> -  UINTN       EnAuthValueSize;
> -  CHAR8       *BasicWithEnAuthValue;
> -  UINTN       BasicBufSize;
> -
> -  EnAuthValue     = NULL;
> -  EnAuthValueSize = 0;
> -
> -  RawAuthBufSize = AsciiStrLen (UserId) + AsciiStrLen (Password) + 2;
> -  RawAuthValue   = AllocatePool (RawAuthBufSize);
> -  if (RawAuthValue == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  //
> -  // Build raw AuthValue (UserId:Password).
> -  //
> -  AsciiSPrint (
> -    RawAuthValue,
> -    RawAuthBufSize,
> -    "%a:%a",
> -    UserId,
> -    Password
> -    );
> -
> -  //
> -  // Encoding RawAuthValue into Base64 format.
> -  //
> -  Status = Base64Encode (
> -             (CONST UINT8 *)RawAuthValue,
> -             AsciiStrLen (RawAuthValue),
> -             EnAuthValue,
> -             &EnAuthValueSize
> -             );
> -  if (Status == EFI_BUFFER_TOO_SMALL) {
> -    EnAuthValue = (CHAR8 *)AllocateZeroPool (EnAuthValueSize);
> -    if (EnAuthValue == NULL) {
> -      Status = EFI_OUT_OF_RESOURCES;
> -      return Status;
> -    }
> -
> -    Status = Base64Encode (
> -               (CONST UINT8 *)RawAuthValue,
> -               AsciiStrLen (RawAuthValue),
> -               EnAuthValue,
> -               &EnAuthValueSize
> -               );
> -  }
> -
> -  if (EFI_ERROR (Status)) {
> -    goto Exit;
> -  }
> -
> -  BasicBufSize         = AsciiStrLen ("Basic ") + AsciiStrLen (EnAuthValue) + 2;
> -  BasicWithEnAuthValue = AllocatePool (BasicBufSize);
> -  if (BasicWithEnAuthValue == NULL) {
> -    Status = EFI_OUT_OF_RESOURCES;
> -    goto Exit;
> -  }
> -
> -  //
> -  // Build encoded EnAuthValue with Basic (Basic EnAuthValue).
> -  //
> -  AsciiSPrint (
> -    BasicWithEnAuthValue,
> -    BasicBufSize,
> -    "%a %a",
> -    "Basic",
> -    EnAuthValue
> -    );
> -
> -  service->basicAuthStr = BasicWithEnAuthValue;
> -
> -Exit:
> -  if (RawAuthValue != NULL) {
> -    ZeroMem (RawAuthValue, RawAuthBufSize);
> -    FreePool (RawAuthValue);
> -  }
> -
> -  if (EnAuthValue != NULL) {
> -    ZeroMem (EnAuthValue, EnAuthValueSize);
> -    FreePool (EnAuthValue);
> -  }
> -
> -  return Status;
> -}
> -
> -static redfishService *
> -createServiceEnumeratorBasicAuth (
> -  const char    *host,
> -  const char    *rootUri,
> -  const char    *username,
> -  const char    *password,
> -  unsigned int  flags,
> -  void          *restProtocol
> -  )
> -{
> -  redfishService  *ret;
> -  EFI_STATUS      Status;
> -
> -  ret = createServiceEnumeratorNoAuth (host, rootUri, false, flags,
> restProtocol);
> -
> -  // add basic auth str
> -  Status = createBasicAuthStr (ret, username, password);
> -  if (EFI_ERROR (Status)) {
> -    cleanupServiceEnumerator (ret);
> -    return NULL;
> -  }
> -
> -  ret->versions = getVersions (ret, rootUri);
> -  return ret;
> -}
> -
> -static redfishService *
> -createServiceEnumeratorSessionAuth (
> -  const char    *host,
> -  const char    *rootUri,
> -  const char    *username,
> -  const char    *password,
> -  unsigned int  flags,
> -  void          *restProtocol
> -  )
> -{
> -  redfishService        *ret;
> -  redfishPayload        *payload;
> -  redfishPayload        *links;
> -  json_t                *sessionPayload;
> -  json_t                *session;
> -  json_t                *odataId;
> -  const char            *uri;
> -  json_t                *post;
> -  char                  *content;
> -  EFI_HTTP_STATUS_CODE  *StatusCode;
> -
> -  content    = NULL;
> -  StatusCode = NULL;
> -
> -  ret = createServiceEnumeratorNoAuth (host, rootUri, true, flags,
> restProtocol);
> -  if (ret == NULL) {
> -    return NULL;
> -  }
> -
> -  payload = getRedfishServiceRoot (ret, NULL, &StatusCode);
> -  if ((StatusCode == NULL) || (*StatusCode < HTTP_STATUS_200_OK) ||
> (*StatusCode > HTTP_STATUS_206_PARTIAL_CONTENT)) {
> -    if (StatusCode != NULL) {
> -      FreePool (StatusCode);
> -    }
> -
> -    if (payload != NULL) {
> -      cleanupPayload (payload);
> -    }
> -
> -    cleanupServiceEnumerator (ret);
> -    return NULL;
> -  }
> -
> -  if (StatusCode != NULL) {
> -    FreePool (StatusCode);
> -    StatusCode = NULL;
> -  }
> -
> -  links = getPayloadByNodeName (payload, "Links", &StatusCode);
> -  cleanupPayload (payload);
> -  if (links == NULL) {
> -    cleanupServiceEnumerator (ret);
> -    return NULL;
> -  }
> -
> -  session = json_object_get (links->json, "Sessions");
> -  if (session == NULL) {
> -    cleanupPayload (links);
> -    cleanupServiceEnumerator (ret);
> -    return NULL;
> -  }
> -
> -  odataId = json_object_get (session, "@odata.id");
> -  if (odataId == NULL) {
> -    cleanupPayload (links);
> -    cleanupServiceEnumerator (ret);
> -    return NULL;
> -  }
> -
> -  uri  = json_string_value (odataId);
> -  post = json_object ();
> -  addStringToJsonObject (post, "UserName", username);
> -  addStringToJsonObject (post, "Password", password);
> -  content = json_dumps (post, 0);
> -  json_decref (post);
> -  sessionPayload = postUriFromService (ret, uri, content, 0, NULL,
> &StatusCode);
> -
> -  if (content != NULL) {
> -    ZeroMem (content, (UINTN)strlen (content));
> -    free (content);
> -  }
> -
> -  if ((sessionPayload == NULL) || (StatusCode == NULL) || (*StatusCode <
> HTTP_STATUS_200_OK) || (*StatusCode >
> HTTP_STATUS_206_PARTIAL_CONTENT)) {
> -    // Failed to create session!
> -
> -    cleanupPayload (links);
> -    cleanupServiceEnumerator (ret);
> -
> -    if (StatusCode != NULL) {
> -      FreePool (StatusCode);
> -    }
> -
> -    if (sessionPayload != NULL) {
> -      json_decref (sessionPayload);
> -    }
> -
> -    return NULL;
> -  }
> -
> -  json_decref (sessionPayload);
> -  cleanupPayload (links);
> -  FreePool (StatusCode);
> -  return ret;
> -}
> -
> -static char *
> -makeUrlForService (
> -  redfishService  *service,
> -  const char      *uri
> -  )
> -{
> -  char  *url;
> -
> -  if (service->host == NULL) {
> -    return NULL;
> -  }
> -
> -  url = (char *)malloc (strlen (service->host)+strlen (uri)+1);
> -  if (url == NULL) {
> -    return NULL;
> -  }
> -
> -  strcpy (url, service->host);
> -  strcat (url, uri);
> -  return url;
> -}
> -
> -static json_t *
> -getVersions (
> -  redfishService  *service,
> -  const char      *rootUri
> -  )
> -{
> -  json_t                *ret        = NULL;
> -  EFI_HTTP_STATUS_CODE  *StatusCode = NULL;
> -
> -  if (service->flags & REDFISH_FLAG_SERVICE_NO_VERSION_DOC) {
> -    service->versions = json_object ();
> -    if (service->versions == NULL) {
> -      return NULL;
> -    }
> -
> -    addStringToJsonObject (service->versions, "v1", "/redfish/v1");
> -    return service->versions;
> -  }
> -
> -  if (rootUri != NULL) {
> -    ret = getUriFromService (service, rootUri, &StatusCode);
> -  } else {
> -    ret = getUriFromService (service, "/redfish", &StatusCode);
> -  }
> -
> -  if ((ret == NULL) || (StatusCode == NULL) || (*StatusCode <
> HTTP_STATUS_200_OK) || (*StatusCode >
> HTTP_STATUS_206_PARTIAL_CONTENT)) {
> -    if (ret != NULL) {
> -      json_decref (ret);
> -    }
> -
> -    ret = NULL;
> -  }
> -
> -  if (StatusCode != NULL) {
> -    FreePool (StatusCode);
> -  }
> -
> -  return ret;
> -}
> -
> -static void
> -addStringToJsonObject (
> -  json_t      *object,
> -  const char  *key,
> -  const char  *value
> -  )
> -{
> -  json_t  *jValue = json_string (value);
> -
> -  json_object_set (object, key, jValue);
> -
> -  json_decref (jValue);
> -}
> --
> 2.34.1
>
>
>
> 
>



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



      reply	other threads:[~2024-03-07  6:02 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-06 14:10 [edk2-devel] [edk2-redfish-client][PATCH 1/2] RedfishClientPkg: Remove RedfishLib Nickle Wang via groups.io
2024-03-07  6:02 ` Chang, Abner via groups.io [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=LV8PR12MB945244DE0798FDF6AE56084EEA202@LV8PR12MB9452.namprd12.prod.outlook.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox