Vladimir Olovyannikov d8ab884fe9 ShellPkg/DynamicCommand: add HttpDynamicCommand
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>
2020-09-30 01:28:51 +00:00

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;
}