123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329 |
- /** @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
|