From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by spool.mail.gandi.net (Postfix) with ESMTPS id D7766D801DE for ; Thu, 22 Feb 2024 14:17:48 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=UeI+mDi5JV5Dmhlqsk0oH9v4x0iga0xo7fUJkC0b2WU=; c=relaxed/simple; d=groups.io; h=ARC-Seal:ARC-Message-Signature:ARC-Authentication-Results:From:To:CC:Subject:Thread-Topic:Thread-Index:Date:Message-ID:References:In-Reply-To:Accept-Language:MIME-Version:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Language:Content-Type:Content-Transfer-Encoding; s=20140610; t=1708611467; v=1; b=SD9EnS+q73Y7CaMHdpKuU3o/MU+N3CcjRn9i5MI/2PB7NqDdal8JspuX7zN6/LD3ykrXpA+g WbAhSWOothW8k3QSVYFhkFc2nbadqtEAmroFSLtqx54fUsM1pftnOxWks+8T5awy7WyuL/qdmBQ VhjXFQ9CV1mp9xA+LZZZMMks= X-Received: by 127.0.0.2 with SMTP id 8qLMYY7687511x4lkuMLMg11; Thu, 22 Feb 2024 06:17:47 -0800 X-Received: from NAM12-BN8-obe.outbound.protection.outlook.com (NAM12-BN8-obe.outbound.protection.outlook.com [40.107.237.125]) by mx.groups.io with SMTP id smtpd.web10.13712.1708611466609090572 for ; Thu, 22 Feb 2024 06:17:46 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=IrhuGUFu1cOs69TRsK8N0ZKAav+sErQlwqwixZAXlmEpfxrL9S858bD4TVOkAZEhh3msoK271dlqNe86ol4oMTj38rGcnX2vXZP306kzBlRI7T3IdBcu//YYCML1ZI0daIiasYhf1e41Rx5yCgPcP+/xc72vohXxQ/YX58meti3taoTp23bGUteyqFJADXBT9xfWOi5WVkEh3egdTS2v/qxdv9u3v84ZEoIVdEoZjLUJllgAn4j7psExa8KqfrQLk9tzv6+mGg6/vtyh5Dn8CXYw3Yg17bGrdy6fweeIduDdy7R9nhde9XEsX9PANSob8OdoEbXRsyv+yvux2zpiPA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=dQiGNRXeGqQ/NSbzsLmcE8Fp0cCE5FmwhaXLLRAWe7E=; b=FdwMlddgKvUqklzPPDSXwNrtu5lqllu6bwZjCOU6cgeKXhTnllGQytUyrZDFYrimfj9DAcruQRifTfysKN7YQ1llLbVysDbBdTphL8OQ3NhbSOOOx4b73zzi+RRv2LSLDqUv1DlT7DLgnmU+kldv34/mNng74BsbzKfFl81NILwhWh2+yHUD5khYCkq2cFF7Qc7CA8RndamB9kTBb1/3gVykds1smDvjuyq0+0y+Bwk3NrGZ68wiiQASCVWap4V8CPBORkjSMiMWqscot/I2ScSjp27XDdDHnDvkwZ6hAfSdlVse3499uXEovW0bHgwAHCSe63ZaUssi3VpzeyYEeA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=ami.com; dmarc=pass action=none header.from=ami.com; dkim=pass header.d=ami.com; arc=none X-Received: from BLAPR10MB5185.namprd10.prod.outlook.com (2603:10b6:208:328::16) by SA1PR10MB7709.namprd10.prod.outlook.com (2603:10b6:806:3a9::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7316.24; Thu, 22 Feb 2024 14:17:44 +0000 X-Received: from BLAPR10MB5185.namprd10.prod.outlook.com ([fe80::7840:c724:8a2a:4cf5]) by BLAPR10MB5185.namprd10.prod.outlook.com ([fe80::7840:c724:8a2a:4cf5%5]) with mapi id 15.20.7316.023; Thu, 22 Feb 2024 14:17:44 +0000 From: "Igor Kulchytskyy via groups.io" To: Nickle Wang , "devel@edk2.groups.io" CC: Abner Chang , Nick Ramirez Subject: Re: [edk2-devel] [PATCH v2 3/6] RedfishPkg: introduce RedfishHttpLib Thread-Topic: [EXTERNAL] [PATCH v2 3/6] RedfishPkg: introduce RedfishHttpLib Thread-Index: AQHaZW8tVlyETlXf0Ei6MWQaeh/6cLEWaOkQ Date: Thu, 22 Feb 2024 14:17:43 +0000 Message-ID: References: <20240222091132.696-1-nicklew@nvidia.com> In-Reply-To: <20240222091132.696-1-nicklew@nvidia.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-publictraffictype: Email x-ms-traffictypediagnostic: BLAPR10MB5185:EE_|SA1PR10MB7709:EE_ x-ms-office365-filtering-correlation-id: a08dedb9-2b66-4f72-3a29-08dc33b1096d x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam-message-info: HjgNwTEStu0LS31fehe/yXiqwiGjGRNtlGxJjTBIqZ1496gyYRqwmkC4DyRcq7QvEge+T4MI+HUuGabrcU7dXgq2IqQs2MVV7uDv5u4mkEjYmLIsAx5KNewOM8nj2VUgesqkedXowfobf7JnGbHEJZP1bbMe/6JyRsKMO0T3MP/sXOasRxWDrL25W2xUliWGf4noxUJJWlZdm0P3Rmz1Mufw19Iu520T9oYLTnvzELmFOAj9FWQHAUR/gFAD9R5lTQX54fL5WXxpLKhsSZVtY3nW9OFyMiJGNm5dRuyl+t6WjunFj5giqI06cgjSfGDBUEN3GjQuU8UKJdGNRZgYClm4A4xAHBURpVFzIBpxLulz+oI3/kDz3toJcAOi27CyBbT1IVygrE8bphHBFF1pQVzAm3uMABA1MYK2owGtkFi9UXw1kl92KMIZbVdq5b2YPaenweHy+hbZ0+Q+GAMhulf90UyV2GgPNz6h15kSvWP2yV7PumRwStW1ptAOuLRMz0YcTwFgKIe8d00XgLmdUuNV9wE0UxFT37bpTHR303wgYltXWTNxCrkW+Q0zgZYqZ2WplT5ozKVCMfSzPwuIUMmG10WX705xTpjGbelc/WbV+pA7ppbbeHYLtNORLg6a x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?zmKkdILNWo50JjTmZGV21VojeHUaPgIepfG/bU/3VacW0BFcKm3XZKplQybN?= =?us-ascii?Q?B3ULcnY22RXxQ/P9pP01iPMSMfnI3H2R7zqJkmiwu4+4WKlVb7SZvNbJ0v1O?= =?us-ascii?Q?Fwg6NKo2PTimBwI3EDBLYXSDQIZ3H3aEMQ464YiMDkO80EnHOrOAv5RSERW5?= =?us-ascii?Q?6P+EjQ6YpSfwp2ql0wUiheU8qw7XQqYSwn4PfFTzAe4iulsRB2/9MY1Mnt1j?= =?us-ascii?Q?8kqhheuEVQEmks9su6UHS0x3G0zjYg45BkbNZoQPAlIX90l66YKc4QiObpLD?= =?us-ascii?Q?UbYE+uN6ErsV0v1H6q3mImxexIZ+2mNg9j1kB2NpoogVK2TqESPArTH6EKfN?= =?us-ascii?Q?p+f7hX/RO3mc+7wqBtvp7GTPoCi9p1jSZhwuJzLFKiTZOpiPky9WacP+FP2g?= =?us-ascii?Q?9vQQjWmseeyVA9iBNCYgPyjFSb4247QVNad6Af4TAKg9UL+xYBOtMcNnDeuN?= =?us-ascii?Q?TWV2Iq5Z16iyLKqxoDaX3TLB5D9rl3nH+aLQtAeDnHsPIRKUMMoXPW3Y6AZe?= =?us-ascii?Q?T1e1OGEL+4pB7ukyXf1uHpe/SM/Pq3KcLfcWyd1hbgSCwV2/HMF0WAJ5TFFj?= =?us-ascii?Q?fNdy4HXIa8Hj4hIhRYhSt3VZidPRw37e1U/JaVm7hksWLvRJFxDeODd6O+iL?= =?us-ascii?Q?YvTL8ZHzCtWLaluk64KEs38B+JbJFiaZyO4MgDLQSbh3GRtztTgoQu6KrLoX?= =?us-ascii?Q?vncE+3Otr5hwhoaHkI09DV6kuT04eV4APZOD4lokC5T88FVe07l3qQcS23XF?= =?us-ascii?Q?alCgoUgwDCr/e0h38NqJZem1uMkZHnh3cFYZMEiM/IqGkkrFZAqdlFymzAF0?= =?us-ascii?Q?f+y3vt7f5ZLvrC5qUeycegNWIfYDO2mGs9IfSZgRmbgS+OhITUUqkEktmQXE?= =?us-ascii?Q?WpEIr+7P4hMerDcmJwd22xHm7Ybr1u1j/6ls9ZA38/zxBQ/BzF28yxudnaQc?= =?us-ascii?Q?S3tcTE7cXOupP3dYJsMPlIJugLenXtW+TW3Jd6wLQVJxhIqRhk9UumFfxScX?= =?us-ascii?Q?Lv9uC92tArbXfVf4NwC/tIyQaHBHqhFZ0Pb0zSYgK2sJL03TMA16ko4q8nZa?= =?us-ascii?Q?wNlgKbIF0FmE2/Bpiuyt1gQT1s31/aJsTldNpf2jYcgIroONm7NFqFwXPA4x?= =?us-ascii?Q?4VfG9A7eBVfdDGG1QJsP6d3s1UkNXYUycblppUJ5R3khbjkA/YUJYW5LhwZC?= =?us-ascii?Q?DpfR/pYDfD36iB3yCraxGxa1Ijxrpi8HRNZw8UifeJ8o0RU9rMPCuLRFfKwe?= =?us-ascii?Q?8E36WHTapG1tmuihKuhrVHseqbHZ0WPLcL6JlFQjX5cBlqNUTP3KlIy1lC6z?= =?us-ascii?Q?Jbomfq7x13j1cgORqdskWt9yTBv3zapCYa4qWdVsBI6JCKODfdWzdyvU99TG?= =?us-ascii?Q?217bMQ/HjtNdzbpchifgh3Fa8aI5cng1IZTQpmEyGkUxU2JICCdePYpalBPx?= =?us-ascii?Q?iiFF4SnafQx1y7/lIGrjO7eJ3brp3ViQuak5jYrNWhMSbpBwHR31HviW/31R?= =?us-ascii?Q?YTWZMPFt0KKLS6LJqZSa1Bk9MHpnD8dBNYCrArFqd30kdIlgPKj6o7oQLWYh?= =?us-ascii?Q?Icm9t4vD1LQh9P9ucvQ=3D?= MIME-Version: 1.0 X-OriginatorOrg: ami.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: BLAPR10MB5185.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: a08dedb9-2b66-4f72-3a29-08dc33b1096d X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Feb 2024 14:17:43.9908 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 27e97857-e15f-486c-b58e-86c2b3040f93 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: nrml+ILXbWPmX9Nj6VXBwn2vyj07oIZolgWG0uQ68Uzk7T0D3Whp/+68Z1FyuL8d X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR10MB7709 Precedence: Bulk List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,igork@ami.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: Ug7arZ9cO9lEoZIWAD5ZWlTVx7686176AA= Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20140610 header.b=SD9EnS+q; spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io; dmarc=pass (policy=none) header.from=groups.io; arc=reject ("signature check failed: fail, {[1] = sig:microsoft.com:reject}") Reviewed-by: Igor Kulchytskyy -----Original Message----- From: Nickle Wang Sent: Thursday, February 22, 2024 4:12 AM To: devel@edk2.groups.io Cc: Abner Chang ; Igor Kulchytskyy ; Ni= ck Ramirez Subject: [EXTERNAL] [PATCH v2 3/6] RedfishPkg: introduce RedfishHttpLib **CAUTION: The e-mail below is from an external source. Please exercise cau= tion before opening attachments, clicking links, or following guidance.** RedfishHttpLib is a wrapper library for Redfish feature drivers to call Redfish HTTP Protocol easily. Signed-off-by: Nickle Wang Cc: Abner Chang Cc: Igor Kulchytskyy Cc: Nick Ramirez Reviewed-by: Abner Chang --- RedfishPkg/RedfishPkg.dec | 5 + RedfishPkg/RedfishLibs.dsc.inc | 3 +- RedfishPkg/RedfishPkg.dsc | 3 +- .../Library/RedfishHttpLib/RedfishHttpLib.inf | 43 ++ RedfishPkg/Include/Library/RedfishHttpLib.h | 326 ++++++++++ .../Library/RedfishHttpLib/RedfishHttpLib.c | 585 ++++++++++++++++++ 6 files changed, 963 insertions(+), 2 deletions(-) create mode 100644 RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf create mode 100644 RedfishPkg/Include/Library/RedfishHttpLib.h create mode 100644 RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.c diff --git a/RedfishPkg/RedfishPkg.dec b/RedfishPkg/RedfishPkg.dec index 114f8d2ad8..1a9c9ed7bc 100644 --- a/RedfishPkg/RedfishPkg.dec +++ b/RedfishPkg/RedfishPkg.dec @@ -69,6 +69,11 @@ # RedfishPlatformConfigLib|Include/Library/RedfishPlatformConfigLib.h + ## @libraryclass Provides the library functions to access Redfish HTTP + # protocol. + # + RedfishHttpLib|Include/Library/RedfishHttpLib.h + [LibraryClasses.Common.Private] ## @libraryclass Provides the private C runtime library functions. # CRT library is currently used by edk2 JsonLib (open source diff --git a/RedfishPkg/RedfishLibs.dsc.inc b/RedfishPkg/RedfishLibs.dsc.in= c index 5426957da8..55846aaa9d 100644 --- a/RedfishPkg/RedfishLibs.dsc.inc +++ b/RedfishPkg/RedfishLibs.dsc.inc @@ -6,7 +6,7 @@ # of EDKII network library classes. # # (C) Copyright 2021 Hewlett Packard Enterprise Development LP
-# Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved= . +# Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights res= erved. # # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -21,5 +21,6 @@ RedfishPlatformCredentialLib|RedfishPkg/Library/RedfishPlatformCredentia= lIpmiLib/RedfishPlatformCredentialIpmiLib.inf HiiUtilityLib|RedfishPkg/Library/HiiUtilityLib/HiiUtilityLib.inf RedfishPlatformConfigLib|RedfishPkg/Library/RedfishPlatformConfigLib/Red= fishPlatformConfigLib.inf + RedfishHttpLib|RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf !endif diff --git a/RedfishPkg/RedfishPkg.dsc b/RedfishPkg/RedfishPkg.dsc index 5849e7cf9e..b0150043a9 100644 --- a/RedfishPkg/RedfishPkg.dsc +++ b/RedfishPkg/RedfishPkg.dsc @@ -4,7 +4,7 @@ # Copyright (c) 2019 - 2021, Intel Corporation. All rights reserved.
# (C) Copyright 2021 Hewlett-Packard Enterprise Development LP. # Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved. -# Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved= . +# Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights res= erved. # # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -74,5 +74,6 @@ RedfishPkg/Library/RedfishDebugLib/RedfishDebugLib.inf RedfishPkg/Library/HiiUtilityLib/HiiUtilityLib.inf RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.inf + RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf !include RedfishPkg/Redfish.dsc.inc diff --git a/RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf b/Redfish= Pkg/Library/RedfishHttpLib/RedfishHttpLib.inf new file mode 100644 index 0000000000..fd53b8c2ed --- /dev/null +++ b/RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf @@ -0,0 +1,43 @@ +## @file +# Redfish HTTP library is wrapper library for application to call Redfish +# HTTP protocol easily. +# +# Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights re= served. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION =3D 0x00010006 + BASE_NAME =3D RedfishHttpLib + FILE_GUID =3D 62855D9B-441B-436B-9CA6-B7FEB7ABF54E + MODULE_TYPE =3D DXE_DRIVER + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D RedfishHttpLib| DXE_DRIVER UEFI_DRIVE= R + CONSTRUCTOR =3D RedfishHttpConstructor + +# +# VALID_ARCHITECTURES =3D IA32 X64 EBC +# + +[Sources] + RedfishHttpLib.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + RedfishPkg/RedfishPkg.dec + +[LibraryClasses] + BaseLib + DebugLib + UefiLib + UefiBootServicesTableLib + +[Protocols] + gEdkIIRedfishHttpProtocolGuid ## CONSUMES ## + +[depex] + TRUE + diff --git a/RedfishPkg/Include/Library/RedfishHttpLib.h b/RedfishPkg/Inclu= de/Library/RedfishHttpLib.h new file mode 100644 index 0000000000..b07a46993b --- /dev/null +++ b/RedfishPkg/Include/Library/RedfishHttpLib.h @@ -0,0 +1,326 @@ +/** @file + This file defines the Redfish HTTP library interface. + + Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights res= erved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef REDFISH_HTTP_LIB_H_ +#define REDFISH_HTTP_LIB_H_ + +#include + +/** + This function create Redfish service. It's caller's responsibility to fr= ee returned + Redfish service by calling FreeService (). + + @param[in] RedfishConfigServiceInfo Redfish config service informatio= n. + + @retval REDFISH_SERVICE Redfish service is created. + @retval NULL Errors occur. + +**/ +REDFISH_SERVICE +RedfishCreateService ( + IN REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo + ); + +/** + This function free resources in Redfish service. RedfishService is no lo= nger available + after this function returns successfully. + + @param[in] RedfishService Pointer to Redfish service to be released. + + @retval EFI_SUCCESS Resrouce is released successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishCleanupService ( + IN REDFISH_SERVICE RedfishService + ); + +/** + This function returns JSON value in given RedfishPayload. Returned JSON = value + is a reference to the JSON value in RedfishPayload. Any modification to = returned + JSON value will change JSON value in RedfishPayload. + + @param[in] RedfishPayload Pointer to Redfish payload. + + @retval EDKII_JSON_VALUE JSON value is returned. + @retval NULL Errors occur. + +**/ +EDKII_JSON_VALUE +RedfishJsonInPayload ( + IN REDFISH_PAYLOAD RedfishPayload + ); + +/** + This function free resources in Request. Request is no longer available + after this function returns successfully. + + @param[in] Request HTTP request to be released. + + @retval EFI_SUCCESS Resrouce is released successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpFreeRequest ( + IN REDFISH_REQUEST *Request + ); + +/** + This function free resources in Response. Response is no longer availabl= e + after this function returns successfully. + + @param[in] Response HTTP response to be released. + + @retval EFI_SUCCESS Resrouce is released successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpFreeResponse ( + IN REDFISH_RESPONSE *Response + ); + +/** + This function expire the cached response of given URI. + + @param[in] Uri Target response of URI. + + @retval EFI_SUCCESS Target response is expired successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpExpireResponse ( + IN EFI_STRING Uri + ); + +/** + Get redfish resource from given resource URI with cache mechanism + supported. It's caller's responsibility to Response by calling + RedfishHttpFreeResponse (). + + @param[in] Service Redfish service instance to perform HTTP GET. + @param[in] Uri Target resource URI. + @param[in] Request Additional request context. This is optional. + @param[out] Response HTTP response from redfish service. + @param[in] UseCache If it is TRUE, this function will search for + cache first. If it is FALSE, this function + will query Redfish URI directly. + + @retval EFI_SUCCESS Resrouce is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpGetResource ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN REDFISH_REQUEST *Request OPTIONAL, + OUT REDFISH_RESPONSE *Response, + IN BOOLEAN UseCache + ); + +/** + Perform HTTP PATCH to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFree= Response (). + + @param[in] Service Redfish service instance to perform HTTP PATCH= . + @param[in] Uri Target resource URI. + @param[in] Content Data to patch. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resrouce is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPatchResource ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + OUT REDFISH_RESPONSE *Response + ); + +/** + Perform HTTP PATCH to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFree= Response (). + + @param[in] Service Redfish service instance to perform HTTP PATCH= . + @param[in] Uri Target resource URI. + @param[in] Content Data to patch. + @param[in] ContentSize Size of the Content to be send to Redfish serv= ice. + This is optional. When ContentSize is 0, Conte= ntSize + is the size of Content. + @param[in] ContentType Type of the Content to be send to Redfish serv= ice. + This is optional. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resrouce is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPatchResourceEx ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + IN UINTN ContentSize OPTIONAL, + IN CHAR8 *ContentType OPTIONAL, + OUT REDFISH_RESPONSE *Response + ); + +/** + Perform HTTP PUT to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFree= Response (). + + @param[in] Service Redfish service instance to perform HTTP PUT. + @param[in] Uri Target resource URI. + @param[in] Content Data to put. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resrouce is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPutResource ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + OUT REDFISH_RESPONSE *Response + ); + +/** + Perform HTTP PUT to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFree= Response (). + + @param[in] Service Redfish service instance to perform HTTP PUT. + @param[in] Uri Target resource URI. + @param[in] Content Data to put. + @param[in] ContentSize Size of the Content to be send to Redfish serv= ice. + This is optional. When ContentSize is 0, Conte= ntSize + is the size of Content. + @param[in] ContentType Type of the Content to be send to Redfish serv= ice. + This is optional. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resrouce is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPutResourceEx ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + IN UINTN ContentSize OPTIONAL, + IN CHAR8 *ContentType OPTIONAL, + OUT REDFISH_RESPONSE *Response + ); + +/** + Perform HTTP POST to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFree= Response (). + + @param[in] Service Redfish service instance to perform HTTP POST. + @param[in] Uri Target resource URI. + @param[in] Content Data to post. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resrouce is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPostResource ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + OUT REDFISH_RESPONSE *Response + ); + +/** + Perform HTTP POST to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFree= Response (). + + @param[in] Service Redfish service instance to perform HTTP POST. + @param[in] Uri Target resource URI. + @param[in] Content Data to post. + @param[in] ContentSize Size of the Content to be send to Redfish serv= ice. + This is optional. When ContentSize is 0, Conte= ntSize + is the size of Content. + @param[in] ContentType Type of the Content to be send to Redfish serv= ice. + This is optional. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resrouce is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPostResourceEx ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + IN UINTN ContentSize OPTIONAL, + IN CHAR8 *ContentType OPTIONAL, + OUT REDFISH_RESPONSE *Response + ); + +/** + Perform HTTP DELETE to delete redfish resource on given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFree= Response (). + + @param[in] Service Redfish service instance to perform HTTP DELET= E. + @param[in] Uri Target resource URI. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resrouce is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpDeleteResource ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + OUT REDFISH_RESPONSE *Response + ); + +/** + Perform HTTP DELETE to delete redfish resource on given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFree= Response (). + + @param[in] Service Redfish service instance to perform HTTP DELET= E. + @param[in] Uri Target resource URI. + @param[in] Content JSON represented properties to be deleted. Thi= s is + optional. + @param[in] ContentSize Size of the Content to be send to Redfish serv= ice. + This is optional. When ContentSize is 0, Conte= ntSize + is the size of Content if Content is not NULL. + @param[in] ContentType Type of the Content to be send to Redfish serv= ice. + This is optional. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resrouce is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpDeleteResourceEx ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content OPTIONAL, + IN UINTN ContentSize OPTIONAL, + IN CHAR8 *ContentType OPTIONAL, + OUT REDFISH_RESPONSE *Response + ); + +#endif diff --git a/RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.c b/RedfishPk= g/Library/RedfishHttpLib/RedfishHttpLib.c new file mode 100644 index 0000000000..0a17952d63 --- /dev/null +++ b/RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.c @@ -0,0 +1,585 @@ +/** @file + Redfish HTTP cache library helps Redfish application to get Redfish reso= urce + from BMC with cache mechanism enabled. + + Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights res= erved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include + +EDKII_REDFISH_HTTP_PROTOCOL *mRedfishHttpProtocol =3D NULL; + +/** + This function create Redfish service. It's caller's responsibility to fr= ee returned + Redfish service by calling FreeService (). + + @param[in] RedfishConfigServiceInfo Redfish config service informatio= n. + + @retval REDFISH_SERVICE Redfish service is created. + @retval NULL Errors occur. + +**/ +REDFISH_SERVICE +RedfishCreateService ( + IN REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo + ) +{ + if (mRedfishHttpProtocol =3D=3D NULL) { + return NULL; + } + + return mRedfishHttpProtocol->CreateService ( + mRedfishHttpProtocol, + RedfishConfigServiceInfo + ); +} + +/** + This function free resources in Redfish service. RedfishService is no lo= nger available + after this function returns successfully. + + @param[in] RedfishService Pointer to Redfish service to be released. + + @retval EFI_SUCCESS Resrouce is released successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishCleanupService ( + IN REDFISH_SERVICE RedfishService + ) +{ + if (mRedfishHttpProtocol =3D=3D NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->FreeService ( + mRedfishHttpProtocol, + RedfishService + ); +} + +/** + This function returns JSON value in given RedfishPayload. Returned JSON = value + is a reference to the JSON value in RedfishPayload. Any modification to = returned + JSON value will change JSON value in RedfishPayload. + + @param[in] RedfishPayload Pointer to Redfish payload. + + @retval EDKII_JSON_VALUE JSON value is returned. + @retval NULL Errors occur. + +**/ +EDKII_JSON_VALUE +RedfishJsonInPayload ( + IN REDFISH_PAYLOAD RedfishPayload + ) +{ + if (mRedfishHttpProtocol =3D=3D NULL) { + return NULL; + } + + return mRedfishHttpProtocol->JsonInPayload ( + mRedfishHttpProtocol, + RedfishPayload + ); +} + +/** + This function free resources in Request. Request is no longer available + after this function returns successfully. + + @param[in] Request HTTP request to be released. + + @retval EFI_SUCCESS Resrouce is released successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpFreeRequest ( + IN REDFISH_REQUEST *Request + ) +{ + if (mRedfishHttpProtocol =3D=3D NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->FreeRequest ( + mRedfishHttpProtocol, + Request + ); +} + +/** + This function free resources in Response. Response is no longer availabl= e + after this function returns successfully. + + @param[in] Response HTTP response to be released. + + @retval EFI_SUCCESS Resrouce is released successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpFreeResponse ( + IN REDFISH_RESPONSE *Response + ) +{ + if (mRedfishHttpProtocol =3D=3D NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->FreeResponse ( + mRedfishHttpProtocol, + Response + ); +} + +/** + This function expire the cached response of given URI. + + @param[in] Uri Target response of URI. + + @retval EFI_SUCCESS Target response is expired successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpExpireResponse ( + IN EFI_STRING Uri + ) +{ + if (mRedfishHttpProtocol =3D=3D NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->ExpireResponse ( + mRedfishHttpProtocol, + Uri + ); +} + +/** + Get redfish resource from given resource URI with cache mechanism + supported. It's caller's responsibility to Response by calling + RedfishHttpFreeResponse (). + + @param[in] Service Redfish service instance to perform HTTP GET. + @param[in] Uri Target resource URI. + @param[in] Request Additional request context. This is optional. + @param[out] Response HTTP response from redfish service. + @param[in] UseCache If it is TRUE, this function will search for + cache first. If it is FALSE, this function + will query Redfish URI directly. + + @retval EFI_SUCCESS Resrouce is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpGetResource ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN REDFISH_REQUEST *Request OPTIONAL, + OUT REDFISH_RESPONSE *Response, + IN BOOLEAN UseCache + ) +{ + if (mRedfishHttpProtocol =3D=3D NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->GetResource ( + mRedfishHttpProtocol, + Service, + Uri, + Request, + Response, + UseCache + ); +} + +/** + Perform HTTP PATCH to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFree= Response (). + + @param[in] Service Redfish service instance to perform HTTP PATCH= . + @param[in] Uri Target resource URI. + @param[in] Content Data to patch. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resrouce is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPatchResource ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + OUT REDFISH_RESPONSE *Response + ) +{ + if (mRedfishHttpProtocol =3D=3D NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->PatchResource ( + mRedfishHttpProtocol, + Service, + Uri, + Content, + 0, + NULL, + Response + ); +} + +/** + Perform HTTP PATCH to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFree= Response (). + + @param[in] Service Redfish service instance to perform HTTP PATCH= . + @param[in] Uri Target resource URI. + @param[in] Content Data to patch. + @param[in] ContentSize Size of the Content to be send to Redfish serv= ice. + This is optional. When ContentSize is 0, Conte= ntSize + is the size of Content. + @param[in] ContentType Type of the Content to be send to Redfish serv= ice. + This is optional. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resrouce is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPatchResourceEx ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + IN UINTN ContentSize OPTIONAL, + IN CHAR8 *ContentType OPTIONAL, + OUT REDFISH_RESPONSE *Response + ) +{ + if (mRedfishHttpProtocol =3D=3D NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->PatchResource ( + mRedfishHttpProtocol, + Service, + Uri, + Content, + ContentSize, + ContentType, + Response + ); +} + +/** + Perform HTTP PUT to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFree= Response (). + + @param[in] Service Redfish service instance to perform HTTP PUT. + @param[in] Uri Target resource URI. + @param[in] Content Data to put. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resrouce is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPutResource ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + OUT REDFISH_RESPONSE *Response + ) +{ + if (mRedfishHttpProtocol =3D=3D NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->PutResource ( + mRedfishHttpProtocol, + Service, + Uri, + Content, + 0, + NULL, + Response + ); +} + +/** + Perform HTTP PUT to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFree= Response (). + + @param[in] Service Redfish service instance to perform HTTP PUT. + @param[in] Uri Target resource URI. + @param[in] Content Data to put. + @param[in] ContentSize Size of the Content to be send to Redfish serv= ice. + This is optional. When ContentSize is 0, Conte= ntSize + is the size of Content. + @param[in] ContentType Type of the Content to be send to Redfish serv= ice. + This is optional. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resrouce is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPutResourceEx ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + IN UINTN ContentSize OPTIONAL, + IN CHAR8 *ContentType OPTIONAL, + OUT REDFISH_RESPONSE *Response + ) +{ + if (mRedfishHttpProtocol =3D=3D NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->PutResource ( + mRedfishHttpProtocol, + Service, + Uri, + Content, + ContentSize, + ContentType, + Response + ); +} + +/** + Perform HTTP POST to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFree= Response (). + + @param[in] Service Redfish service instance to perform HTTP POST. + @param[in] Uri Target resource URI. + @param[in] Content Data to post. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resrouce is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPostResource ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + OUT REDFISH_RESPONSE *Response + ) +{ + if (mRedfishHttpProtocol =3D=3D NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->PostResource ( + mRedfishHttpProtocol, + Service, + Uri, + Content, + 0, + NULL, + Response + ); +} + +/** + Perform HTTP POST to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFree= Response (). + + @param[in] Service Redfish service instance to perform HTTP POST. + @param[in] Uri Target resource URI. + @param[in] Content Data to post. + @param[in] ContentSize Size of the Content to be send to Redfish serv= ice. + This is optional. When ContentSize is 0, Conte= ntSize + is the size of Content. + @param[in] ContentType Type of the Content to be send to Redfish serv= ice. + This is optional. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resrouce is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPostResourceEx ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + IN UINTN ContentSize OPTIONAL, + IN CHAR8 *ContentType OPTIONAL, + OUT REDFISH_RESPONSE *Response + ) +{ + if (mRedfishHttpProtocol =3D=3D NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->PostResource ( + mRedfishHttpProtocol, + Service, + Uri, + Content, + ContentSize, + ContentType, + Response + ); +} + +/** + Perform HTTP DELETE to delete redfish resource on given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFree= Response (). + + @param[in] Service Redfish service instance to perform HTTP DELET= E. + @param[in] Uri Target resource URI. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resrouce is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpDeleteResource ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + OUT REDFISH_RESPONSE *Response + ) +{ + if (mRedfishHttpProtocol =3D=3D NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->DeleteResource ( + mRedfishHttpProtocol, + Service, + Uri, + NULL, + 0, + NULL, + Response + ); +} + +/** + Perform HTTP DELETE to delete redfish resource on given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFree= Response (). + + @param[in] Service Redfish service instance to perform HTTP DELET= E. + @param[in] Uri Target resource URI. + @param[in] Content JSON represented properties to be deleted. Thi= s is + optional. + @param[in] ContentSize Size of the Content to be send to Redfish serv= ice. + This is optional. When ContentSize is 0, Conte= ntSize + is the size of Content if Content is not NULL. + @param[in] ContentType Type of the Content to be send to Redfish serv= ice. + This is optional. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resrouce is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpDeleteResourceEx ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content OPTIONAL, + IN UINTN ContentSize OPTIONAL, + IN CHAR8 *ContentType OPTIONAL, + OUT REDFISH_RESPONSE *Response + ) +{ + if (mRedfishHttpProtocol =3D=3D NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->DeleteResource ( + mRedfishHttpProtocol, + Service, + Uri, + Content, + ContentSize, + ContentType, + Response + ); +} + +/** + Callback function when gEdkIIRedfishHttpProtocolGuid is installed. + + @param[in] Event Event whose notification function is being invoked. + @param[in] Context Pointer to the notification function's context. +**/ +VOID +EFIAPI +RedfishHttpProtocolIsReady ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_STATUS Status; + + if (mRedfishHttpProtocol !=3D NULL) { + gBS->CloseEvent (Event); + return; + } + + Status =3D gBS->LocateProtocol ( + &gEdkIIRedfishHttpProtocolGuid, + NULL, + (VOID **)&mRedfishHttpProtocol + ); + if (EFI_ERROR (Status)) { + return; + } + + gBS->CloseEvent (Event); +} + +/** + + Initial HTTP library instance. + + @param[in] ImageHandle The image handle. + @param[in] SystemTable The system table. + + @retval EFI_SUCCESS Initial library successfully. + @retval Other Return error status. + +**/ +EFI_STATUS +EFIAPI +RedfishHttpConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + VOID *Registration; + + EfiCreateProtocolNotifyEvent ( + &gEdkIIRedfishHttpProtocolGuid, + TPL_CALLBACK, + RedfishHttpProtocolIsReady, + NULL, + &Registration + ); + + return EFI_SUCCESS; +} -- 2.34.1 -The information contained in this message may be confidential and propriet= ary to American Megatrends (AMI). This communication is intended to be read= only by the individual or entity to whom it is addressed or by their desig= nee. If the reader of this message is not the intended recipient, you are o= n notice that any distribution of this message, in any form, is strictly pr= ohibited. Please promptly notify the sender by reply e-mail or by telephone= at 770-246-8600, and then delete or destroy all copies of the transmission= . -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#115819): https://edk2.groups.io/g/devel/message/115819 Mute This Topic: https://groups.io/mt/104505405/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-