diff options
Diffstat (limited to 'NetworkPkg/HttpUtilitiesDxe')
-rw-r--r-- | NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.c | 252 | ||||
-rw-r--r-- | NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.h | 424 | ||||
-rw-r--r-- | NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.inf | 102 | ||||
-rw-r--r-- | NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesImpl.c | 558 | ||||
-rw-r--r-- | NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesProtocol.c | 784 |
5 files changed, 1060 insertions, 1060 deletions
diff --git a/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.c b/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.c index 6bd5b6c6af..8c54874b9f 100644 --- a/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.c +++ b/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.c @@ -1,126 +1,126 @@ -/** @file - The DriverEntryPoint and Unload for HttpUtilities driver. - - Copyright (c) 2015, Intel Corporation. All rights reserved.<BR> - - This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php. - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "HttpUtilitiesDxe.h" - - -/** - Unloads an image. - - @param ImageHandle Handle that identifies the image to be unloaded. - - @retval EFI_SUCCESS The image has been unloaded. - @retval EFI_INVALID_PARAMETER ImageHandle is not a valid image handle. - -**/ -EFI_STATUS -EFIAPI -HttpUtilitiesDxeUnload ( - IN EFI_HANDLE ImageHandle - ) -{ - EFI_STATUS Status; - UINTN HandleNum; - EFI_HANDLE *HandleBuffer; - UINT32 Index; - EFI_HTTP_UTILITIES_PROTOCOL *HttpUtilitiesProtocol; - - - HandleBuffer = NULL; - - // - // Locate all the handles with HttpUtilities protocol. - // - Status = gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiHttpUtilitiesProtocolGuid, - NULL, - &HandleNum, - &HandleBuffer - ); - if (EFI_ERROR (Status)) { - return Status; - } - - for (Index = 0; Index < HandleNum; Index++) { - // - // Firstly, find HttpUtilitiesProtocol interface - // - Status = gBS->OpenProtocol ( - HandleBuffer[Index], - &gEfiHttpUtilitiesProtocolGuid, - (VOID **) &HttpUtilitiesProtocol, - ImageHandle, - NULL, - EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Then, uninstall HttpUtilities interface - // - Status = gBS->UninstallMultipleProtocolInterfaces ( - HandleBuffer[Index], - &gEfiHttpUtilitiesProtocolGuid, HttpUtilitiesProtocol, - NULL - ); - if (EFI_ERROR (Status)) { - return Status; - } - } - - return EFI_SUCCESS; -} - - -/** - This is the declaration of an EFI image entry point. This entry point is - the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including - both device drivers and bus drivers. - - @param ImageHandle The firmware allocated handle for the UEFI image. - @param SystemTable A pointer to the EFI System Table. - - @retval EFI_SUCCESS The operation completed successfully. - @retval Others An unexpected error occurred. -**/ -EFI_STATUS -EFIAPI -HttpUtilitiesDxeDriverEntryPoint ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - EFI_STATUS Status; - - EFI_HANDLE Handle; - - Handle = NULL; - - // - // Install the HttpUtilities Protocol onto Handle - // - Status = gBS->InstallMultipleProtocolInterfaces ( - &Handle, - &gEfiHttpUtilitiesProtocolGuid, - &mHttpUtilitiesProtocol, - NULL - ); - - return Status; -} - +/** @file
+ The DriverEntryPoint and Unload for HttpUtilities driver.
+
+ Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php.
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include "HttpUtilitiesDxe.h"
+
+
+/**
+ Unloads an image.
+
+ @param ImageHandle Handle that identifies the image to be unloaded.
+
+ @retval EFI_SUCCESS The image has been unloaded.
+ @retval EFI_INVALID_PARAMETER ImageHandle is not a valid image handle.
+
+**/
+EFI_STATUS
+EFIAPI
+HttpUtilitiesDxeUnload (
+ IN EFI_HANDLE ImageHandle
+ )
+{
+ EFI_STATUS Status;
+ UINTN HandleNum;
+ EFI_HANDLE *HandleBuffer;
+ UINT32 Index;
+ EFI_HTTP_UTILITIES_PROTOCOL *HttpUtilitiesProtocol;
+
+
+ HandleBuffer = NULL;
+
+ //
+ // Locate all the handles with HttpUtilities protocol.
+ //
+ Status = gBS->LocateHandleBuffer (
+ ByProtocol,
+ &gEfiHttpUtilitiesProtocolGuid,
+ NULL,
+ &HandleNum,
+ &HandleBuffer
+ );
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ for (Index = 0; Index < HandleNum; Index++) {
+ //
+ // Firstly, find HttpUtilitiesProtocol interface
+ //
+ Status = gBS->OpenProtocol (
+ HandleBuffer[Index],
+ &gEfiHttpUtilitiesProtocolGuid,
+ (VOID **) &HttpUtilitiesProtocol,
+ ImageHandle,
+ NULL,
+ EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL
+ );
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ //
+ // Then, uninstall HttpUtilities interface
+ //
+ Status = gBS->UninstallMultipleProtocolInterfaces (
+ HandleBuffer[Index],
+ &gEfiHttpUtilitiesProtocolGuid, HttpUtilitiesProtocol,
+ NULL
+ );
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+ }
+
+ return EFI_SUCCESS;
+}
+
+
+/**
+ This is the declaration of an EFI image entry point. This entry point is
+ the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including
+ both device drivers and bus drivers.
+
+ @param ImageHandle The firmware allocated handle for the UEFI image.
+ @param SystemTable A pointer to the EFI System Table.
+
+ @retval EFI_SUCCESS The operation completed successfully.
+ @retval Others An unexpected error occurred.
+**/
+EFI_STATUS
+EFIAPI
+HttpUtilitiesDxeDriverEntryPoint (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ EFI_STATUS Status;
+
+ EFI_HANDLE Handle;
+
+ Handle = NULL;
+
+ //
+ // Install the HttpUtilities Protocol onto Handle
+ //
+ Status = gBS->InstallMultipleProtocolInterfaces (
+ &Handle,
+ &gEfiHttpUtilitiesProtocolGuid,
+ &mHttpUtilitiesProtocol,
+ NULL
+ );
+
+ return Status;
+}
+
diff --git a/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.h b/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.h index 79685abb28..70e993546c 100644 --- a/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.h +++ b/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.h @@ -1,212 +1,212 @@ -/** @file - The header files of Http Utilities functions for HttpUtilities driver. - - Copyright (c) 2015, Intel Corporation. All rights reserved.<BR> - - This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php. - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef __EFI_HTTP_UTILITIES_DXE_H__ -#define __EFI_HTTP_UTILITIES_DXE_H__ - -#include <Uefi.h> - -// -// Libraries -// -#include <Library/UefiBootServicesTableLib.h> -#include <Library/MemoryAllocationLib.h> -#include <Library/BaseMemoryLib.h> -#include <Library/BaseLib.h> -#include <Library/UefiLib.h> -#include <Library/DebugLib.h> - -// -// Consumed Protocols -// -#include <Protocol/HttpUtilities.h> -#include <Protocol/Http.h> - -// -// Protocol instances -// -extern EFI_HTTP_UTILITIES_PROTOCOL mHttpUtilitiesProtocol; - - -/** - Free existing HeaderFields. - - @param[in] HeaderFields Pointer to array of key/value header pairs waitting for free. - @param[in] FieldCount The number of header pairs in HeaderFields. - -**/ -VOID -FreeHeaderFields ( - IN EFI_HTTP_HEADER *HeaderFields, - IN UINTN FieldCount - ); - - -/** - Find required header field in HeaderFields. - - @param[in] HeaderFields Pointer to array of key/value header pairs. - @param[in] FieldCount The number of header pairs. - @param[in] FieldName Pointer to header field's name. - - @return Pointer to the queried header field. - @return NULL if not find this required header field. - -**/ -EFI_HTTP_HEADER * -FindHttpHeader ( - IN EFI_HTTP_HEADER *HeaderFields, - IN UINTN FieldCount, - IN CHAR8 *FieldName - ); - - -/** - Check whether header field called FieldName is in DeleteList. - - @param[in] DeleteList Pointer to array of key/value header pairs. - @param[in] DeleteCount The number of header pairs. - @param[in] FieldName Pointer to header field's name. - - @return TRUE if FieldName is not in DeleteList, that means this header field is valid. - @return FALSE if FieldName is in DeleteList, that means this header field is invalid. - -**/ -BOOLEAN -IsValidHttpHeader ( - IN CHAR8 *DeleteList[], - IN UINTN DeleteCount, - IN CHAR8 *FieldName - ); - - -/** - Set FieldName and FieldValue into specified HttpHeader. - - @param[in] HttpHeader Specified HttpHeader. - @param[in] FieldName FieldName of this HttpHeader. - @param[in] FieldValue FieldValue of this HttpHeader. - - - @retval EFI_SUCCESS The FieldName and FieldValue are set into HttpHeader successfully. - @retval EFI_OUT_OF_RESOURCES Failed to allocate resources. - -**/ -EFI_STATUS -SetFieldNameAndValue ( - IN EFI_HTTP_HEADER *HttpHeader, - IN CHAR8 *FieldName, - IN CHAR8 *FieldValue - ); - - -/** - Get one key/value header pair from the raw string. - - @param[in] String Pointer to the raw string. - @param[out] FieldName Pointer to header field's name. - @param[out] FieldValue Pointer to header field's value. - - @return Pointer to the next raw string. - @return NULL if no key/value header pair from this raw string. - -**/ -CHAR8 * -GetFieldNameAndValue ( - IN CHAR8 *String, - OUT CHAR8 **FieldName, - OUT CHAR8 **FieldValue - ); - - -/** - Create HTTP header based on a combination of seed header, fields - to delete, and fields to append. - - The Build() function is used to manage the headers portion of an - HTTP message by providing the ability to add, remove, or replace - HTTP headers. - - @param[in] This Pointer to EFI_HTTP_UTILITIES_PROTOCOL instance. - @param[in] SeedMessageSize Size of the initial HTTP header. This can be zero. - @param[in] SeedMessage Initial HTTP header to be used as a base for - building a new HTTP header. If NULL, - SeedMessageSize is ignored. - @param[in] DeleteCount Number of null-terminated HTTP header field names - in DeleteList. - @param[in] DeleteList List of null-terminated HTTP header field names to - remove from SeedMessage. Only the field names are - in this list because the field values are irrelevant - to this operation. - @param[in] AppendCount Number of header fields in AppendList. - @param[in] AppendList List of HTTP headers to populate NewMessage with. - If SeedMessage is not NULL, AppendList will be - appended to the existing list from SeedMessage in - NewMessage. - @param[out] NewMessageSize Pointer to number of header fields in NewMessage. - @param[out] NewMessage Pointer to a new list of HTTP headers based on. - - @retval EFI_SUCCESS Add, remove, and replace operations succeeded. - @retval EFI_OUT_OF_RESOURCES Could not allocate memory for NewMessage. - @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE: - This is NULL. -**/ -EFI_STATUS -EFIAPI -HttpUtilitiesBuild ( - IN EFI_HTTP_UTILITIES_PROTOCOL *This, - IN UINTN SeedMessageSize, - IN VOID *SeedMessage, OPTIONAL - IN UINTN DeleteCount, - IN CHAR8 *DeleteList[], OPTIONAL - IN UINTN AppendCount, - IN EFI_HTTP_HEADER *AppendList[], OPTIONAL - OUT UINTN *NewMessageSize, - OUT VOID **NewMessage - ); - - -/** - Parses HTTP header and produces an array of key/value pairs. - - The Parse() function is used to transform data stored in HttpHeader - into a list of fields paired with their corresponding values. - - @param[in] This Pointer to EFI_HTTP_UTILITIES_PROTOCOL instance. - @param[in] HttpMessage Contains raw unformatted HTTP header string. - @param[in] HttpMessageSize Size of HTTP header. - @param[out] HeaderFields Array of key/value header pairs. - @param[out] FieldCount Number of headers in HeaderFields. - - @retval EFI_SUCCESS Allocation succeeded. - @retval EFI_NOT_STARTED This EFI HTTP Protocol instance has not been - initialized. - @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE: - This is NULL. - HttpMessage is NULL. - HeaderFields is NULL. - FieldCount is NULL. -**/ -EFI_STATUS -EFIAPI -HttpUtilitiesParse ( - IN EFI_HTTP_UTILITIES_PROTOCOL *This, - IN CHAR8 *HttpMessage, - IN UINTN HttpMessageSize, - OUT EFI_HTTP_HEADER **HeaderFields, - OUT UINTN *FieldCount - ); - -#endif +/** @file
+ The header files of Http Utilities functions for HttpUtilities driver.
+
+ Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php.
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __EFI_HTTP_UTILITIES_DXE_H__
+#define __EFI_HTTP_UTILITIES_DXE_H__
+
+#include <Uefi.h>
+
+//
+// Libraries
+//
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/BaseLib.h>
+#include <Library/UefiLib.h>
+#include <Library/DebugLib.h>
+
+//
+// Consumed Protocols
+//
+#include <Protocol/HttpUtilities.h>
+#include <Protocol/Http.h>
+
+//
+// Protocol instances
+//
+extern EFI_HTTP_UTILITIES_PROTOCOL mHttpUtilitiesProtocol;
+
+
+/**
+ Free existing HeaderFields.
+
+ @param[in] HeaderFields Pointer to array of key/value header pairs waitting for free.
+ @param[in] FieldCount The number of header pairs in HeaderFields.
+
+**/
+VOID
+FreeHeaderFields (
+ IN EFI_HTTP_HEADER *HeaderFields,
+ IN UINTN FieldCount
+ );
+
+
+/**
+ Find required header field in HeaderFields.
+
+ @param[in] HeaderFields Pointer to array of key/value header pairs.
+ @param[in] FieldCount The number of header pairs.
+ @param[in] FieldName Pointer to header field's name.
+
+ @return Pointer to the queried header field.
+ @return NULL if not find this required header field.
+
+**/
+EFI_HTTP_HEADER *
+FindHttpHeader (
+ IN EFI_HTTP_HEADER *HeaderFields,
+ IN UINTN FieldCount,
+ IN CHAR8 *FieldName
+ );
+
+
+/**
+ Check whether header field called FieldName is in DeleteList.
+
+ @param[in] DeleteList Pointer to array of key/value header pairs.
+ @param[in] DeleteCount The number of header pairs.
+ @param[in] FieldName Pointer to header field's name.
+
+ @return TRUE if FieldName is not in DeleteList, that means this header field is valid.
+ @return FALSE if FieldName is in DeleteList, that means this header field is invalid.
+
+**/
+BOOLEAN
+IsValidHttpHeader (
+ IN CHAR8 *DeleteList[],
+ IN UINTN DeleteCount,
+ IN CHAR8 *FieldName
+ );
+
+
+/**
+ Set FieldName and FieldValue into specified HttpHeader.
+
+ @param[in] HttpHeader Specified HttpHeader.
+ @param[in] FieldName FieldName of this HttpHeader.
+ @param[in] FieldValue FieldValue of this HttpHeader.
+
+
+ @retval EFI_SUCCESS The FieldName and FieldValue are set into HttpHeader successfully.
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.
+
+**/
+EFI_STATUS
+SetFieldNameAndValue (
+ IN EFI_HTTP_HEADER *HttpHeader,
+ IN CHAR8 *FieldName,
+ IN CHAR8 *FieldValue
+ );
+
+
+/**
+ Get one key/value header pair from the raw string.
+
+ @param[in] String Pointer to the raw string.
+ @param[out] FieldName Pointer to header field's name.
+ @param[out] FieldValue Pointer to header field's value.
+
+ @return Pointer to the next raw string.
+ @return NULL if no key/value header pair from this raw string.
+
+**/
+CHAR8 *
+GetFieldNameAndValue (
+ IN CHAR8 *String,
+ OUT CHAR8 **FieldName,
+ OUT CHAR8 **FieldValue
+ );
+
+
+/**
+ Create HTTP header based on a combination of seed header, fields
+ to delete, and fields to append.
+
+ The Build() function is used to manage the headers portion of an
+ HTTP message by providing the ability to add, remove, or replace
+ HTTP headers.
+
+ @param[in] This Pointer to EFI_HTTP_UTILITIES_PROTOCOL instance.
+ @param[in] SeedMessageSize Size of the initial HTTP header. This can be zero.
+ @param[in] SeedMessage Initial HTTP header to be used as a base for
+ building a new HTTP header. If NULL,
+ SeedMessageSize is ignored.
+ @param[in] DeleteCount Number of null-terminated HTTP header field names
+ in DeleteList.
+ @param[in] DeleteList List of null-terminated HTTP header field names to
+ remove from SeedMessage. Only the field names are
+ in this list because the field values are irrelevant
+ to this operation.
+ @param[in] AppendCount Number of header fields in AppendList.
+ @param[in] AppendList List of HTTP headers to populate NewMessage with.
+ If SeedMessage is not NULL, AppendList will be
+ appended to the existing list from SeedMessage in
+ NewMessage.
+ @param[out] NewMessageSize Pointer to number of header fields in NewMessage.
+ @param[out] NewMessage Pointer to a new list of HTTP headers based on.
+
+ @retval EFI_SUCCESS Add, remove, and replace operations succeeded.
+ @retval EFI_OUT_OF_RESOURCES Could not allocate memory for NewMessage.
+ @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
+ This is NULL.
+**/
+EFI_STATUS
+EFIAPI
+HttpUtilitiesBuild (
+ IN EFI_HTTP_UTILITIES_PROTOCOL *This,
+ IN UINTN SeedMessageSize,
+ IN VOID *SeedMessage, OPTIONAL
+ IN UINTN DeleteCount,
+ IN CHAR8 *DeleteList[], OPTIONAL
+ IN UINTN AppendCount,
+ IN EFI_HTTP_HEADER *AppendList[], OPTIONAL
+ OUT UINTN *NewMessageSize,
+ OUT VOID **NewMessage
+ );
+
+
+/**
+ Parses HTTP header and produces an array of key/value pairs.
+
+ The Parse() function is used to transform data stored in HttpHeader
+ into a list of fields paired with their corresponding values.
+
+ @param[in] This Pointer to EFI_HTTP_UTILITIES_PROTOCOL instance.
+ @param[in] HttpMessage Contains raw unformatted HTTP header string.
+ @param[in] HttpMessageSize Size of HTTP header.
+ @param[out] HeaderFields Array of key/value header pairs.
+ @param[out] FieldCount Number of headers in HeaderFields.
+
+ @retval EFI_SUCCESS Allocation succeeded.
+ @retval EFI_NOT_STARTED This EFI HTTP Protocol instance has not been
+ initialized.
+ @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
+ This is NULL.
+ HttpMessage is NULL.
+ HeaderFields is NULL.
+ FieldCount is NULL.
+**/
+EFI_STATUS
+EFIAPI
+HttpUtilitiesParse (
+ IN EFI_HTTP_UTILITIES_PROTOCOL *This,
+ IN CHAR8 *HttpMessage,
+ IN UINTN HttpMessageSize,
+ OUT EFI_HTTP_HEADER **HeaderFields,
+ OUT UINTN *FieldCount
+ );
+
+#endif
diff --git a/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.inf b/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.inf index a89149a4ac..c101e6f73c 100644 --- a/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.inf +++ b/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.inf @@ -1,51 +1,51 @@ -## @file -# Implementation of EFI Http Utilities Protocol interfaces. -# -# Copyright (c) 2015, Intel Corporation. All rights reserved.<BR> -# -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php. -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# -# -## - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = HttpUtilitiesDxe - FILE_GUID = 22ea234f-e72a-11e4-91f9-28d2447c4829 - MODULE_TYPE = DXE_DRIVER - VERSION_STRING = 1.0 - ENTRY_POINT = HttpUtilitiesDxeDriverEntryPoint - UNLOAD_IMAGE = HttpUtilitiesDxeUnload - -[Packages] - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - -[Sources] - HttpUtilitiesDxe.h - HttpUtilitiesDxe.c - HttpUtilitiesImpl.c - HttpUtilitiesProtocol.c - -[LibraryClasses] - UefiDriverEntryPoint - UefiBootServicesTableLib - MemoryAllocationLib - BaseMemoryLib - BaseLib - UefiLib - DebugLib - -[Protocols] - gEfiHttpUtilitiesProtocolGuid ## PRODUCES - -[Depex] - TRUE - -[Guids] - +## @file
+# Implementation of EFI Http Utilities Protocol interfaces.
+#
+# Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php.
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = HttpUtilitiesDxe
+ FILE_GUID = 22ea234f-e72a-11e4-91f9-28d2447c4829
+ MODULE_TYPE = DXE_DRIVER
+ VERSION_STRING = 1.0
+ ENTRY_POINT = HttpUtilitiesDxeDriverEntryPoint
+ UNLOAD_IMAGE = HttpUtilitiesDxeUnload
+
+[Packages]
+ MdePkg/MdePkg.dec
+ MdeModulePkg/MdeModulePkg.dec
+
+[Sources]
+ HttpUtilitiesDxe.h
+ HttpUtilitiesDxe.c
+ HttpUtilitiesImpl.c
+ HttpUtilitiesProtocol.c
+
+[LibraryClasses]
+ UefiDriverEntryPoint
+ UefiBootServicesTableLib
+ MemoryAllocationLib
+ BaseMemoryLib
+ BaseLib
+ UefiLib
+ DebugLib
+
+[Protocols]
+ gEfiHttpUtilitiesProtocolGuid ## PRODUCES
+
+[Depex]
+ TRUE
+
+[Guids]
+
diff --git a/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesImpl.c b/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesImpl.c index 78047c8e24..adb50af393 100644 --- a/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesImpl.c +++ b/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesImpl.c @@ -1,279 +1,279 @@ -/** @file - The functions for HttpUtilities driver. - - Copyright (c) 2015, Intel Corporation. All rights reserved.<BR> - - This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php. - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "HttpUtilitiesDxe.h" - - -/** - Get the next string, which is distinguished by specified seperator. - - @param[in] String Pointer to the string. - @param[in] Seperator Specified seperator used to distinguish where is the beginning - of next string. - - @return Pointer to the next string. - @return NULL if not find or String is NULL. - -**/ -CHAR8 * -AsciiStrGetNextToken ( - IN CONST CHAR8 *String, - IN CHAR8 Seperator - ) -{ - CONST CHAR8 *Token; - - Token = String; - while (TRUE) { - if (*Token == 0) { - return NULL; - } - if (*Token == Seperator) { - return (CHAR8 *)(Token + 1); - } - Token++; - } -} - - -/** - Free existing HeaderFields. - - @param[in] HeaderFields Pointer to array of key/value header pairs waitting for free. - @param[in] FieldCount The number of header pairs in HeaderFields. - -**/ -VOID -FreeHeaderFields ( - IN EFI_HTTP_HEADER *HeaderFields, - IN UINTN FieldCount - ) -{ - UINTN Index; - - if (HeaderFields != NULL) { - for (Index = 0; Index < FieldCount; Index++) { - if (HeaderFields[Index].FieldName != NULL) { - FreePool (HeaderFields[Index].FieldName); - } - if (HeaderFields[Index].FieldValue != NULL) { - FreePool (HeaderFields[Index].FieldValue); - } - } - - FreePool (HeaderFields); - } -} - - -/** - Find required header field in HeaderFields. - - @param[in] HeaderFields Pointer to array of key/value header pairs. - @param[in] FieldCount The number of header pairs. - @param[in] FieldName Pointer to header field's name. - - @return Pointer to the queried header field. - @return NULL if not find this required header field. - -**/ -EFI_HTTP_HEADER * -FindHttpHeader ( - IN EFI_HTTP_HEADER *HeaderFields, - IN UINTN FieldCount, - IN CHAR8 *FieldName - ) -{ - UINTN Index; - - for (Index = 0; Index < FieldCount; Index++) { - if (AsciiStrCmp (FieldName, HeaderFields[Index].FieldName) == 0) { - // - // Find the required header field. - // - return &HeaderFields[Index]; - } - } - return NULL; -} - - -/** - Check whether header field called FieldName is in DeleteList. - - @param[in] DeleteList Pointer to array of key/value header pairs. - @param[in] DeleteCount The number of header pairs. - @param[in] FieldName Pointer to header field's name. - - @return TRUE if FieldName is not in DeleteList, that means this header field is valid. - @return FALSE if FieldName is in DeleteList, that means this header field is invalid. - -**/ -BOOLEAN -IsValidHttpHeader ( - IN CHAR8 *DeleteList[], - IN UINTN DeleteCount, - IN CHAR8 *FieldName - ) -{ - UINTN Index; - - for (Index = 0; Index < DeleteCount; Index++) { - if (AsciiStrCmp (FieldName, DeleteList[Index]) == 0) { - return FALSE; - } - } - - return TRUE; -} - - -/** - Set FieldName and FieldValue into specified HttpHeader. - - @param[in] HttpHeader Specified HttpHeader. - @param[in] FieldName FieldName of this HttpHeader. - @param[in] FieldValue FieldValue of this HttpHeader. - - - @retval EFI_SUCCESS The FieldName and FieldValue are set into HttpHeader successfully. - @retval EFI_OUT_OF_RESOURCES Failed to allocate resources. - -**/ -EFI_STATUS -SetFieldNameAndValue ( - IN EFI_HTTP_HEADER *HttpHeader, - IN CHAR8 *FieldName, - IN CHAR8 *FieldValue - ) -{ - UINTN FieldNameSize; - UINTN FieldValueSize; - - if (HttpHeader->FieldName != NULL) { - FreePool (HttpHeader->FieldName); - } - if (HttpHeader->FieldValue != NULL) { - FreePool (HttpHeader->FieldValue); - } - - FieldNameSize = AsciiStrSize (FieldName); - HttpHeader->FieldName = AllocateZeroPool (FieldNameSize); - if (HttpHeader->FieldName == NULL) { - return EFI_OUT_OF_RESOURCES; - } - CopyMem (HttpHeader->FieldName, FieldName, FieldNameSize); - HttpHeader->FieldName[FieldNameSize - 1] = 0; - - FieldValueSize = AsciiStrSize (FieldValue); - HttpHeader->FieldValue = AllocateZeroPool (FieldValueSize); - if (HttpHeader->FieldValue == NULL) { - return EFI_OUT_OF_RESOURCES; - } - CopyMem (HttpHeader->FieldValue, FieldValue, FieldValueSize); - HttpHeader->FieldValue[FieldValueSize - 1] = 0; - - return EFI_SUCCESS; -} - - -/** - Get one key/value header pair from the raw string. - - @param[in] String Pointer to the raw string. - @param[out] FieldName Pointer to header field's name. - @param[out] FieldValue Pointer to header field's value. - - @return Pointer to the next raw string. - @return NULL if no key/value header pair from this raw string. - -**/ -CHAR8 * -GetFieldNameAndValue ( - IN CHAR8 *String, - OUT CHAR8 **FieldName, - OUT CHAR8 **FieldValue - ) -{ - CHAR8 *FieldNameStr; - CHAR8 *FieldValueStr; - CHAR8 *StrPtr; - - if (String == NULL || FieldName == NULL || FieldValue == NULL) { - return NULL; - } - - *FieldName = NULL; - *FieldValue = NULL; - FieldNameStr = NULL; - FieldValueStr = NULL; - StrPtr = NULL; - - // - // Each header field consists of a name followed by a colon (":") and the field value. - // - FieldNameStr = String; - FieldValueStr = AsciiStrGetNextToken (FieldNameStr, ':'); - if (FieldValueStr == NULL) { - return NULL; - } - - // - // Replace ':' with 0 - // - *(FieldValueStr - 1) = 0; - - // - // The field value MAY be preceded by any amount of LWS, though a single SP is preferred. - // - while (TRUE) { - if (*FieldValueStr == ' ' || *FieldValueStr == '\t') { - FieldValueStr ++; - } else if (*FieldValueStr == '\r' && *(FieldValueStr + 1) == '\n' && - (*(FieldValueStr + 2) == ' ' || *(FieldValueStr + 2) == '\t')) { - FieldValueStr = FieldValueStr + 3; - } else { - break; - } - } - - // - // Header fields can be extended over multiple lines by preceding each extra - // line with at least one SP or HT. - // - StrPtr = FieldValueStr; - do { - StrPtr = AsciiStrGetNextToken (StrPtr, '\r'); - if (StrPtr == NULL || *StrPtr != '\n') { - return NULL; - } - - StrPtr++; - } while (*StrPtr == ' ' || *StrPtr == '\t'); - - // - // Replace '\r' with 0 - // - *(StrPtr - 2) = 0; - - // - // Get FieldName and FieldValue. - // - *FieldName = FieldNameStr; - *FieldValue = FieldValueStr; - - return StrPtr; -} - +/** @file
+ The functions for HttpUtilities driver.
+
+ Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php.
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include "HttpUtilitiesDxe.h"
+
+
+/**
+ Get the next string, which is distinguished by specified seperator.
+
+ @param[in] String Pointer to the string.
+ @param[in] Seperator Specified seperator used to distinguish where is the beginning
+ of next string.
+
+ @return Pointer to the next string.
+ @return NULL if not find or String is NULL.
+
+**/
+CHAR8 *
+AsciiStrGetNextToken (
+ IN CONST CHAR8 *String,
+ IN CHAR8 Seperator
+ )
+{
+ CONST CHAR8 *Token;
+
+ Token = String;
+ while (TRUE) {
+ if (*Token == 0) {
+ return NULL;
+ }
+ if (*Token == Seperator) {
+ return (CHAR8 *)(Token + 1);
+ }
+ Token++;
+ }
+}
+
+
+/**
+ Free existing HeaderFields.
+
+ @param[in] HeaderFields Pointer to array of key/value header pairs waitting for free.
+ @param[in] FieldCount The number of header pairs in HeaderFields.
+
+**/
+VOID
+FreeHeaderFields (
+ IN EFI_HTTP_HEADER *HeaderFields,
+ IN UINTN FieldCount
+ )
+{
+ UINTN Index;
+
+ if (HeaderFields != NULL) {
+ for (Index = 0; Index < FieldCount; Index++) {
+ if (HeaderFields[Index].FieldName != NULL) {
+ FreePool (HeaderFields[Index].FieldName);
+ }
+ if (HeaderFields[Index].FieldValue != NULL) {
+ FreePool (HeaderFields[Index].FieldValue);
+ }
+ }
+
+ FreePool (HeaderFields);
+ }
+}
+
+
+/**
+ Find required header field in HeaderFields.
+
+ @param[in] HeaderFields Pointer to array of key/value header pairs.
+ @param[in] FieldCount The number of header pairs.
+ @param[in] FieldName Pointer to header field's name.
+
+ @return Pointer to the queried header field.
+ @return NULL if not find this required header field.
+
+**/
+EFI_HTTP_HEADER *
+FindHttpHeader (
+ IN EFI_HTTP_HEADER *HeaderFields,
+ IN UINTN FieldCount,
+ IN CHAR8 *FieldName
+ )
+{
+ UINTN Index;
+
+ for (Index = 0; Index < FieldCount; Index++) {
+ if (AsciiStrCmp (FieldName, HeaderFields[Index].FieldName) == 0) {
+ //
+ // Find the required header field.
+ //
+ return &HeaderFields[Index];
+ }
+ }
+ return NULL;
+}
+
+
+/**
+ Check whether header field called FieldName is in DeleteList.
+
+ @param[in] DeleteList Pointer to array of key/value header pairs.
+ @param[in] DeleteCount The number of header pairs.
+ @param[in] FieldName Pointer to header field's name.
+
+ @return TRUE if FieldName is not in DeleteList, that means this header field is valid.
+ @return FALSE if FieldName is in DeleteList, that means this header field is invalid.
+
+**/
+BOOLEAN
+IsValidHttpHeader (
+ IN CHAR8 *DeleteList[],
+ IN UINTN DeleteCount,
+ IN CHAR8 *FieldName
+ )
+{
+ UINTN Index;
+
+ for (Index = 0; Index < DeleteCount; Index++) {
+ if (AsciiStrCmp (FieldName, DeleteList[Index]) == 0) {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+
+/**
+ Set FieldName and FieldValue into specified HttpHeader.
+
+ @param[in] HttpHeader Specified HttpHeader.
+ @param[in] FieldName FieldName of this HttpHeader.
+ @param[in] FieldValue FieldValue of this HttpHeader.
+
+
+ @retval EFI_SUCCESS The FieldName and FieldValue are set into HttpHeader successfully.
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.
+
+**/
+EFI_STATUS
+SetFieldNameAndValue (
+ IN EFI_HTTP_HEADER *HttpHeader,
+ IN CHAR8 *FieldName,
+ IN CHAR8 *FieldValue
+ )
+{
+ UINTN FieldNameSize;
+ UINTN FieldValueSize;
+
+ if (HttpHeader->FieldName != NULL) {
+ FreePool (HttpHeader->FieldName);
+ }
+ if (HttpHeader->FieldValue != NULL) {
+ FreePool (HttpHeader->FieldValue);
+ }
+
+ FieldNameSize = AsciiStrSize (FieldName);
+ HttpHeader->FieldName = AllocateZeroPool (FieldNameSize);
+ if (HttpHeader->FieldName == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+ CopyMem (HttpHeader->FieldName, FieldName, FieldNameSize);
+ HttpHeader->FieldName[FieldNameSize - 1] = 0;
+
+ FieldValueSize = AsciiStrSize (FieldValue);
+ HttpHeader->FieldValue = AllocateZeroPool (FieldValueSize);
+ if (HttpHeader->FieldValue == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+ CopyMem (HttpHeader->FieldValue, FieldValue, FieldValueSize);
+ HttpHeader->FieldValue[FieldValueSize - 1] = 0;
+
+ return EFI_SUCCESS;
+}
+
+
+/**
+ Get one key/value header pair from the raw string.
+
+ @param[in] String Pointer to the raw string.
+ @param[out] FieldName Pointer to header field's name.
+ @param[out] FieldValue Pointer to header field's value.
+
+ @return Pointer to the next raw string.
+ @return NULL if no key/value header pair from this raw string.
+
+**/
+CHAR8 *
+GetFieldNameAndValue (
+ IN CHAR8 *String,
+ OUT CHAR8 **FieldName,
+ OUT CHAR8 **FieldValue
+ )
+{
+ CHAR8 *FieldNameStr;
+ CHAR8 *FieldValueStr;
+ CHAR8 *StrPtr;
+
+ if (String == NULL || FieldName == NULL || FieldValue == NULL) {
+ return NULL;
+ }
+
+ *FieldName = NULL;
+ *FieldValue = NULL;
+ FieldNameStr = NULL;
+ FieldValueStr = NULL;
+ StrPtr = NULL;
+
+ //
+ // Each header field consists of a name followed by a colon (":") and the field value.
+ //
+ FieldNameStr = String;
+ FieldValueStr = AsciiStrGetNextToken (FieldNameStr, ':');
+ if (FieldValueStr == NULL) {
+ return NULL;
+ }
+
+ //
+ // Replace ':' with 0
+ //
+ *(FieldValueStr - 1) = 0;
+
+ //
+ // The field value MAY be preceded by any amount of LWS, though a single SP is preferred.
+ //
+ while (TRUE) {
+ if (*FieldValueStr == ' ' || *FieldValueStr == '\t') {
+ FieldValueStr ++;
+ } else if (*FieldValueStr == '\r' && *(FieldValueStr + 1) == '\n' &&
+ (*(FieldValueStr + 2) == ' ' || *(FieldValueStr + 2) == '\t')) {
+ FieldValueStr = FieldValueStr + 3;
+ } else {
+ break;
+ }
+ }
+
+ //
+ // Header fields can be extended over multiple lines by preceding each extra
+ // line with at least one SP or HT.
+ //
+ StrPtr = FieldValueStr;
+ do {
+ StrPtr = AsciiStrGetNextToken (StrPtr, '\r');
+ if (StrPtr == NULL || *StrPtr != '\n') {
+ return NULL;
+ }
+
+ StrPtr++;
+ } while (*StrPtr == ' ' || *StrPtr == '\t');
+
+ //
+ // Replace '\r' with 0
+ //
+ *(StrPtr - 2) = 0;
+
+ //
+ // Get FieldName and FieldValue.
+ //
+ *FieldName = FieldNameStr;
+ *FieldValue = FieldValueStr;
+
+ return StrPtr;
+}
+
diff --git a/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesProtocol.c b/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesProtocol.c index 71b39f2831..8c29f20adf 100644 --- a/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesProtocol.c +++ b/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesProtocol.c @@ -1,393 +1,393 @@ -/** @file - Implementation of EFI_HTTP_PROTOCOL protocol interfaces. - - Copyright (c) 2015, Intel Corporation. All rights reserved.<BR> - This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "HttpUtilitiesDxe.h" - -EFI_HTTP_UTILITIES_PROTOCOL mHttpUtilitiesProtocol = { - HttpUtilitiesBuild, - HttpUtilitiesParse -}; - - -/** - Create HTTP header based on a combination of seed header, fields - to delete, and fields to append. - - The Build() function is used to manage the headers portion of an - HTTP message by providing the ability to add, remove, or replace - HTTP headers. - - @param[in] This Pointer to EFI_HTTP_UTILITIES_PROTOCOL instance. - @param[in] SeedMessageSize Size of the initial HTTP header. This can be zero. - @param[in] SeedMessage Initial HTTP header to be used as a base for - building a new HTTP header. If NULL, - SeedMessageSize is ignored. - @param[in] DeleteCount Number of null-terminated HTTP header field names - in DeleteList. - @param[in] DeleteList List of null-terminated HTTP header field names to - remove from SeedMessage. Only the field names are - in this list because the field values are irrelevant - to this operation. - @param[in] AppendCount Number of header fields in AppendList. - @param[in] AppendList List of HTTP headers to populate NewMessage with. - If SeedMessage is not NULL, AppendList will be - appended to the existing list from SeedMessage in - NewMessage. - @param[out] NewMessageSize Pointer to number of header fields in NewMessage. - @param[out] NewMessage Pointer to a new list of HTTP headers based on. - - @retval EFI_SUCCESS Add, remove, and replace operations succeeded. - @retval EFI_OUT_OF_RESOURCES Could not allocate memory for NewMessage. - @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE: - This is NULL. -**/ -EFI_STATUS -EFIAPI -HttpUtilitiesBuild ( - IN EFI_HTTP_UTILITIES_PROTOCOL *This, - IN UINTN SeedMessageSize, - IN VOID *SeedMessage, OPTIONAL - IN UINTN DeleteCount, - IN CHAR8 *DeleteList[], OPTIONAL - IN UINTN AppendCount, - IN EFI_HTTP_HEADER *AppendList[], OPTIONAL - OUT UINTN *NewMessageSize, - OUT VOID **NewMessage - ) -{ - EFI_STATUS Status; - EFI_HTTP_HEADER *SeedHeaderFields; - UINTN SeedFieldCount; - UINTN Index; - EFI_HTTP_HEADER *TempHeaderFields; - UINTN TempFieldCount; - EFI_HTTP_HEADER *NewHeaderFields; - UINTN NewFieldCount; - EFI_HTTP_HEADER *HttpHeader; - UINTN StrLength; - UINT8 *NewMessagePtr; - - SeedHeaderFields = NULL; - SeedFieldCount = 0; - TempHeaderFields = NULL; - TempFieldCount = 0; - NewHeaderFields = NULL; - NewFieldCount = 0; - - HttpHeader = NULL; - StrLength = 0; - NewMessagePtr = NULL; - *NewMessageSize = 0; - Status = EFI_SUCCESS; - - if (This == NULL) { - return EFI_INVALID_PARAMETER; - } - - if (SeedMessage != NULL) { - Status = This->Parse ( - This, - SeedMessage, - SeedMessageSize, - &SeedHeaderFields, - &SeedFieldCount - ); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - } - - // - // Handle DeleteList - // - if (SeedFieldCount != 0 && DeleteCount != 0) { - TempHeaderFields = AllocateZeroPool (SeedFieldCount * sizeof(EFI_HTTP_HEADER)); - if (TempHeaderFields == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto ON_EXIT; - } - - for (Index = 0, TempFieldCount = 0; Index < SeedFieldCount; Index++) { - // - // Check whether each SeedHeaderFields member is in DeleteList - // - if (IsValidHttpHeader( DeleteList, DeleteCount, SeedHeaderFields[Index].FieldName)) { - Status = SetFieldNameAndValue ( - &TempHeaderFields[TempFieldCount], - SeedHeaderFields[Index].FieldName, - SeedHeaderFields[Index].FieldValue - ); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - TempFieldCount++; - } - } - } else { - TempHeaderFields = SeedHeaderFields; - TempFieldCount = SeedFieldCount; - } - - // - // Handle AppendList - // - NewHeaderFields = AllocateZeroPool ((TempFieldCount + AppendCount) * sizeof (EFI_HTTP_HEADER)); - if (NewHeaderFields == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto ON_EXIT; - } - - for (Index = 0; Index < TempFieldCount; Index++) { - Status = SetFieldNameAndValue ( - &NewHeaderFields[Index], - TempHeaderFields[Index].FieldName, - TempHeaderFields[Index].FieldValue - ); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - } - - NewFieldCount = TempFieldCount; - - for (Index = 0; Index < AppendCount; Index++) { - HttpHeader = FindHttpHeader (NewHeaderFields, NewFieldCount, AppendList[Index]->FieldName); - if (HttpHeader != NULL) { - Status = SetFieldNameAndValue ( - HttpHeader, - AppendList[Index]->FieldName, - AppendList[Index]->FieldValue - ); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - } else { - Status = SetFieldNameAndValue ( - &NewHeaderFields[NewFieldCount], - AppendList[Index]->FieldName, - AppendList[Index]->FieldValue - ); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - NewFieldCount++; - } - } - - // - // Calculate NewMessageSize, then build NewMessage - // - for (Index = 0; Index < NewFieldCount; Index++) { - HttpHeader = &NewHeaderFields[Index]; - - StrLength = AsciiStrLen (HttpHeader->FieldName); - *NewMessageSize += StrLength; - - StrLength = sizeof(": ") - 1; - *NewMessageSize += StrLength; - - StrLength = AsciiStrLen (HttpHeader->FieldValue); - *NewMessageSize += StrLength; - - StrLength = sizeof("\r\n") - 1; - *NewMessageSize += StrLength; - } - StrLength = sizeof("\r\n") - 1; - *NewMessageSize += StrLength; - - // - // Final 0 for end flag - // - *NewMessageSize += 1; - - *NewMessage = AllocateZeroPool (*NewMessageSize); - if (*NewMessage == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto ON_EXIT; - } - - NewMessagePtr = (UINT8 *)(*NewMessage); - - for (Index = 0; Index < NewFieldCount; Index++) { - HttpHeader = &NewHeaderFields[Index]; - - StrLength = AsciiStrLen (HttpHeader->FieldName); - CopyMem (NewMessagePtr, HttpHeader->FieldName, StrLength); - NewMessagePtr += StrLength; - - StrLength = sizeof(": ") - 1; - CopyMem (NewMessagePtr, ": ", StrLength); - NewMessagePtr += StrLength; - - StrLength = AsciiStrLen (HttpHeader->FieldValue); - CopyMem (NewMessagePtr, HttpHeader->FieldValue, StrLength); - NewMessagePtr += StrLength; - - StrLength = sizeof("\r\n") - 1; - CopyMem (NewMessagePtr, "\r\n", StrLength); - NewMessagePtr += StrLength; - } - StrLength = sizeof("\r\n") - 1; - CopyMem (NewMessagePtr, "\r\n", StrLength); - NewMessagePtr += StrLength; - - *NewMessagePtr = 0; - - ASSERT (*NewMessageSize == (UINTN)NewMessagePtr - (UINTN)(*NewMessage) + 1); - - // - // Free allocated buffer - // -ON_EXIT: - if (SeedHeaderFields != NULL) { - FreeHeaderFields(SeedHeaderFields, SeedFieldCount); - } - - if (TempHeaderFields != NULL) { - FreeHeaderFields(TempHeaderFields, TempFieldCount); - } - - if (NewHeaderFields != NULL) { - FreeHeaderFields(NewHeaderFields, NewFieldCount); - } - - return Status; -} - - -/** - Parses HTTP header and produces an array of key/value pairs. - - The Parse() function is used to transform data stored in HttpHeader - into a list of fields paired with their corresponding values. - - @param[in] This Pointer to EFI_HTTP_UTILITIES_PROTOCOL instance. - @param[in] HttpMessage Contains raw unformatted HTTP header string. - @param[in] HttpMessageSize Size of HTTP header. - @param[out] HeaderFields Array of key/value header pairs. - @param[out] FieldCount Number of headers in HeaderFields. - - @retval EFI_SUCCESS Allocation succeeded. - @retval EFI_NOT_STARTED This EFI HTTP Protocol instance has not been - initialized. - @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE: - This is NULL. - HttpMessage is NULL. - HeaderFields is NULL. - FieldCount is NULL. -**/ -EFI_STATUS -EFIAPI -HttpUtilitiesParse ( - IN EFI_HTTP_UTILITIES_PROTOCOL *This, - IN CHAR8 *HttpMessage, - IN UINTN HttpMessageSize, - OUT EFI_HTTP_HEADER **HeaderFields, - OUT UINTN *FieldCount - ) -{ - EFI_STATUS Status; - CHAR8 *TempHttpMessage; - CHAR8 *Token; - CHAR8 *NextToken; - CHAR8 *FieldName; - CHAR8 *FieldValue; - UINTN Index; - - Status = EFI_SUCCESS; - TempHttpMessage = NULL; - *FieldCount = 0; - Token = NULL; - NextToken = NULL; - FieldName = NULL; - FieldValue = NULL; - Index = 0; - - if (This == NULL || HttpMessage == NULL || HeaderFields == NULL || FieldCount == NULL) { - return EFI_INVALID_PARAMETER; - } - - TempHttpMessage = AllocateZeroPool (HttpMessageSize); - if (TempHttpMessage == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - CopyMem (TempHttpMessage, HttpMessage, HttpMessageSize); - - // - // Get header number - // - Token = TempHttpMessage; - while (TRUE) { - FieldName = NULL; - FieldValue = NULL; - NextToken = GetFieldNameAndValue (Token, &FieldName, &FieldValue); - Token = NextToken; - if (FieldName == NULL || FieldValue == NULL) { - break; - } - - (*FieldCount)++; - } - - if (*FieldCount == 0) { - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - - // - // Allocate buffer for header - // - *HeaderFields = AllocateZeroPool ((*FieldCount) * sizeof(EFI_HTTP_HEADER)); - if (*HeaderFields == NULL) { - *FieldCount = 0; - Status = EFI_OUT_OF_RESOURCES; - goto ON_EXIT; - } - - CopyMem (TempHttpMessage, HttpMessage, HttpMessageSize); - - // - // Set Field and Value to each header - // - Token = TempHttpMessage; - while (Index < *FieldCount) { - FieldName = NULL; - FieldValue = NULL; - NextToken = GetFieldNameAndValue (Token, &FieldName, &FieldValue); - Token = NextToken; - if (FieldName == NULL || FieldValue == NULL) { - break; - } - - Status = SetFieldNameAndValue (&(*HeaderFields)[Index], FieldName, FieldValue); - if (EFI_ERROR (Status)) { - *FieldCount = 0; - FreeHeaderFields (*HeaderFields, Index); - goto ON_EXIT; - } - - Index++; - } - - // - // Free allocated buffer - // -ON_EXIT: - if (TempHttpMessage != NULL) { - FreePool (TempHttpMessage); - } - - return Status; +/** @file
+ Implementation of EFI_HTTP_PROTOCOL protocol interfaces.
+
+ Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include "HttpUtilitiesDxe.h"
+
+EFI_HTTP_UTILITIES_PROTOCOL mHttpUtilitiesProtocol = {
+ HttpUtilitiesBuild,
+ HttpUtilitiesParse
+};
+
+
+/**
+ Create HTTP header based on a combination of seed header, fields
+ to delete, and fields to append.
+
+ The Build() function is used to manage the headers portion of an
+ HTTP message by providing the ability to add, remove, or replace
+ HTTP headers.
+
+ @param[in] This Pointer to EFI_HTTP_UTILITIES_PROTOCOL instance.
+ @param[in] SeedMessageSize Size of the initial HTTP header. This can be zero.
+ @param[in] SeedMessage Initial HTTP header to be used as a base for
+ building a new HTTP header. If NULL,
+ SeedMessageSize is ignored.
+ @param[in] DeleteCount Number of null-terminated HTTP header field names
+ in DeleteList.
+ @param[in] DeleteList List of null-terminated HTTP header field names to
+ remove from SeedMessage. Only the field names are
+ in this list because the field values are irrelevant
+ to this operation.
+ @param[in] AppendCount Number of header fields in AppendList.
+ @param[in] AppendList List of HTTP headers to populate NewMessage with.
+ If SeedMessage is not NULL, AppendList will be
+ appended to the existing list from SeedMessage in
+ NewMessage.
+ @param[out] NewMessageSize Pointer to number of header fields in NewMessage.
+ @param[out] NewMessage Pointer to a new list of HTTP headers based on.
+
+ @retval EFI_SUCCESS Add, remove, and replace operations succeeded.
+ @retval EFI_OUT_OF_RESOURCES Could not allocate memory for NewMessage.
+ @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
+ This is NULL.
+**/
+EFI_STATUS
+EFIAPI
+HttpUtilitiesBuild (
+ IN EFI_HTTP_UTILITIES_PROTOCOL *This,
+ IN UINTN SeedMessageSize,
+ IN VOID *SeedMessage, OPTIONAL
+ IN UINTN DeleteCount,
+ IN CHAR8 *DeleteList[], OPTIONAL
+ IN UINTN AppendCount,
+ IN EFI_HTTP_HEADER *AppendList[], OPTIONAL
+ OUT UINTN *NewMessageSize,
+ OUT VOID **NewMessage
+ )
+{
+ EFI_STATUS Status;
+ EFI_HTTP_HEADER *SeedHeaderFields;
+ UINTN SeedFieldCount;
+ UINTN Index;
+ EFI_HTTP_HEADER *TempHeaderFields;
+ UINTN TempFieldCount;
+ EFI_HTTP_HEADER *NewHeaderFields;
+ UINTN NewFieldCount;
+ EFI_HTTP_HEADER *HttpHeader;
+ UINTN StrLength;
+ UINT8 *NewMessagePtr;
+
+ SeedHeaderFields = NULL;
+ SeedFieldCount = 0;
+ TempHeaderFields = NULL;
+ TempFieldCount = 0;
+ NewHeaderFields = NULL;
+ NewFieldCount = 0;
+
+ HttpHeader = NULL;
+ StrLength = 0;
+ NewMessagePtr = NULL;
+ *NewMessageSize = 0;
+ Status = EFI_SUCCESS;
+
+ if (This == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (SeedMessage != NULL) {
+ Status = This->Parse (
+ This,
+ SeedMessage,
+ SeedMessageSize,
+ &SeedHeaderFields,
+ &SeedFieldCount
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }
+ }
+
+ //
+ // Handle DeleteList
+ //
+ if (SeedFieldCount != 0 && DeleteCount != 0) {
+ TempHeaderFields = AllocateZeroPool (SeedFieldCount * sizeof(EFI_HTTP_HEADER));
+ if (TempHeaderFields == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto ON_EXIT;
+ }
+
+ for (Index = 0, TempFieldCount = 0; Index < SeedFieldCount; Index++) {
+ //
+ // Check whether each SeedHeaderFields member is in DeleteList
+ //
+ if (IsValidHttpHeader( DeleteList, DeleteCount, SeedHeaderFields[Index].FieldName)) {
+ Status = SetFieldNameAndValue (
+ &TempHeaderFields[TempFieldCount],
+ SeedHeaderFields[Index].FieldName,
+ SeedHeaderFields[Index].FieldValue
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }
+ TempFieldCount++;
+ }
+ }
+ } else {
+ TempHeaderFields = SeedHeaderFields;
+ TempFieldCount = SeedFieldCount;
+ }
+
+ //
+ // Handle AppendList
+ //
+ NewHeaderFields = AllocateZeroPool ((TempFieldCount + AppendCount) * sizeof (EFI_HTTP_HEADER));
+ if (NewHeaderFields == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto ON_EXIT;
+ }
+
+ for (Index = 0; Index < TempFieldCount; Index++) {
+ Status = SetFieldNameAndValue (
+ &NewHeaderFields[Index],
+ TempHeaderFields[Index].FieldName,
+ TempHeaderFields[Index].FieldValue
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }
+ }
+
+ NewFieldCount = TempFieldCount;
+
+ for (Index = 0; Index < AppendCount; Index++) {
+ HttpHeader = FindHttpHeader (NewHeaderFields, NewFieldCount, AppendList[Index]->FieldName);
+ if (HttpHeader != NULL) {
+ Status = SetFieldNameAndValue (
+ HttpHeader,
+ AppendList[Index]->FieldName,
+ AppendList[Index]->FieldValue
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }
+ } else {
+ Status = SetFieldNameAndValue (
+ &NewHeaderFields[NewFieldCount],
+ AppendList[Index]->FieldName,
+ AppendList[Index]->FieldValue
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }
+ NewFieldCount++;
+ }
+ }
+
+ //
+ // Calculate NewMessageSize, then build NewMessage
+ //
+ for (Index = 0; Index < NewFieldCount; Index++) {
+ HttpHeader = &NewHeaderFields[Index];
+
+ StrLength = AsciiStrLen (HttpHeader->FieldName);
+ *NewMessageSize += StrLength;
+
+ StrLength = sizeof(": ") - 1;
+ *NewMessageSize += StrLength;
+
+ StrLength = AsciiStrLen (HttpHeader->FieldValue);
+ *NewMessageSize += StrLength;
+
+ StrLength = sizeof("\r\n") - 1;
+ *NewMessageSize += StrLength;
+ }
+ StrLength = sizeof("\r\n") - 1;
+ *NewMessageSize += StrLength;
+
+ //
+ // Final 0 for end flag
+ //
+ *NewMessageSize += 1;
+
+ *NewMessage = AllocateZeroPool (*NewMessageSize);
+ if (*NewMessage == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto ON_EXIT;
+ }
+
+ NewMessagePtr = (UINT8 *)(*NewMessage);
+
+ for (Index = 0; Index < NewFieldCount; Index++) {
+ HttpHeader = &NewHeaderFields[Index];
+
+ StrLength = AsciiStrLen (HttpHeader->FieldName);
+ CopyMem (NewMessagePtr, HttpHeader->FieldName, StrLength);
+ NewMessagePtr += StrLength;
+
+ StrLength = sizeof(": ") - 1;
+ CopyMem (NewMessagePtr, ": ", StrLength);
+ NewMessagePtr += StrLength;
+
+ StrLength = AsciiStrLen (HttpHeader->FieldValue);
+ CopyMem (NewMessagePtr, HttpHeader->FieldValue, StrLength);
+ NewMessagePtr += StrLength;
+
+ StrLength = sizeof("\r\n") - 1;
+ CopyMem (NewMessagePtr, "\r\n", StrLength);
+ NewMessagePtr += StrLength;
+ }
+ StrLength = sizeof("\r\n") - 1;
+ CopyMem (NewMessagePtr, "\r\n", StrLength);
+ NewMessagePtr += StrLength;
+
+ *NewMessagePtr = 0;
+
+ ASSERT (*NewMessageSize == (UINTN)NewMessagePtr - (UINTN)(*NewMessage) + 1);
+
+ //
+ // Free allocated buffer
+ //
+ON_EXIT:
+ if (SeedHeaderFields != NULL) {
+ FreeHeaderFields(SeedHeaderFields, SeedFieldCount);
+ }
+
+ if (TempHeaderFields != NULL) {
+ FreeHeaderFields(TempHeaderFields, TempFieldCount);
+ }
+
+ if (NewHeaderFields != NULL) {
+ FreeHeaderFields(NewHeaderFields, NewFieldCount);
+ }
+
+ return Status;
+}
+
+
+/**
+ Parses HTTP header and produces an array of key/value pairs.
+
+ The Parse() function is used to transform data stored in HttpHeader
+ into a list of fields paired with their corresponding values.
+
+ @param[in] This Pointer to EFI_HTTP_UTILITIES_PROTOCOL instance.
+ @param[in] HttpMessage Contains raw unformatted HTTP header string.
+ @param[in] HttpMessageSize Size of HTTP header.
+ @param[out] HeaderFields Array of key/value header pairs.
+ @param[out] FieldCount Number of headers in HeaderFields.
+
+ @retval EFI_SUCCESS Allocation succeeded.
+ @retval EFI_NOT_STARTED This EFI HTTP Protocol instance has not been
+ initialized.
+ @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
+ This is NULL.
+ HttpMessage is NULL.
+ HeaderFields is NULL.
+ FieldCount is NULL.
+**/
+EFI_STATUS
+EFIAPI
+HttpUtilitiesParse (
+ IN EFI_HTTP_UTILITIES_PROTOCOL *This,
+ IN CHAR8 *HttpMessage,
+ IN UINTN HttpMessageSize,
+ OUT EFI_HTTP_HEADER **HeaderFields,
+ OUT UINTN *FieldCount
+ )
+{
+ EFI_STATUS Status;
+ CHAR8 *TempHttpMessage;
+ CHAR8 *Token;
+ CHAR8 *NextToken;
+ CHAR8 *FieldName;
+ CHAR8 *FieldValue;
+ UINTN Index;
+
+ Status = EFI_SUCCESS;
+ TempHttpMessage = NULL;
+ *FieldCount = 0;
+ Token = NULL;
+ NextToken = NULL;
+ FieldName = NULL;
+ FieldValue = NULL;
+ Index = 0;
+
+ if (This == NULL || HttpMessage == NULL || HeaderFields == NULL || FieldCount == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ TempHttpMessage = AllocateZeroPool (HttpMessageSize);
+ if (TempHttpMessage == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ CopyMem (TempHttpMessage, HttpMessage, HttpMessageSize);
+
+ //
+ // Get header number
+ //
+ Token = TempHttpMessage;
+ while (TRUE) {
+ FieldName = NULL;
+ FieldValue = NULL;
+ NextToken = GetFieldNameAndValue (Token, &FieldName, &FieldValue);
+ Token = NextToken;
+ if (FieldName == NULL || FieldValue == NULL) {
+ break;
+ }
+
+ (*FieldCount)++;
+ }
+
+ if (*FieldCount == 0) {
+ Status = EFI_INVALID_PARAMETER;
+ goto ON_EXIT;
+ }
+
+ //
+ // Allocate buffer for header
+ //
+ *HeaderFields = AllocateZeroPool ((*FieldCount) * sizeof(EFI_HTTP_HEADER));
+ if (*HeaderFields == NULL) {
+ *FieldCount = 0;
+ Status = EFI_OUT_OF_RESOURCES;
+ goto ON_EXIT;
+ }
+
+ CopyMem (TempHttpMessage, HttpMessage, HttpMessageSize);
+
+ //
+ // Set Field and Value to each header
+ //
+ Token = TempHttpMessage;
+ while (Index < *FieldCount) {
+ FieldName = NULL;
+ FieldValue = NULL;
+ NextToken = GetFieldNameAndValue (Token, &FieldName, &FieldValue);
+ Token = NextToken;
+ if (FieldName == NULL || FieldValue == NULL) {
+ break;
+ }
+
+ Status = SetFieldNameAndValue (&(*HeaderFields)[Index], FieldName, FieldValue);
+ if (EFI_ERROR (Status)) {
+ *FieldCount = 0;
+ FreeHeaderFields (*HeaderFields, Index);
+ goto ON_EXIT;
+ }
+
+ Index++;
+ }
+
+ //
+ // Free allocated buffer
+ //
+ON_EXIT:
+ if (TempHttpMessage != NULL) {
+ FreePool (TempHttpMessage);
+ }
+
+ return Status;
}
\ No newline at end of file |