]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/Include/Library/HttpIoLib.h
NetworkPkg/Library: Implementation of Http IO Helper Library
[mirror_edk2.git] / NetworkPkg / Include / Library / HttpIoLib.h
diff --git a/NetworkPkg/Include/Library/HttpIoLib.h b/NetworkPkg/Include/Library/HttpIoLib.h
new file mode 100644 (file)
index 0000000..8f3804c
--- /dev/null
@@ -0,0 +1,328 @@
+/** @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