]> git.proxmox.com Git - mirror_edk2.git/blobdiff - RedfishPkg/RedfishRestExDxe/RedfishRestExProtocol.c
RedfishPkg/RedfishDebugLib: provide Redfish debug
[mirror_edk2.git] / RedfishPkg / RedfishRestExDxe / RedfishRestExProtocol.c
index f224104ad67363748eb8dc9db0913817fd697cec..3722e1f7956b5a3ba8579b74a48647e64759f105 100644 (file)
@@ -3,6 +3,8 @@
 \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
@@ -66,11 +68,13 @@ RedfishRestExSendReceive (
   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
@@ -87,74 +91,91 @@ RedfishRestExSendReceive (
   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
@@ -195,7 +216,7 @@ ReSendRequest:;
     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
@@ -213,23 +234,35 @@ ReSendRequest:;
   //\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
@@ -239,25 +272,25 @@ ReSendRequest:;
     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
@@ -281,6 +314,7 @@ ReSendRequest:;
     }\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
@@ -394,10 +428,10 @@ ReSendRequest:;
       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