* [edk2-devel] [edk2-redfish-client][PATCH 1/2] RedfishClientPkg: Remove RedfishLib
@ 2024-03-06 14:10 Nickle Wang via groups.io
2024-03-07 6:02 ` Chang, Abner via groups.io
0 siblings, 1 reply; 2+ messages in thread
From: Nickle Wang via groups.io @ 2024-03-06 14:10 UTC (permalink / raw)
To: devel; +Cc: Abner Chang, Igor Kulchytskyy
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/redfishPayload.h
delete mode 100644 RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishService.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/RedfishFeatureUtilityLib.inf
RedfishPlatformConfigLib|RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.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/redfishPayload.h b/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishPayload.h
deleted file mode 100644
index 4e91b724c..000000000
--- a/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishPayload.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/redfishService.h b/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishService.h
deleted file mode 100644
index c2e0fd321..000000000
--- a/RedfishClientPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishService.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 (#116442): https://edk2.groups.io/g/devel/message/116442
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]
-=-=-=-=-=-=-=-=-=-=-=-
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [edk2-devel] [edk2-redfish-client][PATCH 1/2] RedfishClientPkg: Remove RedfishLib
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
0 siblings, 0 replies; 2+ messages in thread
From: Chang, Abner via groups.io @ 2024-03-07 6:02 UTC (permalink / raw)
To: devel@edk2.groups.io, nicklew@nvidia.com; +Cc: Igor Kulchytskyy
[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]
-=-=-=-=-=-=-=-=-=-=-=-
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2024-03-07 6:02 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox