NetworkPkg/HttpBootDxe/HttpBootSupport.h | 53 -------- NetworkPkg/Include/Library/HttpLib.h | 53 ++++++++ NetworkPkg/HttpBootDxe/HttpBootClient.c | 10 +- NetworkPkg/HttpBootDxe/HttpBootSupport.c | 130 -------------------- NetworkPkg/Library/DxeHttpLib/DxeHttpLib.c | 135 ++++++++++++++++++++- 5 files changed, 192 insertions(+), 189 deletions(-)
Move HTTP header manipulation functions to DxeHttpLib from
HttpBootSupport.c. These general functions are used by both
Http BOOT and RedfishLib (patches will be sent later).
Signed-off-by: Abner Chang <abner.chang@hpe.com>
Cc: Maciej Rabeda <maciej.rabeda@linux.intel.com>
Cc: Jiaxin Wu <jiaxin.wu@intel.com>
Cc: Siyuan Fu <siyuan.fu@intel.com>
Cc: Fan Wang <fan.wang@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Nickle Wang <nickle.wang@hpe.com>
Cc: Peter O'Hanley <peter.ohanley@hpe.com>
---
NetworkPkg/HttpBootDxe/HttpBootSupport.h | 53 --------
NetworkPkg/Include/Library/HttpLib.h | 53 ++++++++
NetworkPkg/HttpBootDxe/HttpBootClient.c | 10 +-
NetworkPkg/HttpBootDxe/HttpBootSupport.c | 130 --------------------
NetworkPkg/Library/DxeHttpLib/DxeHttpLib.c | 135 ++++++++++++++++++++-
5 files changed, 192 insertions(+), 189 deletions(-)
diff --git a/NetworkPkg/HttpBootDxe/HttpBootSupport.h b/NetworkPkg/HttpBootDxe/HttpBootSupport.h
index 1a2d32dd5a..c2ac1b785a 100644
--- a/NetworkPkg/HttpBootDxe/HttpBootSupport.h
+++ b/NetworkPkg/HttpBootDxe/HttpBootSupport.h
@@ -87,59 +87,6 @@ HttpBootPrintErrorMessage (
EFI_HTTP_STATUS_CODE StatusCode
);
-//
-// A wrapper structure to hold the HTTP headers.
-//
-typedef struct {
- UINTN MaxHeaderCount;
- UINTN HeaderCount;
- EFI_HTTP_HEADER *Headers;
-} HTTP_IO_HEADER;
-
-/**
- Create a HTTP_IO_HEADER to hold the HTTP header items.
-
- @param[in] MaxHeaderCount The maximum number of HTTP header in this holder.
-
- @return A pointer of the HTTP header holder or NULL if failed.
-
-**/
-HTTP_IO_HEADER *
-HttpBootCreateHeader (
- IN UINTN MaxHeaderCount
- );
-
-/**
- Destroy the HTTP_IO_HEADER and release the resources.
-
- @param[in] HttpIoHeader Point to the HTTP header holder to be destroyed.
-
-**/
-VOID
-HttpBootFreeHeader (
- IN HTTP_IO_HEADER *HttpIoHeader
- );
-
-/**
- Set or update a HTTP header with the field name and corresponding value.
-
- @param[in] HttpIoHeader Point to the HTTP header holder.
- @param[in] FieldName Null terminated string which describes a field name.
- @param[in] FieldValue Null terminated string which describes the corresponding field value.
-
- @retval EFI_SUCCESS The HTTP header has been set or updated.
- @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
- @retval EFI_OUT_OF_RESOURCES Insufficient resource to complete the operation.
- @retval Other Unexpected error happened.
-
-**/
-EFI_STATUS
-HttpBootSetHeader (
- IN HTTP_IO_HEADER *HttpIoHeader,
- IN CHAR8 *FieldName,
- IN CHAR8 *FieldValue
- );
-
/**
Retrieve the host address using the EFI_DNS6_PROTOCOL.
diff --git a/NetworkPkg/Include/Library/HttpLib.h b/NetworkPkg/Include/Library/HttpLib.h
index a906126b3d..2c3367fb01 100644
--- a/NetworkPkg/Include/Library/HttpLib.h
+++ b/NetworkPkg/Include/Library/HttpLib.h
@@ -476,6 +476,59 @@ HttpIsValidHttpHeader (
IN CHAR8 *FieldName
);
+//
+// A wrapper structure to hold the HTTP headers.
+//
+typedef struct {
+ UINTN MaxHeaderCount;
+ UINTN HeaderCount;
+ EFI_HTTP_HEADER *Headers;
+} HTTP_IO_HEADER;
+
+
+/**
+ Create a HTTP_IO_HEADER to hold the HTTP header items.
+
+ @param[in] MaxHeaderCount The maximun number of HTTP header in this holder.
+
+ @return A pointer of the HTTP header holder or NULL if failed.
+
+**/
+HTTP_IO_HEADER *
+HttpIoCreateHeader (
+ UINTN MaxHeaderCount
+ );
+
+/**
+ Destroy the HTTP_IO_HEADER and release the resources.
+
+ @param[in] HttpIoHeader Point to the HTTP header holder to be destroyed.
+
+**/
+VOID
+HttpIoFreeHeader (
+ IN HTTP_IO_HEADER *HttpIoHeader
+ );
+
+/**
+ Set or update a HTTP header with the field name and corresponding value.
+
+ @param[in] HttpIoHeader Point to the HTTP header holder.
+ @param[in] FieldName Null terminated string which describes a field name.
+ @param[in] FieldValue Null terminated string which describes the corresponding field value.
+
+ @retval EFI_SUCCESS The HTTP header has been set or updated.
+ @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
+ @retval EFI_OUT_OF_RESOURCES Insufficient resource to complete the operation.
+ @retval Other Unexpected error happened.
+
+**/
+EFI_STATUS
+HttpIoSetHeader (
+ IN HTTP_IO_HEADER *HttpIoHeader,
+ IN CHAR8 *FieldName,
+ IN CHAR8 *FieldValue
+ );
#endif
diff --git a/NetworkPkg/HttpBootDxe/HttpBootClient.c b/NetworkPkg/HttpBootDxe/HttpBootClient.c
index 30ac15889b..8f21f7766e 100644
--- a/NetworkPkg/HttpBootDxe/HttpBootClient.c
+++ b/NetworkPkg/HttpBootDxe/HttpBootClient.c
@@ -977,7 +977,7 @@ HttpBootGetBootFile (
// Accept
// User-Agent
//
- HttpIoHeader = HttpBootCreateHeader (3);
+ HttpIoHeader = HttpIoCreateHeader (3);
if (HttpIoHeader == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto ERROR_2;
@@ -995,7 +995,7 @@ HttpBootGetBootFile (
if (EFI_ERROR (Status)) {
goto ERROR_3;
}
- Status = HttpBootSetHeader (
+ Status = HttpIoSetHeader (
HttpIoHeader,
HTTP_HEADER_HOST,
HostName
@@ -1008,7 +1008,7 @@ HttpBootGetBootFile (
//
// Add HTTP header field 2: Accept
//
- Status = HttpBootSetHeader (
+ Status = HttpIoSetHeader (
HttpIoHeader,
HTTP_HEADER_ACCEPT,
"*/*"
@@ -1020,7 +1020,7 @@ HttpBootGetBootFile (
//
// Add HTTP header field 3: User-Agent
//
- Status = HttpBootSetHeader (
+ Status = HttpIoSetHeader (
HttpIoHeader,
HTTP_HEADER_USER_AGENT,
HTTP_USER_AGENT_EFI_HTTP_BOOT
@@ -1291,7 +1291,7 @@ ERROR_4:
FreePool (RequestData);
}
ERROR_3:
- HttpBootFreeHeader (HttpIoHeader);
+ HttpIoFreeHeader (HttpIoHeader);
ERROR_2:
if (Cache != NULL) {
FreePool (Cache);
diff --git a/NetworkPkg/HttpBootDxe/HttpBootSupport.c b/NetworkPkg/HttpBootDxe/HttpBootSupport.c
index 93d9dfc464..37a95e031e 100644
--- a/NetworkPkg/HttpBootDxe/HttpBootSupport.c
+++ b/NetworkPkg/HttpBootDxe/HttpBootSupport.c
@@ -491,136 +491,6 @@ Exit:
return Status;
}
-/**
- Create a HTTP_IO_HEADER to hold the HTTP header items.
-
- @param[in] MaxHeaderCount The maximum number of HTTP header in this holder.
-
- @return A pointer of the HTTP header holder or NULL if failed.
-
-**/
-HTTP_IO_HEADER *
-HttpBootCreateHeader (
- UINTN MaxHeaderCount
- )
-{
- HTTP_IO_HEADER *HttpIoHeader;
-
- if (MaxHeaderCount == 0) {
- return NULL;
- }
-
- HttpIoHeader = AllocateZeroPool (sizeof (HTTP_IO_HEADER) + MaxHeaderCount * sizeof (EFI_HTTP_HEADER));
- if (HttpIoHeader == NULL) {
- return NULL;
- }
-
- HttpIoHeader->MaxHeaderCount = MaxHeaderCount;
- HttpIoHeader->Headers = (EFI_HTTP_HEADER *) (HttpIoHeader + 1);
-
- return HttpIoHeader;
-}
-
-/**
- Destroy the HTTP_IO_HEADER and release the resources.
-
- @param[in] HttpIoHeader Point to the HTTP header holder to be destroyed.
-
-**/
-VOID
-HttpBootFreeHeader (
- IN HTTP_IO_HEADER *HttpIoHeader
- )
-{
- UINTN Index;
-
- if (HttpIoHeader != NULL) {
- if (HttpIoHeader->HeaderCount != 0) {
- for (Index = 0; Index < HttpIoHeader->HeaderCount; Index++) {
- FreePool (HttpIoHeader->Headers[Index].FieldName);
- FreePool (HttpIoHeader->Headers[Index].FieldValue);
- }
- }
- FreePool (HttpIoHeader);
- }
-}
-
-/**
- Set or update a HTTP header with the field name and corresponding value.
-
- @param[in] HttpIoHeader Point to the HTTP header holder.
- @param[in] FieldName Null terminated string which describes a field name.
- @param[in] FieldValue Null terminated string which describes the corresponding field value.
-
- @retval EFI_SUCCESS The HTTP header has been set or updated.
- @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
- @retval EFI_OUT_OF_RESOURCES Insufficient resource to complete the operation.
- @retval Other Unexpected error happened.
-
-**/
-EFI_STATUS
-HttpBootSetHeader (
- IN HTTP_IO_HEADER *HttpIoHeader,
- IN CHAR8 *FieldName,
- IN CHAR8 *FieldValue
- )
-{
- EFI_HTTP_HEADER *Header;
- UINTN StrSize;
- CHAR8 *NewFieldValue;
-
- if (HttpIoHeader == NULL || FieldName == NULL || FieldValue == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- Header = HttpFindHeader (HttpIoHeader->HeaderCount, HttpIoHeader->Headers, FieldName);
- if (Header == NULL) {
- //
- // Add a new header.
- //
- if (HttpIoHeader->HeaderCount >= HttpIoHeader->MaxHeaderCount) {
- return EFI_OUT_OF_RESOURCES;
- }
- Header = &HttpIoHeader->Headers[HttpIoHeader->HeaderCount];
-
- StrSize = AsciiStrSize (FieldName);
- Header->FieldName = AllocatePool (StrSize);
- if (Header->FieldName == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- CopyMem (Header->FieldName, FieldName, StrSize);
- Header->FieldName[StrSize -1] = '\0';
-
- StrSize = AsciiStrSize (FieldValue);
- Header->FieldValue = AllocatePool (StrSize);
- if (Header->FieldValue == NULL) {
- FreePool (Header->FieldName);
- return EFI_OUT_OF_RESOURCES;
- }
- CopyMem (Header->FieldValue, FieldValue, StrSize);
- Header->FieldValue[StrSize -1] = '\0';
-
- HttpIoHeader->HeaderCount++;
- } else {
- //
- // Update an existing one.
- //
- StrSize = AsciiStrSize (FieldValue);
- NewFieldValue = AllocatePool (StrSize);
- if (NewFieldValue == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- CopyMem (NewFieldValue, FieldValue, StrSize);
- NewFieldValue[StrSize -1] = '\0';
-
- if (Header->FieldValue != NULL) {
- FreePool (Header->FieldValue);
- }
- Header->FieldValue = NewFieldValue;
- }
-
- return EFI_SUCCESS;
-}
/**
This function checks the HTTP(S) URI scheme.
diff --git a/NetworkPkg/Library/DxeHttpLib/DxeHttpLib.c b/NetworkPkg/Library/DxeHttpLib/DxeHttpLib.c
index daec1e0226..7354e0170f 100644
--- a/NetworkPkg/Library/DxeHttpLib/DxeHttpLib.c
+++ b/NetworkPkg/Library/DxeHttpLib/DxeHttpLib.c
@@ -3,7 +3,7 @@
It provides the helper routines to parse the HTTP message byte stream.
Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR>
-(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
+(C) Copyright 2016 - 2020 Hewlett Packard Enterprise Development LP<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -2095,3 +2095,136 @@ HttpIsValidHttpHeader (
return TRUE;
}
+
+/**
+ Create a HTTP_IO_HEADER to hold the HTTP header items.
+
+ @param[in] MaxHeaderCount The maximun number of HTTP header in this holder.
+
+ @return A pointer of the HTTP header holder or NULL if failed.
+
+**/
+HTTP_IO_HEADER *
+HttpIoCreateHeader (
+ UINTN MaxHeaderCount
+ )
+{
+ HTTP_IO_HEADER *HttpIoHeader;
+
+ if (MaxHeaderCount == 0) {
+ return NULL;
+ }
+
+ HttpIoHeader = AllocateZeroPool (sizeof (HTTP_IO_HEADER) + MaxHeaderCount * sizeof (EFI_HTTP_HEADER));
+ if (HttpIoHeader == NULL) {
+ return NULL;
+ }
+
+ HttpIoHeader->MaxHeaderCount = MaxHeaderCount;
+ HttpIoHeader->Headers = (EFI_HTTP_HEADER *) (HttpIoHeader + 1);
+
+ return HttpIoHeader;
+}
+
+/**
+ Destroy the HTTP_IO_HEADER and release the resources.
+
+ @param[in] HttpIoHeader Point to the HTTP header holder to be destroyed.
+
+**/
+VOID
+HttpIoFreeHeader (
+ IN HTTP_IO_HEADER *HttpIoHeader
+ )
+{
+ UINTN Index;
+
+ if (HttpIoHeader != NULL) {
+ if (HttpIoHeader->HeaderCount != 0) {
+ for (Index = 0; Index < HttpIoHeader->HeaderCount; Index++) {
+ FreePool (HttpIoHeader->Headers[Index].FieldName);
+ ZeroMem (HttpIoHeader->Headers[Index].FieldValue, AsciiStrSize (HttpIoHeader->Headers[Index].FieldValue));
+ FreePool (HttpIoHeader->Headers[Index].FieldValue);
+ }
+ }
+ FreePool (HttpIoHeader);
+ }
+}
+
+/**
+ Set or update a HTTP header with the field name and corresponding value.
+
+ @param[in] HttpIoHeader Point to the HTTP header holder.
+ @param[in] FieldName Null terminated string which describes a field name.
+ @param[in] FieldValue Null terminated string which describes the corresponding field value.
+
+ @retval EFI_SUCCESS The HTTP header has been set or updated.
+ @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
+ @retval EFI_OUT_OF_RESOURCES Insufficient resource to complete the operation.
+ @retval Other Unexpected error happened.
+
+**/
+EFI_STATUS
+HttpIoSetHeader (
+ IN HTTP_IO_HEADER *HttpIoHeader,
+ IN CHAR8 *FieldName,
+ IN CHAR8 *FieldValue
+ )
+{
+ EFI_HTTP_HEADER *Header;
+ UINTN StrSize;
+ CHAR8 *NewFieldValue;
+
+ if (HttpIoHeader == NULL || FieldName == NULL || FieldValue == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Header = HttpFindHeader (HttpIoHeader->HeaderCount, HttpIoHeader->Headers, FieldName);
+ if (Header == NULL) {
+ //
+ // Add a new header.
+ //
+ if (HttpIoHeader->HeaderCount >= HttpIoHeader->MaxHeaderCount) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+ Header = &HttpIoHeader->Headers[HttpIoHeader->HeaderCount];
+
+ StrSize = AsciiStrSize (FieldName);
+ Header->FieldName = AllocatePool (StrSize);
+ if (Header->FieldName == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+ CopyMem (Header->FieldName, FieldName, StrSize);
+ Header->FieldName[StrSize -1] = '\0';
+
+ StrSize = AsciiStrSize (FieldValue);
+ Header->FieldValue = AllocatePool (StrSize);
+ if (Header->FieldValue == NULL) {
+ FreePool (Header->FieldName);
+ return EFI_OUT_OF_RESOURCES;
+ }
+ CopyMem (Header->FieldValue, FieldValue, StrSize);
+ Header->FieldValue[StrSize -1] = '\0';
+
+ HttpIoHeader->HeaderCount++;
+ } else {
+ //
+ // Update an existing one.
+ //
+ StrSize = AsciiStrSize (FieldValue);
+ NewFieldValue = AllocatePool (StrSize);
+ if (NewFieldValue == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+ CopyMem (NewFieldValue, FieldValue, StrSize);
+ NewFieldValue[StrSize -1] = '\0';
+
+ if (Header->FieldValue != NULL) {
+ FreePool (Header->FieldValue);
+ }
+ Header->FieldValue = NewFieldValue;
+ }
+
+ return EFI_SUCCESS;
+}
+
--
2.17.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#69905): https://edk2.groups.io/g/devel/message/69905
Mute This Topic: https://groups.io/mt/79494666/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
Reviewed-by: Maciej Rabeda <maciej.rabeda@linux.intel.com> On 07-Jan-21 07:57, Abner Chang wrote: > Move HTTP header manipulation functions to DxeHttpLib from > HttpBootSupport.c. These general functions are used by both > Http BOOT and RedfishLib (patches will be sent later). > > Signed-off-by: Abner Chang <abner.chang@hpe.com> > > Cc: Maciej Rabeda <maciej.rabeda@linux.intel.com> > Cc: Jiaxin Wu <jiaxin.wu@intel.com> > Cc: Siyuan Fu <siyuan.fu@intel.com> > Cc: Fan Wang <fan.wang@intel.com> > Cc: Jiewen Yao <jiewen.yao@intel.com> > Cc: Nickle Wang <nickle.wang@hpe.com> > Cc: Peter O'Hanley <peter.ohanley@hpe.com> > --- > NetworkPkg/HttpBootDxe/HttpBootSupport.h | 53 -------- > NetworkPkg/Include/Library/HttpLib.h | 53 ++++++++ > NetworkPkg/HttpBootDxe/HttpBootClient.c | 10 +- > NetworkPkg/HttpBootDxe/HttpBootSupport.c | 130 -------------------- > NetworkPkg/Library/DxeHttpLib/DxeHttpLib.c | 135 ++++++++++++++++++++- > 5 files changed, 192 insertions(+), 189 deletions(-) > > diff --git a/NetworkPkg/HttpBootDxe/HttpBootSupport.h b/NetworkPkg/HttpBootDxe/HttpBootSupport.h > index 1a2d32dd5a..c2ac1b785a 100644 > --- a/NetworkPkg/HttpBootDxe/HttpBootSupport.h > +++ b/NetworkPkg/HttpBootDxe/HttpBootSupport.h > @@ -87,59 +87,6 @@ HttpBootPrintErrorMessage ( > EFI_HTTP_STATUS_CODE StatusCode > ); > > -// > -// A wrapper structure to hold the HTTP headers. > -// > -typedef struct { > - UINTN MaxHeaderCount; > - UINTN HeaderCount; > - EFI_HTTP_HEADER *Headers; > -} HTTP_IO_HEADER; > - > -/** > - Create a HTTP_IO_HEADER to hold the HTTP header items. > - > - @param[in] MaxHeaderCount The maximum number of HTTP header in this holder. > - > - @return A pointer of the HTTP header holder or NULL if failed. > - > -**/ > -HTTP_IO_HEADER * > -HttpBootCreateHeader ( > - IN UINTN MaxHeaderCount > - ); > - > -/** > - Destroy the HTTP_IO_HEADER and release the resources. > - > - @param[in] HttpIoHeader Point to the HTTP header holder to be destroyed. > - > -**/ > -VOID > -HttpBootFreeHeader ( > - IN HTTP_IO_HEADER *HttpIoHeader > - ); > - > -/** > - Set or update a HTTP header with the field name and corresponding value. > - > - @param[in] HttpIoHeader Point to the HTTP header holder. > - @param[in] FieldName Null terminated string which describes a field name. > - @param[in] FieldValue Null terminated string which describes the corresponding field value. > - > - @retval EFI_SUCCESS The HTTP header has been set or updated. > - @retval EFI_INVALID_PARAMETER Any input parameter is invalid. > - @retval EFI_OUT_OF_RESOURCES Insufficient resource to complete the operation. > - @retval Other Unexpected error happened. > - > -**/ > -EFI_STATUS > -HttpBootSetHeader ( > - IN HTTP_IO_HEADER *HttpIoHeader, > - IN CHAR8 *FieldName, > - IN CHAR8 *FieldValue > - ); > - > /** > Retrieve the host address using the EFI_DNS6_PROTOCOL. > > diff --git a/NetworkPkg/Include/Library/HttpLib.h b/NetworkPkg/Include/Library/HttpLib.h > index a906126b3d..2c3367fb01 100644 > --- a/NetworkPkg/Include/Library/HttpLib.h > +++ b/NetworkPkg/Include/Library/HttpLib.h > @@ -476,6 +476,59 @@ HttpIsValidHttpHeader ( > IN CHAR8 *FieldName > ); > > +// > +// A wrapper structure to hold the HTTP headers. > +// > +typedef struct { > + UINTN MaxHeaderCount; > + UINTN HeaderCount; > + EFI_HTTP_HEADER *Headers; > +} HTTP_IO_HEADER; > + > + > +/** > + Create a HTTP_IO_HEADER to hold the HTTP header items. > + > + @param[in] MaxHeaderCount The maximun number of HTTP header in this holder. > + > + @return A pointer of the HTTP header holder or NULL if failed. > + > +**/ > +HTTP_IO_HEADER * > +HttpIoCreateHeader ( > + UINTN MaxHeaderCount > + ); > + > +/** > + Destroy the HTTP_IO_HEADER and release the resources. > + > + @param[in] HttpIoHeader Point to the HTTP header holder to be destroyed. > + > +**/ > +VOID > +HttpIoFreeHeader ( > + IN HTTP_IO_HEADER *HttpIoHeader > + ); > + > +/** > + Set or update a HTTP header with the field name and corresponding value. > + > + @param[in] HttpIoHeader Point to the HTTP header holder. > + @param[in] FieldName Null terminated string which describes a field name. > + @param[in] FieldValue Null terminated string which describes the corresponding field value. > + > + @retval EFI_SUCCESS The HTTP header has been set or updated. > + @retval EFI_INVALID_PARAMETER Any input parameter is invalid. > + @retval EFI_OUT_OF_RESOURCES Insufficient resource to complete the operation. > + @retval Other Unexpected error happened. > + > +**/ > +EFI_STATUS > +HttpIoSetHeader ( > + IN HTTP_IO_HEADER *HttpIoHeader, > + IN CHAR8 *FieldName, > + IN CHAR8 *FieldValue > + ); > > #endif > > diff --git a/NetworkPkg/HttpBootDxe/HttpBootClient.c b/NetworkPkg/HttpBootDxe/HttpBootClient.c > index 30ac15889b..8f21f7766e 100644 > --- a/NetworkPkg/HttpBootDxe/HttpBootClient.c > +++ b/NetworkPkg/HttpBootDxe/HttpBootClient.c > @@ -977,7 +977,7 @@ HttpBootGetBootFile ( > // Accept > // User-Agent > // > - HttpIoHeader = HttpBootCreateHeader (3); > + HttpIoHeader = HttpIoCreateHeader (3); > if (HttpIoHeader == NULL) { > Status = EFI_OUT_OF_RESOURCES; > goto ERROR_2; > @@ -995,7 +995,7 @@ HttpBootGetBootFile ( > if (EFI_ERROR (Status)) { > goto ERROR_3; > } > - Status = HttpBootSetHeader ( > + Status = HttpIoSetHeader ( > HttpIoHeader, > HTTP_HEADER_HOST, > HostName > @@ -1008,7 +1008,7 @@ HttpBootGetBootFile ( > // > // Add HTTP header field 2: Accept > // > - Status = HttpBootSetHeader ( > + Status = HttpIoSetHeader ( > HttpIoHeader, > HTTP_HEADER_ACCEPT, > "*/*" > @@ -1020,7 +1020,7 @@ HttpBootGetBootFile ( > // > // Add HTTP header field 3: User-Agent > // > - Status = HttpBootSetHeader ( > + Status = HttpIoSetHeader ( > HttpIoHeader, > HTTP_HEADER_USER_AGENT, > HTTP_USER_AGENT_EFI_HTTP_BOOT > @@ -1291,7 +1291,7 @@ ERROR_4: > FreePool (RequestData); > } > ERROR_3: > - HttpBootFreeHeader (HttpIoHeader); > + HttpIoFreeHeader (HttpIoHeader); > ERROR_2: > if (Cache != NULL) { > FreePool (Cache); > diff --git a/NetworkPkg/HttpBootDxe/HttpBootSupport.c b/NetworkPkg/HttpBootDxe/HttpBootSupport.c > index 93d9dfc464..37a95e031e 100644 > --- a/NetworkPkg/HttpBootDxe/HttpBootSupport.c > +++ b/NetworkPkg/HttpBootDxe/HttpBootSupport.c > @@ -491,136 +491,6 @@ Exit: > > return Status; > } > -/** > - Create a HTTP_IO_HEADER to hold the HTTP header items. > - > - @param[in] MaxHeaderCount The maximum number of HTTP header in this holder. > - > - @return A pointer of the HTTP header holder or NULL if failed. > - > -**/ > -HTTP_IO_HEADER * > -HttpBootCreateHeader ( > - UINTN MaxHeaderCount > - ) > -{ > - HTTP_IO_HEADER *HttpIoHeader; > - > - if (MaxHeaderCount == 0) { > - return NULL; > - } > - > - HttpIoHeader = AllocateZeroPool (sizeof (HTTP_IO_HEADER) + MaxHeaderCount * sizeof (EFI_HTTP_HEADER)); > - if (HttpIoHeader == NULL) { > - return NULL; > - } > - > - HttpIoHeader->MaxHeaderCount = MaxHeaderCount; > - HttpIoHeader->Headers = (EFI_HTTP_HEADER *) (HttpIoHeader + 1); > - > - return HttpIoHeader; > -} > - > -/** > - Destroy the HTTP_IO_HEADER and release the resources. > - > - @param[in] HttpIoHeader Point to the HTTP header holder to be destroyed. > - > -**/ > -VOID > -HttpBootFreeHeader ( > - IN HTTP_IO_HEADER *HttpIoHeader > - ) > -{ > - UINTN Index; > - > - if (HttpIoHeader != NULL) { > - if (HttpIoHeader->HeaderCount != 0) { > - for (Index = 0; Index < HttpIoHeader->HeaderCount; Index++) { > - FreePool (HttpIoHeader->Headers[Index].FieldName); > - FreePool (HttpIoHeader->Headers[Index].FieldValue); > - } > - } > - FreePool (HttpIoHeader); > - } > -} > - > -/** > - Set or update a HTTP header with the field name and corresponding value. > - > - @param[in] HttpIoHeader Point to the HTTP header holder. > - @param[in] FieldName Null terminated string which describes a field name. > - @param[in] FieldValue Null terminated string which describes the corresponding field value. > - > - @retval EFI_SUCCESS The HTTP header has been set or updated. > - @retval EFI_INVALID_PARAMETER Any input parameter is invalid. > - @retval EFI_OUT_OF_RESOURCES Insufficient resource to complete the operation. > - @retval Other Unexpected error happened. > - > -**/ > -EFI_STATUS > -HttpBootSetHeader ( > - IN HTTP_IO_HEADER *HttpIoHeader, > - IN CHAR8 *FieldName, > - IN CHAR8 *FieldValue > - ) > -{ > - EFI_HTTP_HEADER *Header; > - UINTN StrSize; > - CHAR8 *NewFieldValue; > - > - if (HttpIoHeader == NULL || FieldName == NULL || FieldValue == NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - Header = HttpFindHeader (HttpIoHeader->HeaderCount, HttpIoHeader->Headers, FieldName); > - if (Header == NULL) { > - // > - // Add a new header. > - // > - if (HttpIoHeader->HeaderCount >= HttpIoHeader->MaxHeaderCount) { > - return EFI_OUT_OF_RESOURCES; > - } > - Header = &HttpIoHeader->Headers[HttpIoHeader->HeaderCount]; > - > - StrSize = AsciiStrSize (FieldName); > - Header->FieldName = AllocatePool (StrSize); > - if (Header->FieldName == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - CopyMem (Header->FieldName, FieldName, StrSize); > - Header->FieldName[StrSize -1] = '\0'; > - > - StrSize = AsciiStrSize (FieldValue); > - Header->FieldValue = AllocatePool (StrSize); > - if (Header->FieldValue == NULL) { > - FreePool (Header->FieldName); > - return EFI_OUT_OF_RESOURCES; > - } > - CopyMem (Header->FieldValue, FieldValue, StrSize); > - Header->FieldValue[StrSize -1] = '\0'; > - > - HttpIoHeader->HeaderCount++; > - } else { > - // > - // Update an existing one. > - // > - StrSize = AsciiStrSize (FieldValue); > - NewFieldValue = AllocatePool (StrSize); > - if (NewFieldValue == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - CopyMem (NewFieldValue, FieldValue, StrSize); > - NewFieldValue[StrSize -1] = '\0'; > - > - if (Header->FieldValue != NULL) { > - FreePool (Header->FieldValue); > - } > - Header->FieldValue = NewFieldValue; > - } > - > - return EFI_SUCCESS; > -} > > /** > This function checks the HTTP(S) URI scheme. > diff --git a/NetworkPkg/Library/DxeHttpLib/DxeHttpLib.c b/NetworkPkg/Library/DxeHttpLib/DxeHttpLib.c > index daec1e0226..7354e0170f 100644 > --- a/NetworkPkg/Library/DxeHttpLib/DxeHttpLib.c > +++ b/NetworkPkg/Library/DxeHttpLib/DxeHttpLib.c > @@ -3,7 +3,7 @@ > It provides the helper routines to parse the HTTP message byte stream. > > Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR> > -(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR> > +(C) Copyright 2016 - 2020 Hewlett Packard Enterprise Development LP<BR> > SPDX-License-Identifier: BSD-2-Clause-Patent > > **/ > @@ -2095,3 +2095,136 @@ HttpIsValidHttpHeader ( > return TRUE; > } > > + > +/** > + Create a HTTP_IO_HEADER to hold the HTTP header items. > + > + @param[in] MaxHeaderCount The maximun number of HTTP header in this holder. > + > + @return A pointer of the HTTP header holder or NULL if failed. > + > +**/ > +HTTP_IO_HEADER * > +HttpIoCreateHeader ( > + UINTN MaxHeaderCount > + ) > +{ > + HTTP_IO_HEADER *HttpIoHeader; > + > + if (MaxHeaderCount == 0) { > + return NULL; > + } > + > + HttpIoHeader = AllocateZeroPool (sizeof (HTTP_IO_HEADER) + MaxHeaderCount * sizeof (EFI_HTTP_HEADER)); > + if (HttpIoHeader == NULL) { > + return NULL; > + } > + > + HttpIoHeader->MaxHeaderCount = MaxHeaderCount; > + HttpIoHeader->Headers = (EFI_HTTP_HEADER *) (HttpIoHeader + 1); > + > + return HttpIoHeader; > +} > + > +/** > + Destroy the HTTP_IO_HEADER and release the resources. > + > + @param[in] HttpIoHeader Point to the HTTP header holder to be destroyed. > + > +**/ > +VOID > +HttpIoFreeHeader ( > + IN HTTP_IO_HEADER *HttpIoHeader > + ) > +{ > + UINTN Index; > + > + if (HttpIoHeader != NULL) { > + if (HttpIoHeader->HeaderCount != 0) { > + for (Index = 0; Index < HttpIoHeader->HeaderCount; Index++) { > + FreePool (HttpIoHeader->Headers[Index].FieldName); > + ZeroMem (HttpIoHeader->Headers[Index].FieldValue, AsciiStrSize (HttpIoHeader->Headers[Index].FieldValue)); > + FreePool (HttpIoHeader->Headers[Index].FieldValue); > + } > + } > + FreePool (HttpIoHeader); > + } > +} > + > +/** > + Set or update a HTTP header with the field name and corresponding value. > + > + @param[in] HttpIoHeader Point to the HTTP header holder. > + @param[in] FieldName Null terminated string which describes a field name. > + @param[in] FieldValue Null terminated string which describes the corresponding field value. > + > + @retval EFI_SUCCESS The HTTP header has been set or updated. > + @retval EFI_INVALID_PARAMETER Any input parameter is invalid. > + @retval EFI_OUT_OF_RESOURCES Insufficient resource to complete the operation. > + @retval Other Unexpected error happened. > + > +**/ > +EFI_STATUS > +HttpIoSetHeader ( > + IN HTTP_IO_HEADER *HttpIoHeader, > + IN CHAR8 *FieldName, > + IN CHAR8 *FieldValue > + ) > +{ > + EFI_HTTP_HEADER *Header; > + UINTN StrSize; > + CHAR8 *NewFieldValue; > + > + if (HttpIoHeader == NULL || FieldName == NULL || FieldValue == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + Header = HttpFindHeader (HttpIoHeader->HeaderCount, HttpIoHeader->Headers, FieldName); > + if (Header == NULL) { > + // > + // Add a new header. > + // > + if (HttpIoHeader->HeaderCount >= HttpIoHeader->MaxHeaderCount) { > + return EFI_OUT_OF_RESOURCES; > + } > + Header = &HttpIoHeader->Headers[HttpIoHeader->HeaderCount]; > + > + StrSize = AsciiStrSize (FieldName); > + Header->FieldName = AllocatePool (StrSize); > + if (Header->FieldName == NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + CopyMem (Header->FieldName, FieldName, StrSize); > + Header->FieldName[StrSize -1] = '\0'; > + > + StrSize = AsciiStrSize (FieldValue); > + Header->FieldValue = AllocatePool (StrSize); > + if (Header->FieldValue == NULL) { > + FreePool (Header->FieldName); > + return EFI_OUT_OF_RESOURCES; > + } > + CopyMem (Header->FieldValue, FieldValue, StrSize); > + Header->FieldValue[StrSize -1] = '\0'; > + > + HttpIoHeader->HeaderCount++; > + } else { > + // > + // Update an existing one. > + // > + StrSize = AsciiStrSize (FieldValue); > + NewFieldValue = AllocatePool (StrSize); > + if (NewFieldValue == NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + CopyMem (NewFieldValue, FieldValue, StrSize); > + NewFieldValue[StrSize -1] = '\0'; > + > + if (Header->FieldValue != NULL) { > + FreePool (Header->FieldValue); > + } > + Header->FieldValue = NewFieldValue; > + } > + > + return EFI_SUCCESS; > +} > + -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#70290): https://edk2.groups.io/g/devel/message/70290 Mute This Topic: https://groups.io/mt/79494666/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=-=-=-=-=-=-=-=-=-=-=-
Patch merged. PR: https://github.com/tianocore/edk2/pull/1355 Commit: https://github.com/tianocore/edk2/commit/40c4cd54213b78ef0daee2f4b186150d7ef63bb4 On 14-Jan-21 14:56, Rabeda, Maciej wrote: > Reviewed-by: Maciej Rabeda <maciej.rabeda@linux.intel.com> > > On 07-Jan-21 07:57, Abner Chang wrote: >> Move HTTP header manipulation functions to DxeHttpLib from >> HttpBootSupport.c. These general functions are used by both >> Http BOOT and RedfishLib (patches will be sent later). >> >> Signed-off-by: Abner Chang <abner.chang@hpe.com> >> >> Cc: Maciej Rabeda <maciej.rabeda@linux.intel.com> >> Cc: Jiaxin Wu <jiaxin.wu@intel.com> >> Cc: Siyuan Fu <siyuan.fu@intel.com> >> Cc: Fan Wang <fan.wang@intel.com> >> Cc: Jiewen Yao <jiewen.yao@intel.com> >> Cc: Nickle Wang <nickle.wang@hpe.com> >> Cc: Peter O'Hanley <peter.ohanley@hpe.com> >> --- >> NetworkPkg/HttpBootDxe/HttpBootSupport.h | 53 -------- >> NetworkPkg/Include/Library/HttpLib.h | 53 ++++++++ >> NetworkPkg/HttpBootDxe/HttpBootClient.c | 10 +- >> NetworkPkg/HttpBootDxe/HttpBootSupport.c | 130 -------------------- >> NetworkPkg/Library/DxeHttpLib/DxeHttpLib.c | 135 ++++++++++++++++++++- >> 5 files changed, 192 insertions(+), 189 deletions(-) >> >> diff --git a/NetworkPkg/HttpBootDxe/HttpBootSupport.h >> b/NetworkPkg/HttpBootDxe/HttpBootSupport.h >> index 1a2d32dd5a..c2ac1b785a 100644 >> --- a/NetworkPkg/HttpBootDxe/HttpBootSupport.h >> +++ b/NetworkPkg/HttpBootDxe/HttpBootSupport.h >> @@ -87,59 +87,6 @@ HttpBootPrintErrorMessage ( >> EFI_HTTP_STATUS_CODE StatusCode >> ); >> -// >> -// A wrapper structure to hold the HTTP headers. >> -// >> -typedef struct { >> - UINTN MaxHeaderCount; >> - UINTN HeaderCount; >> - EFI_HTTP_HEADER *Headers; >> -} HTTP_IO_HEADER; >> - >> -/** >> - Create a HTTP_IO_HEADER to hold the HTTP header items. >> - >> - @param[in] MaxHeaderCount The maximum number of HTTP >> header in this holder. >> - >> - @return A pointer of the HTTP header holder or NULL if failed. >> - >> -**/ >> -HTTP_IO_HEADER * >> -HttpBootCreateHeader ( >> - IN UINTN MaxHeaderCount >> - ); >> - >> -/** >> - Destroy the HTTP_IO_HEADER and release the resources. >> - >> - @param[in] HttpIoHeader Point to the HTTP header holder to >> be destroyed. >> - >> -**/ >> -VOID >> -HttpBootFreeHeader ( >> - IN HTTP_IO_HEADER *HttpIoHeader >> - ); >> - >> -/** >> - Set or update a HTTP header with the field name and corresponding >> value. >> - >> - @param[in] HttpIoHeader Point to the HTTP header holder. >> - @param[in] FieldName Null terminated string which >> describes a field name. >> - @param[in] FieldValue Null terminated string which >> describes the corresponding field value. >> - >> - @retval EFI_SUCCESS The HTTP header has been set or >> updated. >> - @retval EFI_INVALID_PARAMETER Any input parameter is invalid. >> - @retval EFI_OUT_OF_RESOURCES Insufficient resource to complete >> the operation. >> - @retval Other Unexpected error happened. >> - >> -**/ >> -EFI_STATUS >> -HttpBootSetHeader ( >> - IN HTTP_IO_HEADER *HttpIoHeader, >> - IN CHAR8 *FieldName, >> - IN CHAR8 *FieldValue >> - ); >> - >> /** >> Retrieve the host address using the EFI_DNS6_PROTOCOL. >> diff --git a/NetworkPkg/Include/Library/HttpLib.h >> b/NetworkPkg/Include/Library/HttpLib.h >> index a906126b3d..2c3367fb01 100644 >> --- a/NetworkPkg/Include/Library/HttpLib.h >> +++ b/NetworkPkg/Include/Library/HttpLib.h >> @@ -476,6 +476,59 @@ HttpIsValidHttpHeader ( >> IN CHAR8 *FieldName >> ); >> +// >> +// A wrapper structure to hold the HTTP headers. >> +// >> +typedef struct { >> + UINTN MaxHeaderCount; >> + UINTN HeaderCount; >> + EFI_HTTP_HEADER *Headers; >> +} HTTP_IO_HEADER; >> + >> + >> +/** >> + Create a HTTP_IO_HEADER to hold the HTTP header items. >> + >> + @param[in] MaxHeaderCount The maximun number of HTTP >> header in this holder. >> + >> + @return A pointer of the HTTP header holder or NULL if failed. >> + >> +**/ >> +HTTP_IO_HEADER * >> +HttpIoCreateHeader ( >> + UINTN MaxHeaderCount >> + ); >> + >> +/** >> + Destroy the HTTP_IO_HEADER and release the resources. >> + >> + @param[in] HttpIoHeader Point to the HTTP header holder to >> be destroyed. >> + >> +**/ >> +VOID >> +HttpIoFreeHeader ( >> + IN HTTP_IO_HEADER *HttpIoHeader >> + ); >> + >> +/** >> + Set or update a HTTP header with the field name and corresponding >> value. >> + >> + @param[in] HttpIoHeader Point to the HTTP header holder. >> + @param[in] FieldName Null terminated string which >> describes a field name. >> + @param[in] FieldValue Null terminated string which >> describes the corresponding field value. >> + >> + @retval EFI_SUCCESS The HTTP header has been set or >> updated. >> + @retval EFI_INVALID_PARAMETER Any input parameter is invalid. >> + @retval EFI_OUT_OF_RESOURCES Insufficient resource to complete >> the operation. >> + @retval Other Unexpected error happened. >> + >> +**/ >> +EFI_STATUS >> +HttpIoSetHeader ( >> + IN HTTP_IO_HEADER *HttpIoHeader, >> + IN CHAR8 *FieldName, >> + IN CHAR8 *FieldValue >> + ); >> #endif >> diff --git a/NetworkPkg/HttpBootDxe/HttpBootClient.c >> b/NetworkPkg/HttpBootDxe/HttpBootClient.c >> index 30ac15889b..8f21f7766e 100644 >> --- a/NetworkPkg/HttpBootDxe/HttpBootClient.c >> +++ b/NetworkPkg/HttpBootDxe/HttpBootClient.c >> @@ -977,7 +977,7 @@ HttpBootGetBootFile ( >> // Accept >> // User-Agent >> // >> - HttpIoHeader = HttpBootCreateHeader (3); >> + HttpIoHeader = HttpIoCreateHeader (3); >> if (HttpIoHeader == NULL) { >> Status = EFI_OUT_OF_RESOURCES; >> goto ERROR_2; >> @@ -995,7 +995,7 @@ HttpBootGetBootFile ( >> if (EFI_ERROR (Status)) { >> goto ERROR_3; >> } >> - Status = HttpBootSetHeader ( >> + Status = HttpIoSetHeader ( >> HttpIoHeader, >> HTTP_HEADER_HOST, >> HostName >> @@ -1008,7 +1008,7 @@ HttpBootGetBootFile ( >> // >> // Add HTTP header field 2: Accept >> // >> - Status = HttpBootSetHeader ( >> + Status = HttpIoSetHeader ( >> HttpIoHeader, >> HTTP_HEADER_ACCEPT, >> "*/*" >> @@ -1020,7 +1020,7 @@ HttpBootGetBootFile ( >> // >> // Add HTTP header field 3: User-Agent >> // >> - Status = HttpBootSetHeader ( >> + Status = HttpIoSetHeader ( >> HttpIoHeader, >> HTTP_HEADER_USER_AGENT, >> HTTP_USER_AGENT_EFI_HTTP_BOOT >> @@ -1291,7 +1291,7 @@ ERROR_4: >> FreePool (RequestData); >> } >> ERROR_3: >> - HttpBootFreeHeader (HttpIoHeader); >> + HttpIoFreeHeader (HttpIoHeader); >> ERROR_2: >> if (Cache != NULL) { >> FreePool (Cache); >> diff --git a/NetworkPkg/HttpBootDxe/HttpBootSupport.c >> b/NetworkPkg/HttpBootDxe/HttpBootSupport.c >> index 93d9dfc464..37a95e031e 100644 >> --- a/NetworkPkg/HttpBootDxe/HttpBootSupport.c >> +++ b/NetworkPkg/HttpBootDxe/HttpBootSupport.c >> @@ -491,136 +491,6 @@ Exit: >> return Status; >> } >> -/** >> - Create a HTTP_IO_HEADER to hold the HTTP header items. >> - >> - @param[in] MaxHeaderCount The maximum number of HTTP >> header in this holder. >> - >> - @return A pointer of the HTTP header holder or NULL if failed. >> - >> -**/ >> -HTTP_IO_HEADER * >> -HttpBootCreateHeader ( >> - UINTN MaxHeaderCount >> - ) >> -{ >> - HTTP_IO_HEADER *HttpIoHeader; >> - >> - if (MaxHeaderCount == 0) { >> - return NULL; >> - } >> - >> - HttpIoHeader = AllocateZeroPool (sizeof (HTTP_IO_HEADER) + >> MaxHeaderCount * sizeof (EFI_HTTP_HEADER)); >> - if (HttpIoHeader == NULL) { >> - return NULL; >> - } >> - >> - HttpIoHeader->MaxHeaderCount = MaxHeaderCount; >> - HttpIoHeader->Headers = (EFI_HTTP_HEADER *) (HttpIoHeader + 1); >> - >> - return HttpIoHeader; >> -} >> - >> -/** >> - Destroy the HTTP_IO_HEADER and release the resources. >> - >> - @param[in] HttpIoHeader Point to the HTTP header holder to >> be destroyed. >> - >> -**/ >> -VOID >> -HttpBootFreeHeader ( >> - IN HTTP_IO_HEADER *HttpIoHeader >> - ) >> -{ >> - UINTN Index; >> - >> - if (HttpIoHeader != NULL) { >> - if (HttpIoHeader->HeaderCount != 0) { >> - for (Index = 0; Index < HttpIoHeader->HeaderCount; Index++) { >> - FreePool (HttpIoHeader->Headers[Index].FieldName); >> - FreePool (HttpIoHeader->Headers[Index].FieldValue); >> - } >> - } >> - FreePool (HttpIoHeader); >> - } >> -} >> - >> -/** >> - Set or update a HTTP header with the field name and corresponding >> value. >> - >> - @param[in] HttpIoHeader Point to the HTTP header holder. >> - @param[in] FieldName Null terminated string which >> describes a field name. >> - @param[in] FieldValue Null terminated string which >> describes the corresponding field value. >> - >> - @retval EFI_SUCCESS The HTTP header has been set or >> updated. >> - @retval EFI_INVALID_PARAMETER Any input parameter is invalid. >> - @retval EFI_OUT_OF_RESOURCES Insufficient resource to complete >> the operation. >> - @retval Other Unexpected error happened. >> - >> -**/ >> -EFI_STATUS >> -HttpBootSetHeader ( >> - IN HTTP_IO_HEADER *HttpIoHeader, >> - IN CHAR8 *FieldName, >> - IN CHAR8 *FieldValue >> - ) >> -{ >> - EFI_HTTP_HEADER *Header; >> - UINTN StrSize; >> - CHAR8 *NewFieldValue; >> - >> - if (HttpIoHeader == NULL || FieldName == NULL || FieldValue == >> NULL) { >> - return EFI_INVALID_PARAMETER; >> - } >> - >> - Header = HttpFindHeader (HttpIoHeader->HeaderCount, >> HttpIoHeader->Headers, FieldName); >> - if (Header == NULL) { >> - // >> - // Add a new header. >> - // >> - if (HttpIoHeader->HeaderCount >= HttpIoHeader->MaxHeaderCount) { >> - return EFI_OUT_OF_RESOURCES; >> - } >> - Header = &HttpIoHeader->Headers[HttpIoHeader->HeaderCount]; >> - >> - StrSize = AsciiStrSize (FieldName); >> - Header->FieldName = AllocatePool (StrSize); >> - if (Header->FieldName == NULL) { >> - return EFI_OUT_OF_RESOURCES; >> - } >> - CopyMem (Header->FieldName, FieldName, StrSize); >> - Header->FieldName[StrSize -1] = '\0'; >> - >> - StrSize = AsciiStrSize (FieldValue); >> - Header->FieldValue = AllocatePool (StrSize); >> - if (Header->FieldValue == NULL) { >> - FreePool (Header->FieldName); >> - return EFI_OUT_OF_RESOURCES; >> - } >> - CopyMem (Header->FieldValue, FieldValue, StrSize); >> - Header->FieldValue[StrSize -1] = '\0'; >> - >> - HttpIoHeader->HeaderCount++; >> - } else { >> - // >> - // Update an existing one. >> - // >> - StrSize = AsciiStrSize (FieldValue); >> - NewFieldValue = AllocatePool (StrSize); >> - if (NewFieldValue == NULL) { >> - return EFI_OUT_OF_RESOURCES; >> - } >> - CopyMem (NewFieldValue, FieldValue, StrSize); >> - NewFieldValue[StrSize -1] = '\0'; >> - >> - if (Header->FieldValue != NULL) { >> - FreePool (Header->FieldValue); >> - } >> - Header->FieldValue = NewFieldValue; >> - } >> - >> - return EFI_SUCCESS; >> -} >> /** >> This function checks the HTTP(S) URI scheme. >> diff --git a/NetworkPkg/Library/DxeHttpLib/DxeHttpLib.c >> b/NetworkPkg/Library/DxeHttpLib/DxeHttpLib.c >> index daec1e0226..7354e0170f 100644 >> --- a/NetworkPkg/Library/DxeHttpLib/DxeHttpLib.c >> +++ b/NetworkPkg/Library/DxeHttpLib/DxeHttpLib.c >> @@ -3,7 +3,7 @@ >> It provides the helper routines to parse the HTTP message byte >> stream. >> Copyright (c) 2015 - 2019, Intel Corporation. All rights >> reserved.<BR> >> -(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR> >> +(C) Copyright 2016 - 2020 Hewlett Packard Enterprise Development >> LP<BR> >> SPDX-License-Identifier: BSD-2-Clause-Patent >> **/ >> @@ -2095,3 +2095,136 @@ HttpIsValidHttpHeader ( >> return TRUE; >> } >> + >> +/** >> + Create a HTTP_IO_HEADER to hold the HTTP header items. >> + >> + @param[in] MaxHeaderCount The maximun number of HTTP >> header in this holder. >> + >> + @return A pointer of the HTTP header holder or NULL if failed. >> + >> +**/ >> +HTTP_IO_HEADER * >> +HttpIoCreateHeader ( >> + UINTN MaxHeaderCount >> + ) >> +{ >> + HTTP_IO_HEADER *HttpIoHeader; >> + >> + if (MaxHeaderCount == 0) { >> + return NULL; >> + } >> + >> + HttpIoHeader = AllocateZeroPool (sizeof (HTTP_IO_HEADER) + >> MaxHeaderCount * sizeof (EFI_HTTP_HEADER)); >> + if (HttpIoHeader == NULL) { >> + return NULL; >> + } >> + >> + HttpIoHeader->MaxHeaderCount = MaxHeaderCount; >> + HttpIoHeader->Headers = (EFI_HTTP_HEADER *) (HttpIoHeader + 1); >> + >> + return HttpIoHeader; >> +} >> + >> +/** >> + Destroy the HTTP_IO_HEADER and release the resources. >> + >> + @param[in] HttpIoHeader Point to the HTTP header holder to >> be destroyed. >> + >> +**/ >> +VOID >> +HttpIoFreeHeader ( >> + IN HTTP_IO_HEADER *HttpIoHeader >> + ) >> +{ >> + UINTN Index; >> + >> + if (HttpIoHeader != NULL) { >> + if (HttpIoHeader->HeaderCount != 0) { >> + for (Index = 0; Index < HttpIoHeader->HeaderCount; Index++) { >> + FreePool (HttpIoHeader->Headers[Index].FieldName); >> + ZeroMem (HttpIoHeader->Headers[Index].FieldValue, >> AsciiStrSize (HttpIoHeader->Headers[Index].FieldValue)); >> + FreePool (HttpIoHeader->Headers[Index].FieldValue); >> + } >> + } >> + FreePool (HttpIoHeader); >> + } >> +} >> + >> +/** >> + Set or update a HTTP header with the field name and corresponding >> value. >> + >> + @param[in] HttpIoHeader Point to the HTTP header holder. >> + @param[in] FieldName Null terminated string which >> describes a field name. >> + @param[in] FieldValue Null terminated string which >> describes the corresponding field value. >> + >> + @retval EFI_SUCCESS The HTTP header has been set or >> updated. >> + @retval EFI_INVALID_PARAMETER Any input parameter is invalid. >> + @retval EFI_OUT_OF_RESOURCES Insufficient resource to complete >> the operation. >> + @retval Other Unexpected error happened. >> + >> +**/ >> +EFI_STATUS >> +HttpIoSetHeader ( >> + IN HTTP_IO_HEADER *HttpIoHeader, >> + IN CHAR8 *FieldName, >> + IN CHAR8 *FieldValue >> + ) >> +{ >> + EFI_HTTP_HEADER *Header; >> + UINTN StrSize; >> + CHAR8 *NewFieldValue; >> + >> + if (HttpIoHeader == NULL || FieldName == NULL || FieldValue == >> NULL) { >> + return EFI_INVALID_PARAMETER; >> + } >> + >> + Header = HttpFindHeader (HttpIoHeader->HeaderCount, >> HttpIoHeader->Headers, FieldName); >> + if (Header == NULL) { >> + // >> + // Add a new header. >> + // >> + if (HttpIoHeader->HeaderCount >= HttpIoHeader->MaxHeaderCount) { >> + return EFI_OUT_OF_RESOURCES; >> + } >> + Header = &HttpIoHeader->Headers[HttpIoHeader->HeaderCount]; >> + >> + StrSize = AsciiStrSize (FieldName); >> + Header->FieldName = AllocatePool (StrSize); >> + if (Header->FieldName == NULL) { >> + return EFI_OUT_OF_RESOURCES; >> + } >> + CopyMem (Header->FieldName, FieldName, StrSize); >> + Header->FieldName[StrSize -1] = '\0'; >> + >> + StrSize = AsciiStrSize (FieldValue); >> + Header->FieldValue = AllocatePool (StrSize); >> + if (Header->FieldValue == NULL) { >> + FreePool (Header->FieldName); >> + return EFI_OUT_OF_RESOURCES; >> + } >> + CopyMem (Header->FieldValue, FieldValue, StrSize); >> + Header->FieldValue[StrSize -1] = '\0'; >> + >> + HttpIoHeader->HeaderCount++; >> + } else { >> + // >> + // Update an existing one. >> + // >> + StrSize = AsciiStrSize (FieldValue); >> + NewFieldValue = AllocatePool (StrSize); >> + if (NewFieldValue == NULL) { >> + return EFI_OUT_OF_RESOURCES; >> + } >> + CopyMem (NewFieldValue, FieldValue, StrSize); >> + NewFieldValue[StrSize -1] = '\0'; >> + >> + if (Header->FieldValue != NULL) { >> + FreePool (Header->FieldValue); >> + } >> + Header->FieldValue = NewFieldValue; >> + } >> + >> + return EFI_SUCCESS; >> +} >> + > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#70293): https://edk2.groups.io/g/devel/message/70293 Mute This Topic: https://groups.io/mt/79494666/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=-=-=-=-=-=-=-=-=-=-=-
© 2016 - 2024 Red Hat, Inc.