Introduce an http client utilizing EDK2 HTTP protocol, to allow fast image downloading from http/https servers. HTTP download speed is usually faster than tftp. The client is based on the same approach as tftp dynamic command, and uses the same UEFI Shell command line parameters. This makes it easy integrating http into existing UEFI Shell scripts. Note that to enable HTTP download, feature Pcd gEfiNetworkPkgTokenSpaceGuid.PcdAllowHttpConnections must be set to TRUE. BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2860 Signed-off-by: Vladimir Olovyannikov <vladimir.olovyannikov@broadcom.com> Cc: Samer El-Haj-Mahmoud <Samer.El-Haj-Mahmoud@arm.com> Cc: Laszlo Ersek <lersek@redhat.com> Cc: Zhichao Gao <zhichao.gao@intel.com> Cc: Maciej Rabeda <maciej.rabeda@linux.intel.com> Cc: Jiaxin Wu <jiaxin.wu@intel.com> Cc: Siyuan Fu <siyuan.fu@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Liming Gao <liming.gao@intel.com> Cc: Nd <nd@arm.com> Reviewed-by: Zhichao Gao <zhichao.gao@intel.com> Tested-by: Laszlo Ersek <lersek@redhat.com>
		
			
				
	
	
		
			138 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Produce "http" shell dynamic command.
 | |
| 
 | |
|   Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved. <BR>
 | |
|   Copyright (c) 2015, ARM Ltd. All rights reserved.<BR>
 | |
|   Copyright (c) 2020, Broadcom. All rights reserved.<BR>
 | |
| 
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
| **/
 | |
| #include <Protocol/ShellDynamicCommand.h>
 | |
| #include "Http.h"
 | |
| 
 | |
| /**
 | |
|   This is the shell command handler function pointer callback type.  This
 | |
|   function handles the command when it is invoked in the shell.
 | |
| 
 | |
|   @param[in] This               The instance of the
 | |
|                                 EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL.
 | |
|   @param[in] SystemTable        The pointer to the system table.
 | |
|   @param[in] ShellParameters    The parameters associated with the command.
 | |
|   @param[in] Shell              The instance of the shell protocol used in
 | |
|                                 the context of processing this command.
 | |
| 
 | |
|   @return EFI_SUCCESS           the operation was sucessful
 | |
|   @return other                 the operation failed.
 | |
| **/
 | |
| SHELL_STATUS
 | |
| EFIAPI
 | |
| HttpCommandHandler (
 | |
|   IN EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL    *This,
 | |
|   IN EFI_SYSTEM_TABLE                      *SystemTable,
 | |
|   IN EFI_SHELL_PARAMETERS_PROTOCOL         *ShellParameters,
 | |
|   IN EFI_SHELL_PROTOCOL                    *Shell
 | |
|   )
 | |
| {
 | |
|   gEfiShellParametersProtocol = ShellParameters;
 | |
|   gEfiShellProtocol           = Shell;
 | |
| 
 | |
|   return RunHttp (gImageHandle, SystemTable);
 | |
| }
 | |
| 
 | |
| /**
 | |
|   This is the command help handler function pointer callback type.  This
 | |
|   function is responsible for displaying help information for the associated
 | |
|   command.
 | |
| 
 | |
|   @param[in] This        The instance of the EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL.
 | |
|   @param[in] Language    The pointer to the language string to use.
 | |
| 
 | |
|   @return string         Pool allocated help string, must be freed by caller
 | |
| **/
 | |
| CHAR16 *
 | |
| EFIAPI
 | |
| HttpCommandGetHelp (
 | |
|   IN EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL    *This,
 | |
|   IN CONST CHAR8                           *Language
 | |
|   )
 | |
| {
 | |
|   return HiiGetString (
 | |
|            mHttpHiiHandle,
 | |
|            STRING_TOKEN (STR_GET_HELP_HTTP),
 | |
|            Language
 | |
|            );
 | |
| }
 | |
| 
 | |
| EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL mHttpDynamicCommand = {
 | |
|   HTTP_APP_NAME,
 | |
|   HttpCommandHandler,
 | |
|   HttpCommandGetHelp
 | |
| };
 | |
| 
 | |
| /**
 | |
|   Entry point of Http Dynamic Command.
 | |
| 
 | |
|   Produce the DynamicCommand protocol to handle "http" command.
 | |
| 
 | |
|   @param ImageHandle            The image handle of the process.
 | |
|   @param SystemTable            The EFI System Table pointer.
 | |
| 
 | |
|   @retval EFI_SUCCESS           Http command is executed sucessfully.
 | |
|   @retval EFI_ABORTED           HII package was failed to initialize.
 | |
|   @retval others                Other errors when executing http command.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| HttpCommandInitialize (
 | |
|   IN EFI_HANDLE               ImageHandle,
 | |
|   IN EFI_SYSTEM_TABLE         *SystemTable
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS                  Status;
 | |
| 
 | |
|   mHttpHiiHandle = InitializeHiiPackage (ImageHandle);
 | |
|   if (mHttpHiiHandle == NULL) {
 | |
|     return EFI_ABORTED;
 | |
|   }
 | |
| 
 | |
|   Status = gBS->InstallProtocolInterface (
 | |
|                   &ImageHandle,
 | |
|                   &gEfiShellDynamicCommandProtocolGuid,
 | |
|                   EFI_NATIVE_INTERFACE,
 | |
|                   &mHttpDynamicCommand
 | |
|                   );
 | |
|   ASSERT_EFI_ERROR (Status);
 | |
|   return Status;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Http driver unload handler.
 | |
| 
 | |
|   @param ImageHandle            The image handle of the process.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The image is unloaded.
 | |
|   @retval Others                Failed to unload the image.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| HttpUnload (
 | |
|   IN EFI_HANDLE               ImageHandle
 | |
| )
 | |
| {
 | |
|   EFI_STATUS                  Status;
 | |
| 
 | |
|   Status = gBS->UninstallProtocolInterface (
 | |
|                   ImageHandle,
 | |
|                   &gEfiShellDynamicCommandProtocolGuid,
 | |
|                   &mHttpDynamicCommand
 | |
|                   );
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return Status;
 | |
|   }
 | |
| 
 | |
|   HiiRemovePackages (mHttpHiiHandle);
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 |