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