[AMD Official Use Only - General] Reviewed-by: Abner Chang <abner.ch...@amd.com>
> -----Original Message----- > From: Nickle Wang <nick...@nvidia.com> > Sent: Thursday, February 29, 2024 4:53 PM > To: devel@edk2.groups.io > Cc: Chang, Abner <abner.ch...@amd.com>; Igor Kulchytskyy > <ig...@ami.com> > Subject: [edk2-redfish-client][PATCH 02/13] RedfishClientPkg: remove > RedfishHttpCacheLib > > Caution: This message originated from an External Source. Use proper caution > when opening attachments, clicking links, or responding. > > > Remove RedfishHttpCacheLib and use EDK2 RedfishHttpLib. > > Signed-off-by: Nickle Wang <nick...@nvidia.com> > Cc: Abner Chang <abner.ch...@amd.com> > Cc: Igor Kulchytskyy <ig...@ami.com> > --- > RedfishClientPkg/RedfishClientPkg.dec | 1 - > RedfishClientPkg/RedfishClientLibs.dsc.inc | 2 +- > RedfishClientPkg/RedfishClientPkg.dsc | 1 - > .../RedfishHttpCacheLib.inf | 48 -- > .../Include/Library/RedfishHttpCacheLib.h | 59 -- > .../RedfishHttpCacheLibInternal.h | 63 -- > .../RedfishHttpCacheLib/RedfishHttpCacheLib.c | 774 ------------------ > 7 files changed, 1 insertion(+), 947 deletions(-) > delete mode 100644 > RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLib.inf > delete mode 100644 > RedfishClientPkg/Include/Library/RedfishHttpCacheLib.h > delete mode 100644 > RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLibInternal.h > delete mode 100644 > RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLib.c > > diff --git a/RedfishClientPkg/RedfishClientPkg.dec > b/RedfishClientPkg/RedfishClientPkg.dec > index ce3b6d975..aa018d714 100644 > --- a/RedfishClientPkg/RedfishClientPkg.dec > +++ b/RedfishClientPkg/RedfishClientPkg.dec > @@ -27,7 +27,6 @@ > > EdkIIRedfishResourceConfigLib|Include/Library/EdkIIRedfishResourceConfigLi > b.h > RedfishEventLib|Include/Library/RedfishEventLib.h > RedfishVersionLib|Include/Library/RedfishVersionLib.h > - RedfishHttpCacheLib|Include/Library/RedfishHttpCacheLib.h > > [LibraryClasses.Common.Private] > ## @libraryclass Redfish Helper Library > diff --git a/RedfishClientPkg/RedfishClientLibs.dsc.inc > b/RedfishClientPkg/RedfishClientLibs.dsc.inc > index 9c7889d2b..8ec27baa3 100644 > --- a/RedfishClientPkg/RedfishClientLibs.dsc.inc > +++ b/RedfishClientPkg/RedfishClientLibs.dsc.inc > @@ -42,4 +42,4 @@ > > RedfishVersionLib|RedfishClientPkg/Library/RedfishVersionLib/RedfishVersio > nLib.inf > > RedfishAddendumLib|RedfishClientPkg/Library/RedfishAddendumLib/Redfis > hAddendumLib.inf > RedfishDebugLib|RedfishPkg/Library/RedfishDebugLib/RedfishDebugLib.inf > - > RedfishHttpCacheLib|RedfishClientPkg/Library/RedfishHttpCacheLib/Redfish > HttpCacheLib.inf > + RedfishHttpLib|RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf > diff --git a/RedfishClientPkg/RedfishClientPkg.dsc > b/RedfishClientPkg/RedfishClientPkg.dsc > index 0e3ef1ac9..f37bf93ac 100644 > --- a/RedfishClientPkg/RedfishClientPkg.dsc > +++ b/RedfishClientPkg/RedfishClientPkg.dsc > @@ -61,6 +61,5 @@ > > RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib.inf > RedfishClientPkg/PrivateLibrary/RedfishLib/RedfishLib.inf > RedfishClientPkg/Library/RedfishAddendumLib/RedfishAddendumLib.inf > - RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLib.inf > > !include RedfishClientPkg/RedfishClient.dsc.inc > diff --git > a/RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLib.inf > b/RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLib.inf > deleted file mode 100644 > index e76c8b65e..000000000 > --- a/RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLib.inf > +++ /dev/null > @@ -1,48 +0,0 @@ > -## @file > -# Redfish HTTP cache library helps Redfish application to get Redfish > resource > -# from Redfish service with cache mechanism enabled. > -# > -# Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights > reserved. > -# > -# SPDX-License-Identifier: BSD-2-Clause-Patent > -# > -## > - > -[Defines] > - INF_VERSION = 0x00010006 > - BASE_NAME = RedfishHttpCacheLib > - FILE_GUID = 21F8FEEC-023C-451D-824D-823058FD9481 > - MODULE_TYPE = DXE_DRIVER > - VERSION_STRING = 1.0 > - LIBRARY_CLASS = RedfishHttpCacheLib| DXE_DRIVER > UEFI_DRIVER > - CONSTRUCTOR = RedfishHttpCacheConstructor > - DESTRUCTOR = RedfishHttpCacheDestructor > - > -# > -# VALID_ARCHITECTURES = IA32 X64 EBC > -# > - > -[Sources] > - RedfishHttpCacheLibInternal.h > - RedfishHttpCacheLib.c > - > -[Packages] > - MdePkg/MdePkg.dec > - MdeModulePkg/MdeModulePkg.dec > - RedfishPkg/RedfishPkg.dec > - RedfishClientPkg/RedfishClientPkg.dec > - > -[LibraryClasses] > - BaseLib > - DebugLib > - UefiBootServicesTableLib > - MemoryAllocationLib > - RedfishLib > - UefiLib > - RedfishDebugLib > - ReportStatusCodeLib > - PrintLib > - > -[depex] > - TRUE > - > diff --git a/RedfishClientPkg/Include/Library/RedfishHttpCacheLib.h > b/RedfishClientPkg/Include/Library/RedfishHttpCacheLib.h > deleted file mode 100644 > index 1277b9814..000000000 > --- a/RedfishClientPkg/Include/Library/RedfishHttpCacheLib.h > +++ /dev/null > @@ -1,59 +0,0 @@ > -/** @file > - This file defines the Redfish HTTP cache library interface. > - > - Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights > reserved. > - > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > -**/ > - > -#ifndef REDFISH_HTTP_CACHE_LIB_H_ > -#define REDFISH_HTTP_CACHE_LIB_H_ > - > -#include <Uefi.h> > -#include <Library/RedfishLib.h> > - > -/** > - Get redfish resource from given resource URI with cache mechanism > - supported. It's caller's responsibility to Response by calling > - RedfishFreeResponse (). > - > - @param[in] Service Redfish service instance to make query. > - @param[in] Uri Target resource URI. > - @param[out] Response HTTP response from redfish service. > - @param[in] UseCache If it is TRUE, this function will search for > - cache first. If it is FALSE, this function > - will query Redfish URI directly. > - > - @retval EFI_SUCCESS Resrouce is returned successfully. > - @retval Others Errors occur. > - > -**/ > -EFI_STATUS > -RedfishHttpGetResource ( > - IN REDFISH_SERVICE Service, > - IN EFI_STRING Uri, > - OUT REDFISH_RESPONSE *Response, > - IN BOOLEAN UseCache > - ); > - > -/** > - Reset the cached data specified by given URI. When response data > - returned by RedfishHttpResetResource() is modified, the response > - data can not be used by other caller. Application calls this > - function to make this data to be stale data and > - RedfishHttpResetResource() will get latest data from remote server > - again. > - > - @param[in] Uri Target resource URI. > - > - @retval EFI_SUCCESS Resrouce is reset successfully. > - @retval Others Errors occur. > - > -**/ > -EFI_STATUS > -RedfishHttpResetResource ( > - IN EFI_STRING Uri > - ); > - > -#endif > diff --git > a/RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLibInterna > l.h > b/RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLibInterna > l.h > deleted file mode 100644 > index 2549335d8..000000000 > --- > a/RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLibInterna > l.h > +++ /dev/null > @@ -1,63 +0,0 @@ > -/** @file > - This file defines the Redfish HTTP cache library internal headers. > - > - Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. > - > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > -**/ > - > -#ifndef REDFISH_HTTP_CACHE_INTERNAL_LIB_H_ > -#define REDFISH_HTTP_CACHE_INTERNAL_LIB_H_ > - > -#include <Uefi.h> > -#include <RedfishBase.h> > - > -#include <Library/UefiLib.h> > -#include <Library/BaseLib.h> > -#include <Library/DebugLib.h> > -#include <Library/RedfishLib.h> > -#include <Library/UefiBootServicesTableLib.h> > -#include <Library/MemoryAllocationLib.h> > -#include <Library/RedfishHttpCacheLib.h> > -#include <Library/RedfishDebugLib.h> > -#include <Library/ReportStatusCodeLib.h> > -#include <Library/PrintLib.h> > - > -#define REDFISH_HTTP_CACHE_LIST_SIZE 0x0F > -#define REDFISH_HTTP_GET_RETRY_MAX 0x0F > -#define REDFISH_HTTP_RETRY_WAIT (2 * 1000000U) ///< 1 second > -#define REDFISH_ERROR_MSG_MAX 128 > -#define REDFISH_HTTP_ERROR_REPORT "Redfish HTTP failure(0x%x): %a" > -#define REDFISH_HTTP_CACHE_DEBUG DEBUG_VERBOSE > -#define REDFISH_HTTP_CACHE_DEBUG_DUMP DEBUG_VERBOSE > - > -/// > -/// Definition of REDFISH_HTTP_CACHE_DATA > -/// > -typedef struct { > - LIST_ENTRY List; > - EFI_STRING Uri; > - UINTN HitCount; > - REDFISH_RESPONSE *Response; > -} REDFISH_HTTP_CACHE_DATA; > - > -#define REDFISH_HTTP_CACHE_FROM_LIST(a) BASE_CR (a, > REDFISH_HTTP_CACHE_DATA, List) > - > -/// > -/// Definition of REDFISH_HTTP_CACHE_LIST > -/// > -typedef struct { > - LIST_ENTRY Head; > - UINTN Count; > - UINTN Capacity; > -} REDFISH_HTTP_CACHE_LIST; > - > -/// > -/// Definition of REDFISH_HTTP_CACHE_PRIVATE > -/// > -typedef struct { > - REDFISH_HTTP_CACHE_LIST CacheList; > -} REDFISH_HTTP_CACHE_PRIVATE; > - > -#endif > diff --git > a/RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLib.c > b/RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLib.c > deleted file mode 100644 > index be31706e6..000000000 > --- a/RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLib.c > +++ /dev/null > @@ -1,774 +0,0 @@ > -/** @file > - Redfish HTTP cache library helps Redfish application to get Redfish > resource > - from Redfish service with cache mechanism enabled. > - > - Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights > reserved. > - > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > -**/ > - > -#include "RedfishHttpCacheLibInternal.h" > - > -REDFISH_HTTP_CACHE_PRIVATE *mRedfishHttpCachePrivate = NULL; > - > -/** > - This function copy the data in SrcResponse to DstResponse. > - > - @param[in] SrcResponse Source Response to copy. > - @param[out] DstResponse Destination Response. > - > - @retval EFI_SUCCESS Response is copied successfully. > - @retval Others Error occurs. > - > -**/ > -EFI_STATUS > -CopyRedfishResponse ( > - IN REDFISH_RESPONSE *SrcResponse, > - OUT REDFISH_RESPONSE *DstResponse > - ) > -{ > - EDKII_JSON_VALUE JsonValue; > - REDFISH_SERVICE Service; > - UINTN Index; > - > - if ((SrcResponse == NULL) || (DstResponse == NULL)) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (SrcResponse == DstResponse) { > - return EFI_SUCCESS; > - } > - > - // > - // Status code > - // > - if (SrcResponse->StatusCode != NULL) { > - DstResponse->StatusCode = AllocateCopyPool (sizeof > (EFI_HTTP_STATUS_CODE), SrcResponse->StatusCode); > - if (DstResponse->StatusCode == NULL) { > - goto ON_ERROR; > - } > - } > - > - // > - // Header > - // > - if ((SrcResponse->HeaderCount > 0) && (SrcResponse->Headers != NULL)) { > - DstResponse->HeaderCount = 0; > - DstResponse->Headers = AllocateZeroPool (sizeof (EFI_HTTP_HEADER) * > SrcResponse->HeaderCount); > - if (DstResponse->Headers == NULL) { > - goto ON_ERROR; > - } > - > - for (Index = 0; Index < SrcResponse->HeaderCount; Index++) { > - DstResponse->Headers[Index].FieldName = AllocateCopyPool (AsciiStrSize > (SrcResponse->Headers[Index].FieldName), SrcResponse- > >Headers[Index].FieldName); > - if (DstResponse->Headers[Index].FieldName == NULL) { > - goto ON_ERROR; > - } > - > - DstResponse->Headers[Index].FieldValue = AllocateCopyPool (AsciiStrSize > (SrcResponse->Headers[Index].FieldValue), SrcResponse- > >Headers[Index].FieldValue); > - if (DstResponse->Headers[Index].FieldValue == NULL) { > - goto ON_ERROR; > - } > - > - DstResponse->HeaderCount += 1; > - } > - } > - > - // > - // Payload > - // > - if (SrcResponse->Payload != NULL) { > - Service = RedfishServiceInPayload (SrcResponse->Payload); > - JsonValue = RedfishJsonInPayload (SrcResponse->Payload); > - DstResponse->Payload = RedfishCreatePayload (JsonValue, Service); > - if (DstResponse->Payload == NULL) { > - goto ON_ERROR; > - } > - } > - > - return EFI_SUCCESS; > - > -ON_ERROR: > - > - RedfishFreeResponse ( > - DstResponse->StatusCode, > - DstResponse->HeaderCount, > - DstResponse->Headers, > - DstResponse->Payload > - ); > - > - return EFI_OUT_OF_RESOURCES; > -} > - > -/** > - This function clone input response and return to caller > - > - @param[in] Response Response to clone. > - > - @retval REDFISH_RESPONSE * Response is cloned. > - @retval NULL Errors occur. > - > -**/ > -REDFISH_RESPONSE * > -CloneRedfishResponse ( > - IN REDFISH_RESPONSE *Response > - ) > -{ > - EFI_STATUS Status; > - REDFISH_RESPONSE *NewResponse; > - > - if (Response == NULL) { > - return NULL; > - } > - > - NewResponse = AllocateZeroPool (sizeof (REDFISH_RESPONSE)); > - if (NewResponse == NULL) { > - return NULL; > - } > - > - Status = CopyRedfishResponse (Response, NewResponse); > - if (EFI_ERROR (Status)) { > - FreePool (NewResponse); > - return NULL; > - } > - > - return NewResponse; > -} > - > -/** > - > - Convert Unicode string to ASCII string. It's call responsibility to release > returned buffer. > - > - @param[in] UnicodeStr Unicode string to convert. > - > - @retval CHAR8 * ASCII string returned. > - @retval NULL Errors occur. > - > -**/ > -CHAR8 * > -StringUnicodeToAscii ( > - IN EFI_STRING UnicodeStr > - ) > -{ > - CHAR8 *AsciiStr; > - UINTN AsciiStrSize; > - EFI_STATUS Status; > - > - if (IS_EMPTY_STRING (UnicodeStr)) { > - return NULL; > - } > - > - AsciiStrSize = StrLen (UnicodeStr) + 1; > - AsciiStr = AllocatePool (AsciiStrSize); > - if (AsciiStr == NULL) { > - return NULL; > - } > - > - Status = UnicodeStrToAsciiStrS (UnicodeStr, AsciiStr, AsciiStrSize); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "UnicodeStrToAsciiStrS failed: %r\n", Status)); > - FreePool (AsciiStr); > - return NULL; > - } > - > - return AsciiStr; > -} > - > -/** > - Release REDFISH_HTTP_CACHE_DATA resource > - > - @param[in] Data Pointer to REDFISH_HTTP_CACHE_DATA instance > - > - @retval EFI_SUCCESS REDFISH_HTTP_CACHE_DATA is released > successfully. > - @retval EFI_INVALID_PARAMETER Data is NULL > - > -**/ > -EFI_STATUS > -ReleaseHttpCacheData ( > - IN REDFISH_HTTP_CACHE_DATA *Data > - ) > -{ > - if (Data == NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (Data->Uri != NULL) { > - FreePool (Data->Uri); > - } > - > - if (Data->Response != NULL) { > - if (Data->Response->Payload != NULL) { > - RedfishFreeResponse ( > - Data->Response->StatusCode, > - Data->Response->HeaderCount, > - Data->Response->Headers, > - Data->Response->Payload > - ); > - FreePool (Data->Response); > - } > - } > - > - FreePool (Data); > - > - return EFI_SUCCESS; > -} > - > -/** > - Create new cache data. > - > - @param[in] Uri The URI string matching to this cache data. > - @param[in] Response HTTP response. > - > - @retval REDFISH_HTTP_CACHE_DATA * Pointer to newly created cache > data. > - @retval NULL No memory available. > - > -**/ > -REDFISH_HTTP_CACHE_DATA * > -NewHttpCacheData ( > - IN EFI_STRING Uri, > - IN REDFISH_RESPONSE *Response > - ) > -{ > - REDFISH_HTTP_CACHE_DATA *NewData; > - UINTN Size; > - > - if (IS_EMPTY_STRING (Uri) || (Response == NULL)) { > - return NULL; > - } > - > - NewData = AllocateZeroPool (sizeof (REDFISH_HTTP_CACHE_DATA)); > - if (NewData == NULL) { > - return NULL; > - } > - > - Size = StrSize (Uri); > - NewData->Uri = AllocateCopyPool (Size, Uri); > - if (NewData->Uri == NULL) { > - goto ON_ERROR; > - } > - > - NewData->Response = Response; > - NewData->HitCount = 1; > - > - return NewData; > - > -ON_ERROR: > - > - if (NewData != NULL) { > - ReleaseHttpCacheData (NewData); > - } > - > - return NULL; > -} > - > -/** > - Search on given ListHeader for given URI string. > - > - @param[in] ListHeader Target list to search. > - @param[in] Uri Target URI to search. > - > - @retval REDFISH_HTTP_CACHE_DATA Target cache data is found. > - @retval NULL No cache data with given URI is found. > - > -**/ > -REDFISH_HTTP_CACHE_DATA * > -FindHttpCacheData ( > - IN LIST_ENTRY *ListHeader, > - IN EFI_STRING Uri > - ) > -{ > - LIST_ENTRY *List; > - REDFISH_HTTP_CACHE_DATA *Data; > - > - if (IS_EMPTY_STRING (Uri)) { > - return NULL; > - } > - > - if (IsListEmpty (ListHeader)) { > - return NULL; > - } > - > - Data = NULL; > - List = GetFirstNode (ListHeader); > - while (!IsNull (ListHeader, List)) { > - Data = REDFISH_HTTP_CACHE_FROM_LIST (List); > - > - if (StrCmp (Data->Uri, Uri) == 0) { > - return Data; > - } > - > - List = GetNextNode (ListHeader, List); > - } > - > - return NULL; > -} > - > -/** > - Search on given ListHeader and return cache data with minimum hit count. > - > - @param[in] ListHeader Target list to search. > - > - @retval REDFISH_HTTP_CACHE_DATA Target cache data is returned. > - @retval NULL No cache data is found. > - > -**/ > -REDFISH_HTTP_CACHE_DATA * > -FindUnusedHttpCacheData ( > - IN LIST_ENTRY *ListHeader > - ) > -{ > - LIST_ENTRY *List; > - REDFISH_HTTP_CACHE_DATA *Data; > - REDFISH_HTTP_CACHE_DATA *UnusedData; > - UINTN HitCount; > - > - if (IsListEmpty (ListHeader)) { > - return NULL; > - } > - > - Data = NULL; > - UnusedData = NULL; > - HitCount = 0; > - > - List = GetFirstNode (ListHeader); > - Data = REDFISH_HTTP_CACHE_FROM_LIST (List); > - UnusedData = Data; > - HitCount = Data->HitCount; > - List = GetNextNode (ListHeader, List); > - > - while (!IsNull (ListHeader, List)) { > - Data = REDFISH_HTTP_CACHE_FROM_LIST (List); > - > - if (Data->HitCount < HitCount) { > - HitCount = Data->HitCount; > - UnusedData = Data; > - } > - > - List = GetNextNode (ListHeader, List); > - } > - > - return UnusedData; > -} > - > -/** > - Delete a cache data by given cache instance. > - > - @param[in] List Target cache list to be removed. > - @param[in] Data Pointer to the instance to be deleted. > - > - @retval EFI_SUCCESS Cache data is removed. > - @retval Others Fail to remove cache data. > - > -**/ > -EFI_STATUS > -DeleteHttpCacheData ( > - IN REDFISH_HTTP_CACHE_LIST *List, > - IN REDFISH_HTTP_CACHE_DATA *Data > - ) > -{ > - if ((List == NULL) || (Data == NULL)) { > - return EFI_INVALID_PARAMETER; > - } > - > - DEBUG ((REDFISH_HTTP_CACHE_DEBUG, "%a: delete: %s\n", __func__, > Data->Uri)); > - > - RemoveEntryList (&Data->List); > - --List->Count; > - > - return ReleaseHttpCacheData (Data); > -} > - > -/** > - Add new cache by given URI and HTTP response to specify List. > - > - @param[in] List Target cache list to add. > - @param[in] Uri The URI string matching to this cache data. > - @param[in] Response HTTP response. > - > - @retval EFI_SUCCESS Cache data is added. > - @retval Others Fail to add cache data. > - > -**/ > -EFI_STATUS > -AddHttpCacheData ( > - IN REDFISH_HTTP_CACHE_LIST *List, > - IN EFI_STRING Uri, > - IN REDFISH_RESPONSE *Response > - ) > -{ > - REDFISH_HTTP_CACHE_DATA *NewData; > - REDFISH_HTTP_CACHE_DATA *OldData; > - REDFISH_HTTP_CACHE_DATA *UnusedData; > - REDFISH_RESPONSE *NewResponse; > - > - if ((List == NULL) || IS_EMPTY_STRING (Uri) || (Response == NULL)) { > - return EFI_INVALID_PARAMETER; > - } > - > - // > - // If same cache data exist, replace it with latest one. > - // > - OldData = FindHttpCacheData (&List->Head, Uri); > - if (OldData != NULL) { > - DeleteHttpCacheData (List, OldData); > - } > - > - // > - // Check capacity > - // > - if (List->Count >= List->Capacity) { > - DEBUG ((REDFISH_HTTP_CACHE_DEBUG, "%a: list is full and retire unused > cache\n", __func__)); > - UnusedData = FindUnusedHttpCacheData (&List->Head); > - if (UnusedData == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - DeleteHttpCacheData (List, UnusedData); > - } > - > - // > - // Clone a local copy > - // > - NewResponse = CloneRedfishResponse (Response); > - if (NewResponse == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - NewData = NewHttpCacheData (Uri, NewResponse); > - if (NewData == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - InsertTailList (&List->Head, &NewData->List); > - ++List->Count; > - > - DEBUG ((REDFISH_HTTP_CACHE_DEBUG, "%a: cache(%d/%d) %s\n", > __func__, List->Count, List->Capacity, NewData->Uri)); > - > - return EFI_SUCCESS; > -} > - > -/** > - Release all cache from list. > - > - @param[in] CacheList The list to be released. > - > - @retval EFI_SUCCESS All cache data are released. > - @retval EFI_INVALID_PARAMETER CacheList is NULL. > - > -**/ > -EFI_STATUS > -ReleaseCacheList ( > - IN REDFISH_HTTP_CACHE_LIST *CacheList > - ) > -{ > - LIST_ENTRY *List; > - LIST_ENTRY *Next; > - REDFISH_HTTP_CACHE_DATA *Data; > - > - if (CacheList == NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (IsListEmpty (&CacheList->Head)) { > - return EFI_SUCCESS; > - } > - > - Data = NULL; > - Next = NULL; > - List = GetFirstNode (&CacheList->Head); > - while (!IsNull (&CacheList->Head, List)) { > - Data = REDFISH_HTTP_CACHE_FROM_LIST (List); > - Next = GetNextNode (&CacheList->Head, List); > - > - DeleteHttpCacheData (CacheList, Data); > - > - List = Next; > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Debug output the cache list. > - > - @param[in] Msg Debug message string. > - @param[in] ErrorLevel Output error level. > - @param[in] CacheList Target list to dump. > - > - @retval EFI_SUCCESS Debug dump finished. > - @retval EFI_INVALID_PARAMETER HttpCacheList is NULL. > - > -**/ > -EFI_STATUS > -DumpHttpCacheList ( > - IN CONST CHAR8 *Msg, > - IN UINTN ErrorLevel, > - IN REDFISH_HTTP_CACHE_LIST *CacheList > - ) > -{ > - LIST_ENTRY *List; > - REDFISH_HTTP_CACHE_DATA *Data; > - UINTN Index; > - > - if (CacheList == NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (!IS_EMPTY_STRING (Msg)) { > - DEBUG ((ErrorLevel, "%a\n", Msg)); > - } > - > - if (IsListEmpty (&CacheList->Head)) { > - DEBUG ((ErrorLevel, "list is empty\n")); > - return EFI_NOT_FOUND; > - } > - > - DEBUG ((ErrorLevel, "list count: %d capacity: %d\n", CacheList->Count, > CacheList->Capacity)); > - Data = NULL; > - Index = 0; > - List = GetFirstNode (&CacheList->Head); > - while (!IsNull (&CacheList->Head, List)) { > - Data = REDFISH_HTTP_CACHE_FROM_LIST (List); > - > - DEBUG ((ErrorLevel, "%d) Uri: %s Hit: %d\n", ++Index, Data->Uri, Data- > >HitCount)); > - > - List = GetNextNode (&CacheList->Head, List); > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Get redfish resource from given resource URI with cache mechanism > - supported. It's caller's responsibility to Response by calling > - RedfishFreeResponse (). > - > - @param[in] Service Redfish service instance to make query. > - @param[in] Uri Target resource URI. > - @param[out] Response HTTP response from redfish service. > - @param[in] UseCache If it is TRUE, this function will search for > - cache first. If it is FALSE, this function > - will query Redfish URI directly. > - > - @retval EFI_SUCCESS Resrouce is returned successfully. > - @retval Others Errors occur. > - > -**/ > -EFI_STATUS > -RedfishHttpGetResource ( > - IN REDFISH_SERVICE Service, > - IN EFI_STRING Uri, > - OUT REDFISH_RESPONSE *Response, > - IN BOOLEAN UseCache > - ) > -{ > - EFI_STATUS Status; > - CHAR8 *AsciiUri; > - REDFISH_HTTP_CACHE_DATA *CacheData; > - UINTN RetryCount; > - > - if ((Service == NULL) || (Response == NULL) || IS_EMPTY_STRING (Uri)) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (mRedfishHttpCachePrivate == NULL) { > - return EFI_NOT_READY; > - } > - > - AsciiUri = NULL; > - CacheData = NULL; > - RetryCount = 0; > - > - // > - // Search for cache list. > - // > - if (UseCache) { > - CacheData = FindHttpCacheData (&mRedfishHttpCachePrivate- > >CacheList.Head, Uri); > - if (CacheData != NULL) { > - DEBUG ((REDFISH_HTTP_CACHE_DEBUG, "%a: cache hit! %s\n", __func__, > Uri)); > - > - // > - // Copy cached response to caller's buffer. > - // > - Status = CopyRedfishResponse (CacheData->Response, > Response); > - CacheData->HitCount += 1; > - return Status; > - } > - } > - > - AsciiUri = StringUnicodeToAscii (Uri); > - if (AsciiUri == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - // > - // Get resource from redfish service. > - // > - do { > - RetryCount += 1; > - Status = RedfishGetByUri ( > - Service, > - AsciiUri, > - Response > - ); > - if (!EFI_ERROR (Status) || (RetryCount >= > REDFISH_HTTP_GET_RETRY_MAX)) { > - break; > - } > - > - // > - // Retry when Redfish service is not ready. > - // > - if ((Response->StatusCode != NULL)) { > - DEBUG_CODE ( > - DumpRedfishResponse (NULL, DEBUG_ERROR, Response); > - ); > - > - if (*Response->StatusCode != > HTTP_STATUS_500_INTERNAL_SERVER_ERROR) { > - break; > - } > - > - FreePool (Response->StatusCode); > - Response->StatusCode = NULL; > - } > - > - DEBUG ((DEBUG_WARN, "%a: RedfishGetByUri failed, retry (%d/%d)\n", > __func__, RetryCount, REDFISH_HTTP_GET_RETRY_MAX)); > - gBS->Stall (REDFISH_HTTP_RETRY_WAIT); > - } while (TRUE); > - > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a: get %a failed (%d/%d): %r\n", __func__, > AsciiUri, RetryCount, REDFISH_HTTP_GET_RETRY_MAX, Status)); > - if (Response->Payload != NULL) { > - RedfishFreeResponse ( > - NULL, > - 0, > - NULL, > - Response->Payload > - ); > - Response->Payload = NULL; > - } > - > - goto ON_RELEASE; > - } > - > - // > - // Keep response in cache list > - // > - Status = AddHttpCacheData (&mRedfishHttpCachePrivate->CacheList, Uri, > Response); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a: failed to cache %s: %r\n", __func__, Uri, > Status)); > - goto ON_RELEASE; > - } > - > - DEBUG_CODE ( > - DumpHttpCacheList (__func__, REDFISH_HTTP_CACHE_DEBUG_DUMP, > &mRedfishHttpCachePrivate->CacheList); > - ); > - > -ON_RELEASE: > - > - if (AsciiUri != NULL) { > - FreePool (AsciiUri); > - } > - > - return Status; > -} > - > -/** > - Reset the cached data specified by given URI. When response data > - returned by RedfishHttpResetResource() is modified, the response > - data can not be used by other caller. Application calls this > - function to make this data to be stale data and > - RedfishHttpResetResource() will get latest data from remote server > - again. > - > - @param[in] Uri Target resource URI. > - > - @retval EFI_SUCCESS Resrouce is reset successfully. > - @retval Others Errors occur. > - > -**/ > -EFI_STATUS > -RedfishHttpResetResource ( > - IN EFI_STRING Uri > - ) > -{ > - REDFISH_HTTP_CACHE_DATA *CacheData; > - > - if (IS_EMPTY_STRING (Uri)) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (mRedfishHttpCachePrivate == NULL) { > - return EFI_NOT_READY; > - } > - > - CacheData = FindHttpCacheData (&mRedfishHttpCachePrivate- > >CacheList.Head, Uri); > - if (CacheData == NULL) { > - return EFI_NOT_FOUND; > - } > - > - DeleteHttpCacheData (&mRedfishHttpCachePrivate->CacheList, CacheData); > - > - return EFI_SUCCESS; > -} > - > -/** > - > - Initial HTTP cache library instance. > - > - @param[in] ImageHandle The image handle. > - @param[in] SystemTable The system table. > - > - @retval EFI_SUCCESS Initial library successfully. > - @retval Other Return error status. > - > -**/ > -EFI_STATUS > -EFIAPI > -RedfishHttpCacheConstructor ( > - IN EFI_HANDLE ImageHandle, > - IN EFI_SYSTEM_TABLE *SystemTable > - ) > -{ > - mRedfishHttpCachePrivate = AllocateZeroPool (sizeof > (REDFISH_HTTP_CACHE_PRIVATE)); > - if (mRedfishHttpCachePrivate == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - // > - // Initial cache list > - // > - mRedfishHttpCachePrivate->CacheList.Capacity = > REDFISH_HTTP_CACHE_LIST_SIZE; > - mRedfishHttpCachePrivate->CacheList.Count = 0x00; > - InitializeListHead (&mRedfishHttpCachePrivate->CacheList.Head); > - > - return EFI_SUCCESS; > -} > - > -/** > - Release allocated resource. > - > - @param[in] ImageHandle Handle that identifies the image to be > unloaded. > - @param[in] SystemTable The system table. > - > - @retval EFI_SUCCESS The image has been unloaded. > - > -**/ > -EFI_STATUS > -EFIAPI > -RedfishHttpCacheDestructor ( > - IN EFI_HANDLE ImageHandle, > - IN EFI_SYSTEM_TABLE *SystemTable > - ) > -{ > - if (mRedfishHttpCachePrivate != NULL) { > - if (!IsListEmpty (&mRedfishHttpCachePrivate->CacheList.Head)) { > - ReleaseCacheList (&mRedfishHttpCachePrivate->CacheList); > - } > - > - FreePool (mRedfishHttpCachePrivate); > - mRedfishHttpCachePrivate = NULL; > - } > - > - return EFI_SUCCESS; > -} > -- > 2.34.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#116298): https://edk2.groups.io/g/devel/message/116298 Mute This Topic: https://groups.io/mt/104640216/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-