From nobody Thu May 9 18:21:43 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+94818+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+94818+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1665178486; cv=none; d=zohomail.com; s=zohoarc; b=F03ggPBcriC3N/MphPbVFb6ueiCJ5i+tbKshM6t1xpEIGgekP8zZviN5KJAfdT+MYn8cuHRGLkpGu+Xy8rSAjHmTUReCcMrCUZ0UbBtRwx8WHGqw0UUjacFMFkoo5CKCXIteKRyIn9QBQxsuyAduFIIMmzLMxmOAZlAEP3tw9Po= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1665178486; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=4nWWd1KFVfo/VGZ4UDDMrtA0+Fpt5c2LhMi7QMeNiqQ=; b=BHGhCYKi3+nYYMHRGLyWZgZ7Jc1Blf+5WlVX6dSufIOrist96TgEZqgNP3bIYt5HTDY2mWdwVv6kSx/OiCdZ8VbN4mj+UasIFmyo5bl10oOLTuCa+MPFk6/Drzjtfsccr1ncrpNwkX1dSIwltxf2+kKPqJO30GzuZ3I/kQCBDuA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+94818+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1665178486202378.2530717746672; Fri, 7 Oct 2022 14:34:46 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id JafIYY1788612xdfXT79EW9O; Fri, 07 Oct 2022 14:34:45 -0700 X-Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by mx.groups.io with SMTP id smtpd.web11.262.1665178478972669259 for ; Fri, 07 Oct 2022 14:34:44 -0700 X-IronPort-AV: E=McAfee;i="6500,9779,10493"; a="287069102" X-IronPort-AV: E=Sophos;i="5.95,167,1661842800"; d="scan'208";a="287069102" X-Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Oct 2022 14:34:44 -0700 X-IronPort-AV: E=McAfee;i="6500,9779,10493"; a="658479385" X-IronPort-AV: E=Sophos;i="5.95,167,1661842800"; d="scan'208";a="658479385" X-Received: from fmbiosdev02.amr.corp.intel.com ([10.80.127.10]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Oct 2022 14:34:43 -0700 From: "Saloni Kasbekar" To: devel@edk2.groups.io Cc: Saloni Kasbekar , Maciej Rabeda , Wu Jiaxin , Siyuan Fu Subject: [edk2-devel] [[edk2-staging/HttpProxy PATCH v2] 4/6] NetworkPkg: Add Proxy Support to HTTP_PROTOCOL Date: Fri, 7 Oct 2022 14:34:28 -0700 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,saloni.kasbekar@intel.com X-Gm-Message-State: yhwaUguuHOdUA7MxGTKxLY6Rx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1665178485; bh=cwFbq/OkwClT/gbZ0W4FmIcgYfxYlJD5Jwxug9/8OUA=; h=Cc:Date:From:Reply-To:Subject:To; b=XsnT5FEeJJeDauwRGLSL7XSJSf1Xb7IK9B7dXudQXVrIowifEVle+bUjp80g3RCFwb0 NKVeTmJm3YiO++Sz8UC93khgEJ8+j7q29reb1VAoa8ExEUJTXzfJbD5r8YXbJVVQmg725 JMAvRYGoyjwHQ7bfEujLxLSwUr/66QijL04= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1665178487996100005 Content-Type: text/plain; charset="utf-8" REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3951 Update HTTP Protocol with variables to support Proxy Use state machine to call HttpBootGetBootFile() Add switch/case for EfiHttpRequest request method Cc: Maciej Rabeda Cc: Wu Jiaxin Cc: Siyuan Fu Signed-off-by: Saloni Kasbekar --- NetworkPkg/HttpBootDxe/HttpBootImpl.c | 178 +++++++++++++++++--------- NetworkPkg/HttpBootDxe/HttpBootImpl.h | 7 + NetworkPkg/HttpDxe/HttpImpl.c | 59 +++++++-- NetworkPkg/HttpDxe/HttpProto.c | 18 ++- NetworkPkg/HttpDxe/HttpProto.h | 9 ++ 5 files changed, 199 insertions(+), 72 deletions(-) diff --git a/NetworkPkg/HttpBootDxe/HttpBootImpl.c b/NetworkPkg/HttpBootDxe= /HttpBootImpl.c index 5735b96d9e..4748de0603 100644 --- a/NetworkPkg/HttpBootDxe/HttpBootImpl.c +++ b/NetworkPkg/HttpBootDxe/HttpBootImpl.c @@ -278,6 +278,122 @@ HttpBootDhcp ( return Status; } =20 +/** + Issue calls to HttpBootGetBootFile() based on current Boot File State + + @param[in] Private The pointer to the driver's private = data. + @param[in, out] BufferSize On input the size of Buffer in bytes= . On output with a return + code of EFI_SUCCESS, the amount of d= ata transferred to + Buffer. On output with a return code= of EFI_BUFFER_TOO_SMALL, + the size of Buffer required to retri= eve the requested file. + @param[in] Buffer The memory buffer to transfer the fi= le to. If Buffer is NULL, + then the size of the requested file = is returned in + BufferSize. + @param[out] ImageType The image type of the downloaded fil= e. + + @retval EFI_SUCCESS The file was loaded. + @retval EFI_INVALID_PARAMETER BufferSize is NULL or Buffer Size is no= t NULL but Buffer is NULL. + @retval EFI_OUT_OF_RESOURCES Could not allocate needed resources + @retval EFI_BUFFER_TOO_SMALL The BufferSize is too small to read the= current directory entry. + BufferSize has been updated with the si= ze needed to complete + the request. + @retval EFI_ACCESS_DENIED Server authentication failed. + @retval Others Unexpected error happened. + +**/ +EFI_STATUS +HttpBootGetBootFileCaller ( + IN HTTP_BOOT_PRIVATE_DATA *Private, + IN OUT UINTN *BufferSize, + IN VOID *Buffer OPTIONAL, + OUT HTTP_BOOT_IMAGE_TYPE *ImageType + ) +{ + HTTP_GET_BOOT_FILE_STATE State; + EFI_STATUS Status; + + if (Private->BootFileSize =3D=3D 0) { + State =3D GetBootFileHead; + } else { + State =3D LoadBootFile; + } + + for ( ; ;) { + switch (State) { + case GetBootFileHead: + // + // Try to use HTTP HEAD method. + // + Status =3D HttpBootGetBootFile ( + Private, + TRUE, + &Private->BootFileSize, + NULL, + &Private->ImageType + ); + if ((EFI_ERROR (Status)) && (Status !=3D EFI_BUFFER_TOO_SMALL)) { + if ((Private->AuthData !=3D NULL) && (Status =3D=3D EFI_ACCESS_D= ENIED)) { + // + // Try to use HTTP HEAD method again since the Authentication = information is provided. + // + State =3D GetBootFileHead; + } else { + State =3D GetBootFileGet; + } + } else { + State =3D LoadBootFile; + } + + break; + + case GetBootFileGet: + // + // Failed to get file size by HEAD method, may be trunked encoding= , try HTTP GET method. + // + ASSERT (Private->BootFileSize =3D=3D 0); + Status =3D HttpBootGetBootFile ( + Private, + FALSE, + &Private->BootFileSize, + NULL, + &Private->ImageType + ); + if (EFI_ERROR (Status) && (Status !=3D EFI_BUFFER_TOO_SMALL)) { + State =3D GetBootFileError; + } else { + State =3D LoadBootFile; + } + + break; + + case LoadBootFile: + if (*BufferSize < Private->BootFileSize) { + *BufferSize =3D Private->BootFileSize; + *ImageType =3D Private->ImageType; + Status =3D EFI_BUFFER_TOO_SMALL; + return Status; + } + + // + // Load the boot file into Buffer + // + Status =3D HttpBootGetBootFile ( + Private, + FALSE, + BufferSize, + Buffer, + ImageType + ); + return Status; + + case GetBootFileError: + default: + AsciiPrint ("\n Error: Could not retrieve NBP file size from HTTP= server.\n"); + return Status; + } + } +} + /** Attempt to download the boot file through HTTP message exchange. =20 @@ -349,68 +465,10 @@ HttpBootLoadFile ( } } =20 - if (Private->BootFileSize =3D=3D 0) { - // - // Discover the information about the bootfile if we haven't. - // - - // - // Try to use HTTP HEAD method. - // - Status =3D HttpBootGetBootFile ( - Private, - TRUE, - &Private->BootFileSize, - NULL, - &Private->ImageType - ); - if ((Private->AuthData !=3D NULL) && (Status =3D=3D EFI_ACCESS_DENIED)= ) { - // - // Try to use HTTP HEAD method again since the Authentication inform= ation is provided. - // - Status =3D HttpBootGetBootFile ( - Private, - TRUE, - &Private->BootFileSize, - NULL, - &Private->ImageType - ); - } else if ((EFI_ERROR (Status)) && (Status !=3D EFI_BUFFER_TOO_SMALL))= { - // - // Failed to get file size by HEAD method, may be trunked encoding, = try HTTP GET method. - // - ASSERT (Private->BootFileSize =3D=3D 0); - Status =3D HttpBootGetBootFile ( - Private, - FALSE, - &Private->BootFileSize, - NULL, - &Private->ImageType - ); - if (EFI_ERROR (Status) && (Status !=3D EFI_BUFFER_TOO_SMALL)) { - AsciiPrint ("\n Error: Could not retrieve NBP file size from HTTP= server.\n"); - goto ON_EXIT; - } - } - } - - if (*BufferSize < Private->BootFileSize) { - *BufferSize =3D Private->BootFileSize; - *ImageType =3D Private->ImageType; - Status =3D EFI_BUFFER_TOO_SMALL; - goto ON_EXIT; - } - // - // Load the boot file into Buffer + // Load the Boot File // - Status =3D HttpBootGetBootFile ( - Private, - FALSE, - BufferSize, - Buffer, - ImageType - ); + Status =3D HttpBootGetBootFileCaller (Private, BufferSize, Buffer, Image= Type); =20 ON_EXIT: HttpBootUninstallCallback (Private); diff --git a/NetworkPkg/HttpBootDxe/HttpBootImpl.h b/NetworkPkg/HttpBootDxe= /HttpBootImpl.h index 55adc9cb50..33da4fec51 100644 --- a/NetworkPkg/HttpBootDxe/HttpBootImpl.h +++ b/NetworkPkg/HttpBootDxe/HttpBootImpl.h @@ -11,6 +11,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent =20 #define HTTP_BOOT_CHECK_MEDIA_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20) =20 +typedef enum { + GetBootFileHead, + GetBootFileGet, + LoadBootFile, + GetBootFileError +} HTTP_GET_BOOT_FILE_STATE; + /** Attempt to complete a DHCPv4 D.O.R.A or DHCPv6 S.R.A.A sequence to retri= eve the boot resource information. =20 diff --git a/NetworkPkg/HttpDxe/HttpImpl.c b/NetworkPkg/HttpDxe/HttpImpl.c index 7c5c925cf7..a761ce3d5d 100644 --- a/NetworkPkg/HttpDxe/HttpImpl.c +++ b/NetworkPkg/HttpDxe/HttpImpl.c @@ -162,6 +162,7 @@ EfiHttpConfigure ( HttpInstance->TimeOutMillisec =3D HttpConfigData->TimeOutMillisec; HttpInstance->LocalAddressIsIPv6 =3D HttpConfigData->LocalAddressIsIPv= 6; HttpInstance->ConnectionClose =3D FALSE; + HttpInstance->ProxyConnected =3D FALSE; =20 if (HttpConfigData->LocalAddressIsIPv6) { CopyMem ( @@ -244,6 +245,8 @@ EfiHttpRequest ( CHAR8 *RequestMsg; CHAR8 *Url; UINTN UrlLen; + CHAR8 *ProxyUrl; + UINTN ProxyUrlLen; CHAR16 *HostNameStr; HTTP_TOKEN_WRAP *Wrap; CHAR8 *FileUrl; @@ -254,6 +257,7 @@ EfiHttpRequest ( // Initializations // Url =3D NULL; + ProxyUrl =3D NULL; UrlParser =3D NULL; RemotePort =3D 0; HostName =3D NULL; @@ -277,12 +281,18 @@ EfiHttpRequest ( // // Only support GET, HEAD, DELETE, PATCH, PUT and POST method in current= implementation. // - if ((Request !=3D NULL) && (Request->Method !=3D HttpMethodGet) && - (Request->Method !=3D HttpMethodHead) && (Request->Method !=3D HttpM= ethodDelete) && - (Request->Method !=3D HttpMethodPut) && (Request->Method !=3D HttpMe= thodPost) && - (Request->Method !=3D HttpMethodPatch)) - { - return EFI_UNSUPPORTED; + if (Request !=3D NULL) { + switch (Request->Method) { + case HttpMethodGet: + case HttpMethodHead: + case HttpMethodDelete: + case HttpMethodPut: + case HttpMethodPost: + case HttpMethodPatch: + break; + default: + return EFI_UNSUPPORTED; + } } =20 HttpInstance =3D HTTP_INSTANCE_FROM_PROTOCOL (This); @@ -337,22 +347,49 @@ EfiHttpRequest ( } =20 // - // Parse the URI of the remote host. + // Parse the Request URI. // Url =3D HttpInstance->Url; UrlLen =3D StrLen (Request->Url) + 1; - if (UrlLen > HTTP_URL_BUFFER_LEN) { + if (UrlLen > HttpInstance->UrlLen) { Url =3D AllocateZeroPool (UrlLen); if (Url =3D=3D NULL) { return EFI_OUT_OF_RESOURCES; } =20 - FreePool (HttpInstance->Url); - HttpInstance->Url =3D Url; + if (HttpInstance->Url !=3D NULL) { + FreePool (HttpInstance->Url); + } + + HttpInstance->Url =3D Url; + HttpInstance->UrlLen =3D UrlLen; } =20 UnicodeStrToAsciiStrS (Request->Url, Url, UrlLen); =20 + // + // In case of HTTP Connect, parse proxy URI from Request. + // + if (Request->Method =3D=3D HttpMethodConnect) { + ProxyUrl =3D HttpInstance->ProxyUrl; + ProxyUrlLen =3D StrLen (Request->ProxyUrl) + 1; + if (ProxyUrlLen > HttpInstance->ProxyUrlLen) { + ProxyUrl =3D AllocateZeroPool (ProxyUrlLen); + if (ProxyUrl =3D=3D NULL) { + return EFI_OUT_OF_RESOURCES; + } + + if (HttpInstance->ProxyUrl !=3D NULL) { + FreePool (HttpInstance->ProxyUrl); + } + + HttpInstance->ProxyUrl =3D ProxyUrl; + HttpInstance->ProxyUrlLen =3D ProxyUrlLen; + } + + UnicodeStrToAsciiStrS (Request->ProxyUrl, ProxyUrl, ProxyUrlLen); + } + // // From the information in Url, the HTTP instance will // be able to determine whether to use http or https. @@ -395,7 +432,7 @@ EfiHttpRequest ( } =20 UrlParser =3D NULL; - Status =3D HttpParseUrl (Url, (UINT32)AsciiStrLen (Url), FALSE, &Ur= lParser); + Status =3D HttpParseUrl (Url, (UINT32)AsciiStrLen (Url), FALSE, &UrlPa= rser); if (EFI_ERROR (Status)) { goto Error1; } diff --git a/NetworkPkg/HttpDxe/HttpProto.c b/NetworkPkg/HttpDxe/HttpProto.c index 33ae622c3f..6767d90c7d 100644 --- a/NetworkPkg/HttpDxe/HttpProto.c +++ b/NetworkPkg/HttpDxe/HttpProto.c @@ -737,6 +737,8 @@ HttpInitProtocol ( goto ON_ERROR; } =20 + HttpInstance->UrlLen =3D HTTP_URL_BUFFER_LEN; + return EFI_SUCCESS; =20 ON_ERROR: @@ -846,9 +848,23 @@ HttpCleanProtocol ( =20 if (HttpInstance->Url !=3D NULL) { FreePool (HttpInstance->Url); - HttpInstance->Url =3D NULL; + HttpInstance->Url =3D NULL; + HttpInstance->UrlLen =3D 0; + } + + if (HttpInstance->ProxyUrl !=3D NULL) { + FreePool (HttpInstance->ProxyUrl); + HttpInstance->ProxyUrl =3D NULL; + HttpInstance->ProxyUrlLen =3D 0; } =20 + if (HttpInstance->EndPointHostName !=3D NULL) { + FreePool (HttpInstance->EndPointHostName); + HttpInstance->EndPointHostName =3D NULL; + } + + HttpInstance->ProxyConnected =3D FALSE; + NetMapClean (&HttpInstance->TxTokens); NetMapClean (&HttpInstance->RxTokens); =20 diff --git a/NetworkPkg/HttpDxe/HttpProto.h b/NetworkPkg/HttpDxe/HttpProto.h index 620eb39158..3e4e86dad9 100644 --- a/NetworkPkg/HttpDxe/HttpProto.h +++ b/NetworkPkg/HttpDxe/HttpProto.h @@ -164,6 +164,15 @@ typedef struct _HTTP_PROTOCOL { NET_MAP RxTokens; =20 CHAR8 *Url; + UINTN UrlLen; + + // + // Proxy support + // + CHAR8 *ProxyUrl; + UINTN ProxyUrlLen; + BOOLEAN ProxyConnected; + CHAR8 *EndPointHostName; =20 // // Https Support --=20 2.36.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#94818): https://edk2.groups.io/g/devel/message/94818 Mute This Topic: https://groups.io/mt/94189619/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-