--- /dev/null
+/** @file\r
+ HttpIoLib.h.\r
+\r
+(C) Copyright 2020 Hewlett-Packard Development Company, L.P.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#ifndef HTTP_IO_LIB_H_\r
+#define HTTP_IO_LIB_H_\r
+\r
+#include <IndustryStandard/Http11.h>\r
+\r
+#include <Library/DpcLib.h>\r
+#include <Library/HttpLib.h>\r
+#include <Library/NetLib.h>\r
+\r
+#define HTTP_IO_MAX_SEND_PAYLOAD 1024\r
+#define HTTP_IO_CHUNK_SIZE_STRING_LEN 50\r
+#define HTTP_IO_CHUNKED_TRANSFER_CODING_DATA_LENGTH 256\r
+\r
+///\r
+/// HTTP_IO_CALLBACK_EVENT\r
+///\r
+typedef enum {\r
+ HttpIoRequest,\r
+ HttpIoResponse\r
+} HTTP_IO_CALLBACK_EVENT;\r
+\r
+/**\r
+ HttpIo Callback function which will be invoked when specified HTTP_IO_CALLBACK_EVENT happened.\r
+\r
+ @param[in] EventType Indicate the Event type that occurs in the current callback.\r
+ @param[in] Message HTTP message which will be send to, or just received from HTTP server.\r
+ @param[in] Context The Callback Context pointer.\r
+\r
+ @retval EFI_SUCCESS Tells the HttpIo to continue the HTTP process.\r
+ @retval Others Tells the HttpIo to abort the current HTTP process.\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI * HTTP_IO_CALLBACK) (\r
+ IN HTTP_IO_CALLBACK_EVENT EventType,\r
+ IN EFI_HTTP_MESSAGE *Message,\r
+ IN VOID *Context\r
+ );\r
+\r
+///\r
+/// A wrapper structure to hold the received HTTP response data.\r
+///\r
+typedef struct {\r
+ EFI_HTTP_RESPONSE_DATA Response;\r
+ UINTN HeaderCount;\r
+ EFI_HTTP_HEADER *Headers;\r
+ UINTN BodyLength;\r
+ CHAR8 *Body;\r
+ EFI_STATUS Status;\r
+} HTTP_IO_RESPONSE_DATA;\r
+\r
+///\r
+/// HTTP_IO configuration data for IPv4\r
+///\r
+typedef struct {\r
+ EFI_HTTP_VERSION HttpVersion;\r
+ UINT32 RequestTimeOut; ///< In milliseconds.\r
+ UINT32 ResponseTimeOut; ///< In milliseconds.\r
+ BOOLEAN UseDefaultAddress;\r
+ EFI_IPv4_ADDRESS LocalIp;\r
+ EFI_IPv4_ADDRESS SubnetMask;\r
+ UINT16 LocalPort;\r
+} HTTP4_IO_CONFIG_DATA;\r
+\r
+///\r
+/// HTTP_IO configuration data for IPv6\r
+///\r
+typedef struct {\r
+ EFI_HTTP_VERSION HttpVersion;\r
+ UINT32 RequestTimeOut; ///< In milliseconds.\r
+ BOOLEAN UseDefaultAddress;\r
+ EFI_IPv6_ADDRESS LocalIp;\r
+ UINT16 LocalPort;\r
+} HTTP6_IO_CONFIG_DATA;\r
+\r
+///\r
+/// HTTP_IO configuration\r
+///\r
+typedef union {\r
+ HTTP4_IO_CONFIG_DATA Config4;\r
+ HTTP6_IO_CONFIG_DATA Config6;\r
+} HTTP_IO_CONFIG_DATA;\r
+\r
+///\r
+/// HTTP_IO wrapper of the EFI HTTP service.\r
+///\r
+typedef struct {\r
+ UINT8 IpVersion;\r
+ EFI_HANDLE Image;\r
+ EFI_HANDLE Controller;\r
+ EFI_HANDLE Handle;\r
+\r
+ EFI_HTTP_PROTOCOL *Http;\r
+\r
+ HTTP_IO_CALLBACK Callback;\r
+ VOID *Context;\r
+\r
+ EFI_HTTP_TOKEN ReqToken;\r
+ EFI_HTTP_MESSAGE ReqMessage;\r
+ EFI_HTTP_TOKEN RspToken;\r
+ EFI_HTTP_MESSAGE RspMessage;\r
+\r
+ BOOLEAN IsTxDone;\r
+ BOOLEAN IsRxDone;\r
+\r
+ EFI_EVENT TimeoutEvent;\r
+ UINT32 Timeout;\r
+} HTTP_IO;\r
+\r
+///\r
+/// Process code of HTTP chunk transfer.\r
+///\r
+typedef enum {\r
+ HttpIoSendChunkNone = 0,\r
+ HttpIoSendChunkHeaderZeroContent,\r
+ HttpIoSendChunkContent,\r
+ HttpIoSendChunkEndChunk,\r
+ HttpIoSendChunkFinish\r
+} HTTP_IO_SEND_CHUNK_PROCESS;\r
+\r
+///\r
+/// Process code of HTTP non chunk transfer.\r
+///\r
+typedef enum {\r
+ HttpIoSendNonChunkNone = 0,\r
+ HttpIoSendNonChunkHeaderZeroContent,\r
+ HttpIoSendNonChunkContent,\r
+ HttpIoSendNonChunkFinish\r
+} HTTP_IO_SEND_NON_CHUNK_PROCESS;\r
+\r
+///\r
+/// Chunk links for HTTP chunked transfer coding.\r
+///\r
+typedef struct {\r
+ LIST_ENTRY NextChunk;\r
+ UINTN Length;\r
+ CHAR8 *Data;\r
+} HTTP_IO_CHUNKS;\r
+\r
+/**\r
+ Notify the callback function when an event is triggered.\r
+\r
+ @param[in] Context The opaque parameter to the function.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+HttpIoNotifyDpc (\r
+ IN VOID *Context\r
+ );\r
+\r
+/**\r
+ Request HttpIoNotifyDpc as a DPC at TPL_CALLBACK.\r
+\r
+ @param[in] Event The event signaled.\r
+ @param[in] Context The opaque parameter to the function.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+HttpIoNotify (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ );\r
+\r
+/**\r
+ Destroy the HTTP_IO and release the resources.\r
+\r
+ @param[in] HttpIo The HTTP_IO which wraps the HTTP service to be destroyed.\r
+\r
+**/\r
+VOID\r
+HttpIoDestroyIo (\r
+ IN HTTP_IO *HttpIo\r
+ );\r
+\r
+/**\r
+ Create a HTTP_IO to access the HTTP service. It will create and configure\r
+ a HTTP child handle.\r
+\r
+ @param[in] Image The handle of the driver image.\r
+ @param[in] Controller The handle of the controller.\r
+ @param[in] IpVersion IP_VERSION_4 or IP_VERSION_6.\r
+ @param[in] ConfigData The HTTP_IO configuration data.\r
+ @param[in] Callback Callback function which will be invoked when specified\r
+ HTTP_IO_CALLBACK_EVENT happened.\r
+ @param[in] Context The Context data which will be passed to the Callback function.\r
+ @param[out] HttpIo The HTTP_IO.\r
+\r
+ @retval EFI_SUCCESS The HTTP_IO is created and configured.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+ @retval EFI_UNSUPPORTED One or more of the control options are not\r
+ supported in the implementation.\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.\r
+ @retval Others Failed to create the HTTP_IO or configure it.\r
+\r
+**/\r
+EFI_STATUS\r
+HttpIoCreateIo (\r
+ IN EFI_HANDLE Image,\r
+ IN EFI_HANDLE Controller,\r
+ IN UINT8 IpVersion,\r
+ IN HTTP_IO_CONFIG_DATA *ConfigData,\r
+ IN HTTP_IO_CALLBACK Callback,\r
+ IN VOID *Context,\r
+ OUT HTTP_IO *HttpIo\r
+ );\r
+\r
+/**\r
+ Synchronously send a HTTP REQUEST message to the server.\r
+\r
+ @param[in] HttpIo The HttpIo wrapping the HTTP service.\r
+ @param[in] Request A pointer to storage such data as URL and HTTP method.\r
+ @param[in] HeaderCount Number of HTTP header structures in Headers list.\r
+ @param[in] Headers Array containing list of HTTP headers.\r
+ @param[in] BodyLength Length in bytes of the HTTP body.\r
+ @param[in] Body Body associated with the HTTP request.\r
+\r
+ @retval EFI_SUCCESS The HTTP request is transmitted.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.\r
+ @retval EFI_DEVICE_ERROR An unexpected network or system error occurred.\r
+ @retval Others Other errors as indicated.\r
+\r
+**/\r
+EFI_STATUS\r
+HttpIoSendRequest (\r
+ IN HTTP_IO *HttpIo,\r
+ IN EFI_HTTP_REQUEST_DATA *Request, OPTIONAL\r
+ IN UINTN HeaderCount,\r
+ IN EFI_HTTP_HEADER *Headers, OPTIONAL\r
+ IN UINTN BodyLength,\r
+ IN VOID *Body OPTIONAL\r
+ );\r
+\r
+/**\r
+ Synchronously receive a HTTP RESPONSE message from the server.\r
+\r
+ @param[in] HttpIo The HttpIo wrapping the HTTP service.\r
+ @param[in] RecvMsgHeader TRUE to receive a new HTTP response (from message header).\r
+ FALSE to continue receive the previous response message.\r
+ @param[out] ResponseData Point to a wrapper of the received response data.\r
+\r
+ @retval EFI_SUCCESS The HTTP response is received.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.\r
+ @retval EFI_DEVICE_ERROR An unexpected network or system error occurred.\r
+ @retval Others Other errors as indicated.\r
+\r
+**/\r
+EFI_STATUS\r
+HttpIoRecvResponse (\r
+ IN HTTP_IO *HttpIo,\r
+ IN BOOLEAN RecvMsgHeader,\r
+ OUT HTTP_IO_RESPONSE_DATA *ResponseData\r
+ );\r
+\r
+/**\r
+ Get the value of the content length if there is a "Content-Length" header.\r
+\r
+ @param[in] HeaderCount Number of HTTP header structures in Headers.\r
+ @param[in] Headers Array containing list of HTTP headers.\r
+ @param[out] ContentLength Pointer to save the value of the content length.\r
+\r
+ @retval EFI_SUCCESS Successfully get the content length.\r
+ @retval EFI_NOT_FOUND No "Content-Length" header in the Headers.\r
+\r
+**/\r
+EFI_STATUS\r
+HttpIoGetContentLength (\r
+ IN UINTN HeaderCount,\r
+ IN EFI_HTTP_HEADER *Headers,\r
+ OUT UINTN *ContentLength\r
+ );\r
+\r
+/**\r
+ Synchronously receive a HTTP RESPONSE message from the server.\r
+\r
+ @param[in] HttpIo The HttpIo wrapping the HTTP service.\r
+ @param[in] HeaderCount Number of headers in Headers.\r
+ @param[in] Headers Array containing list of HTTP headers.\r
+ @param[out] ChunkListHead A pointer to receivce list head of chunked data.\r
+ Caller has to release memory of ChunkListHead\r
+ and all list entries.\r
+ @param[out] ContentLength Total content length\r
+\r
+ @retval EFI_SUCCESS The HTTP chunked transfer is received.\r
+ @retval EFI_NOT_FOUND No chunked transfer coding header found.\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.\r
+ @retval EFI_INVALID_PARAMETER Improper parameters.\r
+ @retval Others Other errors as indicated.\r
+\r
+**/\r
+EFI_STATUS\r
+HttpIoGetChunkedTransferContent (\r
+ IN HTTP_IO *HttpIo,\r
+ IN UINTN HeaderCount,\r
+ IN EFI_HTTP_HEADER *Headers,\r
+ OUT LIST_ENTRY **ChunkListHead,\r
+ OUT UINTN *ContentLength\r
+ );\r
+\r
+/**\r
+ Send HTTP request in chunks.\r
+\r
+ @param[in] HttpIo The HttpIo wrapping the HTTP service.\r
+ @param[in] SendChunkProcess Pointer to current chunk process status.\r
+ @param[out] RequestMessage Request to send.\r
+\r
+ @retval EFI_SUCCESS Successfully to send chunk data according to SendChunkProcess.\r
+ @retval Other Other errors.\r
+\r
+**/\r
+EFI_STATUS\r
+HttpIoSendChunkedTransfer (\r
+ IN HTTP_IO *HttpIo,\r
+ IN HTTP_IO_SEND_CHUNK_PROCESS *SendChunkProcess,\r
+ IN EFI_HTTP_MESSAGE *RequestMessage\r
+);\r
+#endif\r