/** @file
  Definitions of RedfishHttpOperation

  Copyright (c) 2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.

  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#pragma once

#include "RedfishHttpDxe.h"

#define REDFISH_CONTENT_LENGTH_SIZE              80
#define REDFISH_COMMON_HEADER_SIZE               5
#define REDFISH_HTTP_HEADER_ODATA_VERSION_STR    "OData-Version"
#define REDFISH_HTTP_HEADER_ODATA_VERSION_VALUE  "4.0"
#define REDFISH_HTTP_HEADER_USER_AGENT_VALUE     "edk2redfish"
#define REDFISH_HTTP_HEADER_CONNECTION_STR       "Connection"
#define REDFISH_HTTP_HEADER_CONNECTION_VALUE     "Keep-Alive"
#define REDFISH_HTTP_CONTENT_ENCODING_NONE       "None"
#define ASCII_STR_DUPLICATE(a)  (AllocateCopyPool (AsciiStrSize ((a)), (a)))

/**
  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     Resource is released successfully.
  @retval     Others          Errors occur.

**/
EFI_STATUS
ReleaseRedfishRequest (
  IN  REDFISH_REQUEST  *Request
  );

/**
  This function free resources in given Response.

  @param[in]  Response     HTTP response to be released.

  @retval     EFI_SUCCESS     Resource is released successfully.
  @retval     Others          Errors occur.

**/
EFI_STATUS
ReleaseRedfishResponse (
  IN  REDFISH_RESPONSE  *Response
  );

/**
  This function send Redfish request to Redfish service by calling
  Rest Ex protocol.

  @param[in]   Service       Pointer to Redfish service.
  @param[in]   Uri           Uri of Redfish service.
  @param[in]   Method        HTTP method.
  @param[in]   Request     Request data. This is optional.
  @param[out]  Response    Redfish response data.

  @retval     EFI_SUCCESS     Request is sent and received successfully.
  @retval     Others          Errors occur.

**/
EFI_STATUS
HttpSendReceive (
  IN  REDFISH_SERVICE   Service,
  IN  EFI_STRING        Uri,
  IN  EFI_HTTP_METHOD   Method,
  IN  REDFISH_REQUEST   *Request  OPTIONAL,
  OUT REDFISH_RESPONSE  *Response
  );
