From: "Maciej Rabeda" <maciej.rabeda@linux.intel.com>
To: Abner Chang <abner.chang@hpe.com>, devel@edk2.groups.io
Cc: Jiaxin Wu <jiaxin.wu@intel.com>, Siyuan Fu <siyuan.fu@intel.com>,
Fan Wang <fan.wang@intel.com>, Jiewen Yao <jiewen.yao@intel.com>,
Nickle Wang <nickle.wang@hpe.com>,
Peter O'Hanley <peter.ohanley@hpe.com>
Subject: Re: [PATCH v2] NetworkPkg/DxeHttpLib: Migrate HTTP header manipulation APIs
Date: Thu, 14 Jan 2021 16:16:01 +0100 [thread overview]
Message-ID: <2bd36406-107d-eef9-3c41-ca5b179ef748@linux.intel.com> (raw)
In-Reply-To: <a8e5a06c-c429-b516-31e0-11f39083bc88@linux.intel.com>
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;
>> +}
>> +
>
prev parent reply other threads:[~2021-01-14 15:16 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-07 6:57 [PATCH v2] NetworkPkg/DxeHttpLib: Migrate HTTP header manipulation APIs Abner Chang
2021-01-14 13:56 ` Maciej Rabeda
2021-01-14 15:16 ` Maciej Rabeda [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2bd36406-107d-eef9-3c41-ca5b179ef748@linux.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox