* [edk2-devel] [PATCH 2/3] RedfishPkg/libredfish: introduce new interfaces.
@ 2023-10-24 8:39 Nickle Wang via groups.io
2023-10-26 6:09 ` Chang, Abner via groups.io
0 siblings, 1 reply; 2+ messages in thread
From: Nickle Wang via groups.io @ 2023-10-24 8:39 UTC (permalink / raw)
To: devel; +Cc: Abner Chang, Igor Kulchytskyy, Nick Ramirez
- Add new interfaces to return HTTP headers back to caller.
New interfaces are: getUriFromServiceEx(), patchUriFromServiceEx(),
postUriFromServiceEx() and putUriFromServiceEx().
- Fix compile error in payload.c
Signed-off-by: Nickle Wang <nicklew@nvidia.com>
Cc: Abner Chang <abner.chang@amd.com>
Cc: Igor Kulchytskyy <igork@ami.com>
Cc: Nick Ramirez <nramirez@nvidia.com>
---
.../edk2libredfish/include/redfishPayload.h | 3 +-
.../edk2libredfish/include/redfishService.h | 44 +++
.../RedfishLib/edk2libredfish/src/payload.c | 3 +-
.../RedfishLib/edk2libredfish/src/service.c | 369 ++++++++++++++++--
4 files changed, 394 insertions(+), 25 deletions(-)
diff --git a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishPayload.h b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishPayload.h
index 445153060a2a..25bd0b548192 100644
--- a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishPayload.h
+++ b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishPayload.h
@@ -10,6 +10,7 @@
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
@@ -19,7 +20,7 @@
#define LIBREDFISH_REDFISH_PAYLOAD_H_
#include <Include/Library/RedfishCrtLib.h>
-
+#include <Library/JsonLib.h>
#include <jansson.h>
#include <redfishService.h>
#include <redpath.h>
diff --git a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishService.h b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishService.h
index 75afadc0cece..30f839ea2e8e 100644
--- a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishService.h
+++ b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishService.h
@@ -10,6 +10,7 @@
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
@@ -104,6 +105,15 @@ getUriFromService (
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,
@@ -112,6 +122,16 @@ patchUriFromService (
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,
@@ -122,6 +142,30 @@ postUriFromService (
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,
diff --git a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/payload.c b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/payload.c
index 6c6e2246abe3..8fb24a5928a3 100644
--- a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/payload.c
+++ b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/payload.c
@@ -10,6 +10,7 @@
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
@@ -524,7 +525,7 @@ getOpResult (
}
stringProp = prop->json;
- jsonType = prop->json->type;
+ jsonType = JsonGetType (prop->json);
switch (jsonType) {
case JSON_OBJECT:
stringProp = json_object_get (prop->json, propName);
diff --git a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c
index 286f298e6a35..3377b431f8a5 100644
--- a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c
+++ b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c
@@ -10,6 +10,7 @@
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
@@ -401,10 +402,41 @@ ON_EXIT:
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 *
-getUriFromService (
+getUriFromServiceEx (
redfishService *service,
const char *uri,
+ EFI_HTTP_HEADER **Headers OPTIONAL,
+ UINTN *HeaderCount OPTIONAL,
EFI_HTTP_STATUS_CODE **StatusCode
)
{
@@ -422,13 +454,20 @@ getUriFromService (
}
*StatusCode = NULL;
+ if (HeaderCount != NULL) {
+ *HeaderCount = 0;
+ }
+
+ if (Headers != NULL) {
+ *Headers = NULL;
+ }
url = makeUrlForService (service, uri);
if (!url) {
return NULL;
}
- DEBUG ((DEBUG_MANAGEABILITY, "libredfish: getUriFromService(): %a\n", url));
+ DEBUG ((DEBUG_MANAGEABILITY, "%a: %a\n", __func__, url));
//
// Step 1: Create HTTP request message with 4 headers:
@@ -491,6 +530,23 @@ getUriFromService (
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;
}
@@ -510,6 +566,10 @@ getUriFromService (
**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.
@@ -558,10 +618,14 @@ ON_EXIT:
}
json_t *
-patchUriFromService (
+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
)
{
@@ -581,13 +645,224 @@ patchUriFromService (
}
*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, "libredfish: patchUriFromService(): %a\n", url));
+ DEBUG ((DEBUG_MANAGEABILITY, "%a: %a\n", __func__, url));
//
// Step 1: Create HTTP request message with 4 headers:
@@ -701,6 +976,10 @@ patchUriFromService (
**StatusCode = ResponseMsg.Data.Response->StatusCode;
}
+ if ((ResponseMsg.Headers != NULL) && (Headers != NULL) && (HeaderCount != NULL)) {
+ *Headers = cloneHttpHeaders (&ResponseMsg, HeaderCount);
+ }
+
if (EncodedContent != content) {
FreePool (EncodedContent);
}
@@ -737,12 +1016,14 @@ ON_EXIT:
}
json_t *
-postUriFromService (
+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
)
{
@@ -763,13 +1044,20 @@ postUriFromService (
}
*StatusCode = NULL;
+ if (HeaderCount != NULL) {
+ *HeaderCount = 0;
+ }
+
+ if (Headers != NULL) {
+ *Headers = NULL;
+ }
url = makeUrlForService (service, uri);
if (!url) {
return NULL;
}
- DEBUG ((DEBUG_MANAGEABILITY, "libredfish: postUriFromService(): %a\n", url));
+ DEBUG ((DEBUG_MANAGEABILITY, "%a: %a\n", __func__, url));
if (contentLength == 0) {
contentLength = strlen (content);
@@ -850,7 +1138,12 @@ postUriFromService (
//
Status = service->RestEx->SendReceive (service->RestEx, RequestMsg, &ResponseMsg);
if (EFI_ERROR (Status)) {
- goto ON_EXIT;
+ //
+ // If there is no response to handle, go to error exit.
+ //
+ if (ResponseMsg.Data.Response == NULL) {
+ goto ON_EXIT;
+ }
}
//
@@ -868,15 +1161,20 @@ postUriFromService (
**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 retrive the X-Auth-Token if the HTTP StatusCode is correct.
+ // Step 6: Parsing the HttpHeader to retrieve the X-Auth-Token if the HTTP StatusCode is correct.
//
- if ((ResponseMsg.Data.Response->StatusCode == HTTP_STATUS_200_OK) ||
- (ResponseMsg.Data.Response->StatusCode == HTTP_STATUS_204_NO_CONTENT))
+ 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) {
@@ -886,19 +1184,6 @@ postUriFromService (
service->sessionToken = AllocateCopyPool (AsciiStrSize (HttpHeader->FieldValue), HttpHeader->FieldValue);
}
-
- /*
- //
- // Below opeation seems to be unnecessary.
- // Besides, the FieldValue for the Location is the full HTTP URI (Http://0.0.0.0:5000/XXX), so we can't use it as the
- // parameter of getUriFromService () directly.
- //
- HttpHeader = HttpFindHeader (ResponseMsg.HeaderCount, ResponseMsg.Headers, "Location");
- if (HttpHeader != NULL) {
- ret = getUriFromService(service, HttpHeader->FieldValue);
- goto ON_EXIT;
- }
- */
}
ON_EXIT:
@@ -923,6 +1208,40 @@ ON_EXIT:
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,
@@ -1498,6 +1817,10 @@ makeUrlForService (
}
url = (char *)malloc (strlen (service->host)+strlen (uri)+1);
+ if (url == NULL) {
+ return NULL;
+ }
+
strcpy (url, service->host);
strcat (url, uri);
return url;
--
2.17.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#109992): https://edk2.groups.io/g/devel/message/109992
Mute This Topic: https://groups.io/mt/102154013/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [edk2-devel] [PATCH 2/3] RedfishPkg/libredfish: introduce new interfaces.
2023-10-24 8:39 [edk2-devel] [PATCH 2/3] RedfishPkg/libredfish: introduce new interfaces Nickle Wang via groups.io
@ 2023-10-26 6:09 ` Chang, Abner via groups.io
0 siblings, 0 replies; 2+ messages in thread
From: Chang, Abner via groups.io @ 2023-10-26 6:09 UTC (permalink / raw)
To: Nickle Wang, devel@edk2.groups.io; +Cc: Igor Kulchytskyy, Nick Ramirez
[AMD Official Use Only - General]
Reviewed-by: Abner Chang <abner.chang@amd.com>
> -----Original Message-----
> From: Nickle Wang <nicklew@nvidia.com>
> Sent: Tuesday, October 24, 2023 4:39 PM
> To: devel@edk2.groups.io
> Cc: Chang, Abner <Abner.Chang@amd.com>; Igor Kulchytskyy
> <igork@ami.com>; Nick Ramirez <nramirez@nvidia.com>
> Subject: [PATCH 2/3] RedfishPkg/libredfish: introduce new interfaces.
>
> Caution: This message originated from an External Source. Use proper caution
> when opening attachments, clicking links, or responding.
>
>
> - Add new interfaces to return HTTP headers back to caller.
> New interfaces are: getUriFromServiceEx(), patchUriFromServiceEx(),
> postUriFromServiceEx() and putUriFromServiceEx().
> - Fix compile error in payload.c
>
> Signed-off-by: Nickle Wang <nicklew@nvidia.com>
> Cc: Abner Chang <abner.chang@amd.com>
> Cc: Igor Kulchytskyy <igork@ami.com>
> Cc: Nick Ramirez <nramirez@nvidia.com>
> ---
> .../edk2libredfish/include/redfishPayload.h | 3 +-
> .../edk2libredfish/include/redfishService.h | 44 +++
> .../RedfishLib/edk2libredfish/src/payload.c | 3 +-
> .../RedfishLib/edk2libredfish/src/service.c | 369 ++++++++++++++++--
> 4 files changed, 394 insertions(+), 25 deletions(-)
>
> diff --git
> a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishPayloa
> d.h
> b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishPayloa
> d.h
> index 445153060a2a..25bd0b548192 100644
> ---
> a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishPayloa
> d.h
> +++
> b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishPayloa
> d.h
> @@ -10,6 +10,7 @@
>
> 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
>
> @@ -19,7 +20,7 @@
> #define LIBREDFISH_REDFISH_PAYLOAD_H_
>
> #include <Include/Library/RedfishCrtLib.h>
> -
> +#include <Library/JsonLib.h>
> #include <jansson.h>
> #include <redfishService.h>
> #include <redpath.h>
> diff --git
> a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishService
> .h
> b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishService
> .h
> index 75afadc0cece..30f839ea2e8e 100644
> ---
> a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishService
> .h
> +++
> b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishService
> .h
> @@ -10,6 +10,7 @@
>
> 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
>
> @@ -104,6 +105,15 @@ getUriFromService (
> 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,
> @@ -112,6 +122,16 @@ patchUriFromService (
> 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,
> @@ -122,6 +142,30 @@ postUriFromService (
> 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,
> diff --git a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/payload.c
> b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/payload.c
> index 6c6e2246abe3..8fb24a5928a3 100644
> --- a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/payload.c
> +++ b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/payload.c
> @@ -10,6 +10,7 @@
>
> 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
>
> @@ -524,7 +525,7 @@ getOpResult (
> }
>
> stringProp = prop->json;
> - jsonType = prop->json->type;
> + jsonType = JsonGetType (prop->json);
> switch (jsonType) {
> case JSON_OBJECT:
> stringProp = json_object_get (prop->json, propName);
> diff --git a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c
> b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c
> index 286f298e6a35..3377b431f8a5 100644
> --- a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c
> +++ b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c
> @@ -10,6 +10,7 @@
>
> 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
>
> @@ -401,10 +402,41 @@ ON_EXIT:
> 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 *
> -getUriFromService (
> +getUriFromServiceEx (
> redfishService *service,
> const char *uri,
> + EFI_HTTP_HEADER **Headers OPTIONAL,
> + UINTN *HeaderCount OPTIONAL,
> EFI_HTTP_STATUS_CODE **StatusCode
> )
> {
> @@ -422,13 +454,20 @@ getUriFromService (
> }
>
> *StatusCode = NULL;
> + if (HeaderCount != NULL) {
> + *HeaderCount = 0;
> + }
> +
> + if (Headers != NULL) {
> + *Headers = NULL;
> + }
>
> url = makeUrlForService (service, uri);
> if (!url) {
> return NULL;
> }
>
> - DEBUG ((DEBUG_MANAGEABILITY, "libredfish: getUriFromService(): %a\n",
> url));
> + DEBUG ((DEBUG_MANAGEABILITY, "%a: %a\n", __func__, url));
>
> //
> // Step 1: Create HTTP request message with 4 headers:
> @@ -491,6 +530,23 @@ getUriFromService (
> 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;
> }
>
> @@ -510,6 +566,10 @@ getUriFromService (
> **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.
> @@ -558,10 +618,14 @@ ON_EXIT:
> }
>
> json_t *
> -patchUriFromService (
> +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
> )
> {
> @@ -581,13 +645,224 @@ patchUriFromService (
> }
>
> *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, "libredfish: patchUriFromService():
> %a\n", url));
> + DEBUG ((DEBUG_MANAGEABILITY, "%a: %a\n", __func__, url));
>
> //
> // Step 1: Create HTTP request message with 4 headers:
> @@ -701,6 +976,10 @@ patchUriFromService (
> **StatusCode = ResponseMsg.Data.Response->StatusCode;
> }
>
> + if ((ResponseMsg.Headers != NULL) && (Headers != NULL) &&
> (HeaderCount != NULL)) {
> + *Headers = cloneHttpHeaders (&ResponseMsg, HeaderCount);
> + }
> +
> if (EncodedContent != content) {
> FreePool (EncodedContent);
> }
> @@ -737,12 +1016,14 @@ ON_EXIT:
> }
>
> json_t *
> -postUriFromService (
> +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
> )
> {
> @@ -763,13 +1044,20 @@ postUriFromService (
> }
>
> *StatusCode = NULL;
> + if (HeaderCount != NULL) {
> + *HeaderCount = 0;
> + }
> +
> + if (Headers != NULL) {
> + *Headers = NULL;
> + }
>
> url = makeUrlForService (service, uri);
> if (!url) {
> return NULL;
> }
>
> - DEBUG ((DEBUG_MANAGEABILITY, "libredfish: postUriFromService():
> %a\n", url));
> + DEBUG ((DEBUG_MANAGEABILITY, "%a: %a\n", __func__, url));
>
> if (contentLength == 0) {
> contentLength = strlen (content);
> @@ -850,7 +1138,12 @@ postUriFromService (
> //
> Status = service->RestEx->SendReceive (service->RestEx, RequestMsg,
> &ResponseMsg);
> if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> + //
> + // If there is no response to handle, go to error exit.
> + //
> + if (ResponseMsg.Data.Response == NULL) {
> + goto ON_EXIT;
> + }
> }
>
> //
> @@ -868,15 +1161,20 @@ postUriFromService (
> **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 retrive the X-Auth-Token if the HTTP
> StatusCode is correct.
> + // Step 6: Parsing the HttpHeader to retrieve the X-Auth-Token if the HTTP
> StatusCode is correct.
> //
> - if ((ResponseMsg.Data.Response->StatusCode == HTTP_STATUS_200_OK)
> ||
> - (ResponseMsg.Data.Response->StatusCode ==
> HTTP_STATUS_204_NO_CONTENT))
> + 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) {
> @@ -886,19 +1184,6 @@ postUriFromService (
>
> service->sessionToken = AllocateCopyPool (AsciiStrSize (HttpHeader-
> >FieldValue), HttpHeader->FieldValue);
> }
> -
> - /*
> - //
> - // Below opeation seems to be unnecessary.
> - // Besides, the FieldValue for the Location is the full HTTP URI
> (Http://0.0.0.0:5000/XXX), so we can't use it as the
> - // parameter of getUriFromService () directly.
> - //
> - HttpHeader = HttpFindHeader (ResponseMsg.HeaderCount,
> ResponseMsg.Headers, "Location");
> - if (HttpHeader != NULL) {
> - ret = getUriFromService(service, HttpHeader->FieldValue);
> - goto ON_EXIT;
> - }
> - */
> }
>
> ON_EXIT:
> @@ -923,6 +1208,40 @@ ON_EXIT:
> 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,
> @@ -1498,6 +1817,10 @@ makeUrlForService (
> }
>
> url = (char *)malloc (strlen (service->host)+strlen (uri)+1);
> + if (url == NULL) {
> + return NULL;
> + }
> +
> strcpy (url, service->host);
> strcat (url, uri);
> return url;
> --
> 2.17.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#110075): https://edk2.groups.io/g/devel/message/110075
Mute This Topic: https://groups.io/mt/102154013/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:[~2023-10-26 6:09 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-10-24 8:39 [edk2-devel] [PATCH 2/3] RedfishPkg/libredfish: introduce new interfaces Nickle Wang via groups.io
2023-10-26 6:09 ` 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