\r
Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>\r
(C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>\r
+ Copyright (c) 2023, American Megatrends International LLC.\r
+ Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\r
\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
HTTP_IO_SEND_NON_CHUNK_PROCESS SendNonChunkProcess;\r
EFI_HTTP_MESSAGE ChunkTransferRequestMessage;\r
\r
- Status = EFI_SUCCESS;\r
- ResponseData = NULL;\r
- IsGetChunkedTransfer = FALSE;\r
- SendChunkProcess = HttpIoSendChunkNone;\r
- SendNonChunkProcess = HttpIoSendNonChunkNone;\r
+ Status = EFI_SUCCESS;\r
+ ResponseData = NULL;\r
+ IsGetChunkedTransfer = FALSE;\r
+ SendChunkProcess = HttpIoSendChunkNone;\r
+ SendNonChunkProcess = HttpIoSendNonChunkNone;\r
+ ItsWrite = FALSE;\r
+ PreservedRequestHeaders = NULL;\r
\r
//\r
// Validate the parameters\r
MediaPresent = TRUE;\r
NetLibDetectMedia (Instance->Service->ControllerHandle, &MediaPresent);\r
if (!MediaPresent) {\r
- DEBUG ((DEBUG_INFO, "RedfishRestExSendReceive(): No MediaPresent.\n"));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "RedfishRestExSendReceive(): No MediaPresent.\n"));\r
return EFI_NO_MEDIA;\r
}\r
\r
- DEBUG ((DEBUG_INFO, "\nRedfishRestExSendReceive():\n"));\r
- DEBUG ((DEBUG_INFO, "*** Perform HTTP Request Method - %d, URL: %s\n", RequestMessage->Data.Request->Method, RequestMessage->Data.Request->Url));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "\nRedfishRestExSendReceive():\n"));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "*** Perform HTTP Request Method - %d, URL: %s\n", RequestMessage->Data.Request->Method, RequestMessage->Data.Request->Url));\r
\r
- //\r
- // Add header "Expect" to server, only for URL write.\r
- //\r
- Status = RedfishHttpAddExpectation (This, RequestMessage, &PreservedRequestHeaders, &ItsWrite);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
+ if (FixedPcdGetBool (PcdRedfishRestExChunkRequestMode)) {\r
+ //\r
+ // Add header "Expect" to server, only for URL write.\r
+ //\r
+ Status = RedfishHttpAddExpectation (This, RequestMessage, &PreservedRequestHeaders, &ItsWrite);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
\r
- if (ItsWrite == TRUE) {\r
- if (RequestMessage->BodyLength > HTTP_IO_MAX_SEND_PAYLOAD) {\r
- //\r
- // Send chunked transfer.\r
- //\r
- SendChunkProcess++;\r
- CopyMem ((VOID *)&ChunkTransferRequestMessage, (VOID *)RequestMessage, sizeof (EFI_HTTP_MESSAGE));\r
- } else {\r
- SendNonChunkProcess++;\r
+ if (ItsWrite == TRUE) {\r
+ if (RequestMessage->BodyLength > HTTP_IO_MAX_SEND_PAYLOAD) {\r
+ //\r
+ // Send chunked transfer.\r
+ //\r
+ SendChunkProcess++;\r
+ CopyMem ((VOID *)&ChunkTransferRequestMessage, (VOID *)RequestMessage, sizeof (EFI_HTTP_MESSAGE));\r
+ } else {\r
+ SendNonChunkProcess++;\r
+ }\r
}\r
}\r
\r
ReSendRequest:;\r
- //\r
- // Send out the request to REST service.\r
- //\r
- if (ItsWrite == TRUE) {\r
+\r
+ if (FixedPcdGetBool (PcdRedfishRestExChunkRequestMode)) {\r
//\r
- // This is write to URI\r
+ // Send the chunked request to REST service.\r
//\r
- if (SendChunkProcess > HttpIoSendChunkNone) {\r
+ if (ItsWrite == TRUE) {\r
//\r
- // This is chunk transfer for writing large payload.\r
- // Send request header first and then handle the\r
- // following request message body using chunk transfer.\r
+ // This is write to URI\r
//\r
- do {\r
- Status = HttpIoSendChunkedTransfer (\r
+ if (SendChunkProcess > HttpIoSendChunkNone) {\r
+ //\r
+ // This is chunk transfer for writing large payload.\r
+ // Send request header first and then handle the\r
+ // following request message body using chunk transfer.\r
+ //\r
+ do {\r
+ Status = HttpIoSendChunkedTransfer (\r
+ &(Instance->HttpIo),\r
+ &SendChunkProcess,\r
+ &ChunkTransferRequestMessage\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto ON_EXIT;\r
+ }\r
+ } while (SendChunkProcess == HttpIoSendChunkContent || SendChunkProcess == HttpIoSendChunkEndChunk);\r
+ } else {\r
+ //\r
+ // This is the non-chunk transfer, send request header first and then\r
+ // handle the following request message body using chunk transfer.\r
+ //\r
+ Status = HttpIoSendRequest (\r
&(Instance->HttpIo),\r
- &SendChunkProcess,\r
- &ChunkTransferRequestMessage\r
+ (SendNonChunkProcess == HttpIoSendNonChunkContent) ? NULL : RequestMessage->Data.Request,\r
+ (SendNonChunkProcess == HttpIoSendNonChunkContent) ? 0 : RequestMessage->HeaderCount,\r
+ (SendNonChunkProcess == HttpIoSendNonChunkContent) ? NULL : RequestMessage->Headers,\r
+ (SendNonChunkProcess == HttpIoSendNonChunkHeaderZeroContent) ? 0 : RequestMessage->BodyLength,\r
+ (SendNonChunkProcess == HttpIoSendNonChunkHeaderZeroContent) ? NULL : RequestMessage->Body\r
);\r
- if (EFI_ERROR (Status)) {\r
- goto ON_EXIT;\r
- }\r
- } while (SendChunkProcess == HttpIoSendChunkContent || SendChunkProcess == HttpIoSendChunkEndChunk);\r
+ }\r
} else {\r
//\r
- // This is the non-chunk transfer, send request header first and then\r
- // handle the following request message body using chunk transfer.\r
+ // This is read from URI.\r
//\r
Status = HttpIoSendRequest (\r
&(Instance->HttpIo),\r
- (SendNonChunkProcess == HttpIoSendNonChunkContent) ? NULL : RequestMessage->Data.Request,\r
- (SendNonChunkProcess == HttpIoSendNonChunkContent) ? 0 : RequestMessage->HeaderCount,\r
- (SendNonChunkProcess == HttpIoSendNonChunkContent) ? NULL : RequestMessage->Headers,\r
- (SendNonChunkProcess == HttpIoSendNonChunkHeaderZeroContent) ? 0 : RequestMessage->BodyLength,\r
- (SendNonChunkProcess == HttpIoSendNonChunkHeaderZeroContent) ? NULL : RequestMessage->Body\r
+ RequestMessage->Data.Request,\r
+ RequestMessage->HeaderCount,\r
+ RequestMessage->Headers,\r
+ RequestMessage->BodyLength,\r
+ RequestMessage->Body\r
);\r
}\r
} else {\r
//\r
- // This is read from URI.\r
+ // This is normal request to URI.\r
//\r
Status = HttpIoSendRequest (\r
&(Instance->HttpIo),\r
goto ON_EXIT;\r
}\r
\r
- DEBUG ((DEBUG_INFO, "Receiving HTTP response and headers...\n"));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "Receiving HTTP response and headers...\n"));\r
Status = RedfishCheckHttpReceiveStatus (\r
Instance,\r
HttpIoRecvResponse (\r
//\r
// Restore the headers if it ever changed in RedfishHttpAddExpectation().\r
//\r
- if (RequestMessage->Headers != PreservedRequestHeaders) {\r
+ if (FixedPcdGetBool (PcdRedfishRestExAddingExpect) && (RequestMessage->Headers != PreservedRequestHeaders)) {\r
FreePool (RequestMessage->Headers);\r
RequestMessage->Headers = PreservedRequestHeaders; // Restore headers before we adding "Expect".\r
RequestMessage->HeaderCount--; // Minus one header count for "Expect".\r
}\r
\r
- DEBUG ((DEBUG_INFO, "HTTP Response StatusCode - %d:", ResponseData->Response.StatusCode));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "HTTP Response StatusCode - %d:", ResponseData->Response.StatusCode));\r
if (ResponseData->Response.StatusCode == HTTP_STATUS_200_OK) {\r
- DEBUG ((DEBUG_INFO, "HTTP_STATUS_200_OK\n"));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "HTTP_STATUS_200_OK\n"));\r
+\r
+ if (FixedPcdGetBool (PcdRedfishRestExChunkRequestMode) && (SendChunkProcess == HttpIoSendChunkHeaderZeroContent)) {\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "This is chunk transfer, start to send all chunks - %d.", ResponseData->Response.StatusCode));\r
+ SendChunkProcess++;\r
+ goto ReSendRequest;\r
+ }\r
+ } else if (ResponseData->Response.StatusCode == HTTP_STATUS_204_NO_CONTENT) {\r
+ DEBUG ((DEBUG_INFO, "HTTP_STATUS_204_NO_CONTENT\n"));\r
\r
- if (SendChunkProcess == HttpIoSendChunkHeaderZeroContent) {\r
- DEBUG ((DEBUG_INFO, "This is chunk transfer, start to send all chunks.", ResponseData->Response.StatusCode));\r
+ if (FixedPcdGetBool (PcdRedfishRestExChunkRequestMode) && (SendChunkProcess == HttpIoSendChunkHeaderZeroContent)) {\r
+ DEBUG ((DEBUG_INFO, "This is chunk transfer, start to send all chunks - %d.", ResponseData->Response.StatusCode));\r
SendChunkProcess++;\r
goto ReSendRequest;\r
}\r
+ } else if (ResponseData->Response.StatusCode == HTTP_STATUS_201_CREATED) {\r
+ DEBUG ((DEBUG_INFO, "HTTP_STATUS_201_CREATED\n"));\r
+ } else if (ResponseData->Response.StatusCode == HTTP_STATUS_202_ACCEPTED) {\r
+ DEBUG ((DEBUG_INFO, "HTTP_STATUS_202_ACCEPTED\n"));\r
} else if (ResponseData->Response.StatusCode == HTTP_STATUS_413_REQUEST_ENTITY_TOO_LARGE) {\r
- DEBUG ((DEBUG_INFO, "HTTP_STATUS_413_REQUEST_ENTITY_TOO_LARGE\n"));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "HTTP_STATUS_413_REQUEST_ENTITY_TOO_LARGE\n"));\r
\r
Status = EFI_BAD_BUFFER_SIZE;\r
goto ON_EXIT;\r
Status = EFI_ACCESS_DENIED;\r
goto ON_EXIT;\r
} else if (ResponseData->Response.StatusCode == HTTP_STATUS_400_BAD_REQUEST) {\r
- DEBUG ((DEBUG_INFO, "HTTP_STATUS_400_BAD_REQUEST\n"));\r
- if (SendChunkProcess == HttpIoSendChunkHeaderZeroContent) {\r
- DEBUG ((DEBUG_INFO, "Bad request may caused by zero length chunk. Try to send all chunks...\n"));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "HTTP_STATUS_400_BAD_REQUEST\n"));\r
+ if (FixedPcdGetBool (PcdRedfishRestExChunkRequestMode) && (SendChunkProcess == HttpIoSendChunkHeaderZeroContent)) {\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "Bad request may caused by zero length chunk. Try to send all chunks...\n"));\r
SendChunkProcess++;\r
goto ReSendRequest;\r
}\r
} else if (ResponseData->Response.StatusCode == HTTP_STATUS_100_CONTINUE) {\r
- DEBUG ((DEBUG_INFO, "HTTP_STATUS_100_CONTINUE\n"));\r
- if (SendChunkProcess == HttpIoSendChunkHeaderZeroContent) {\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "HTTP_STATUS_100_CONTINUE\n"));\r
+ if (FixedPcdGetBool (PcdRedfishRestExChunkRequestMode) && (SendChunkProcess == HttpIoSendChunkHeaderZeroContent)) {\r
//\r
// We get HTTP_STATUS_100_CONTINUE to send the body using chunk transfer.\r
//\r
- DEBUG ((DEBUG_INFO, "HTTP_STATUS_100_CONTINUE for chunk transfer...\n"));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "HTTP_STATUS_100_CONTINUE for chunk transfer...\n"));\r
SendChunkProcess++;\r
goto ReSendRequest;\r
}\r
\r
- if (SendNonChunkProcess == HttpIoSendNonChunkHeaderZeroContent) {\r
- DEBUG ((DEBUG_INFO, "HTTP_STATUS_100_CONTINUE for non chunk transfer...\n"));\r
+ if (FixedPcdGetBool (PcdRedfishRestExChunkRequestMode) && (SendNonChunkProcess == HttpIoSendNonChunkHeaderZeroContent)) {\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "HTTP_STATUS_100_CONTINUE for non chunk transfer...\n"));\r
SendNonChunkProcess++;\r
goto ReSendRequest;\r
}\r
}\r
} else {\r
DEBUG ((DEBUG_ERROR, "This HTTP Status is not handled!\n"));\r
+ DumpHttpStatusCode (DEBUG_REDFISH_NETWORK, ResponseData->Response.StatusCode);\r
Status = EFI_UNSUPPORTED;\r
goto ON_EXIT;\r
}\r
TotalReceivedSize += ResponseData->BodyLength;\r
}\r
\r
- DEBUG ((DEBUG_INFO, "Total of lengh of Response :%d\n", TotalReceivedSize));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "Total of length of Response :%d\n", TotalReceivedSize));\r
}\r
\r
- DEBUG ((DEBUG_INFO, "RedfishRestExSendReceive()- EFI_STATUS: %r\n", Status));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "RedfishRestExSendReceive()- EFI_STATUS: %r\n", Status));\r
\r
ON_EXIT:\r
\r