// /**
//
// (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP<BR>
// Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved. <BR>
// Copyright (c) 2020, Broadcom. All rights reserved.<BR>
// SPDX-License-Identifier: BSD-2-Clause-Patent
//
// Module Name:
//
// Http.uni
//
// Abstract:
//
// String definitions for UEFI Shell HTTP command
//
//
// **/

/=#

#langdef   en-US "english"

#string STR_GEN_TOO_MANY           #language en-US "%H%s%N: Too many arguments. Try help http.\r\n"
#string STR_GEN_TOO_FEW            #language en-US "%H%s%N: Too few arguments. Try help http.\r\n"
#string STR_GEN_PARAM_INV          #language en-US "%H%s%N: Invalid argument - '%H%s%N'. Try help http.\r\n"
#string STR_GEN_PROBLEM            #language en-US "%H%s%N: Unknown flag - '%H%s%N'. Try help http.\r\n"
#string STR_GEN_FILE_OPEN_FAIL     #language en-US "%H%s%N: Cannot open file - '%H%s%N'\r\n"
#string STR_GEN_CRLF               #language en-US "\r\n"

#string STR_HTTP_ERR_NO_NIC        #language en-US "No network interface card found.\r\n"
#string STR_HTTP_ERR_NIC_NAME      #language en-US "Failed to get the name of the network interface card number %d - %r\r\n"
#string STR_HTTP_ERR_OPEN_PROTOCOL #language en-US "Unable to open HTTP protocol on '%H%s%N' - %r\r\n"
#string STR_HTTP_ERR_CONFIGURE     #language en-US "Unable to configure HTTP protocol on '%H%s%N' - %r\r\n"
#string STR_HTTP_ERR_DOWNLOAD      #language en-US "Unable to download the file '%H%s%N' on '%H%s%N' - %r\r\n"
#string STR_HTTP_ERR_WRITE         #language en-US "Unable to write into file '%H%s%N' - %r\r\n"
#string STR_HTTP_ERR_NIC_NOT_FOUND #language en-US "Network Interface Card '%H%s%N' not found.\r\n"
#string STR_HTTP_ERR_STATUSCODE    #language en-US "\r'%H%s%N' reports '%s' for '%H%s%N' \r\n"
#string STR_HTTP_DOWNLOADING       #language en-US "Downloading '%H%s%N'\r\n"

#string STR_GET_HELP_HTTP          #language en-US ""
".TH http 0 "Download a file from HTTP server."\r\n"
".SH NAME\r\n"
"Download a file from HTTP server.\r\n"
".SH SYNOPSIS\r\n"
" \r\n"
"HTTP [-i interface] [-l port] [-t timeout] [-s size] [-m] [-k]\r\n"
"      <URL> [localfilepath]\r\n"
".SH OPTIONS\r\n"
" \r\n"
"  -i interface     - Specifies an adapter name, i.e., eth0.\r\n"
"  -k                 Keep the downloaded file even if there was an error.\r\n"
"                     If this parameter is not used, the file will be deleted.\r\n"
"  -l port          - Specifies the local port number. Default value is 0\r\n"
"                     and the port number is automatically assigned.\r\n"
"  -m                 Measure and report download time (in seconds). \r\n"
"  -s size            The size of the download buffer for a chunk, in bytes.\r\n"
"                     Default is 32K. Note that larger buffer does not imply\r\n"
"                     better speed.\r\n"
"  -t timeout       - The number of seconds to wait for completion of\r\n"
"                     requests and responses. Default is 0 which is 'automatic'.\r\n"
"  %HURL%N\r\n"
"  Two types of providing of URLs are supported:\r\n"
"    1. tftp-like, where host and http_uri are separate parameters\r\n"
"       (example: host /host_uri), and\r\n\"
"    2. wget-like, where host and host_uri is one parameter.\r\n"
"       (example: host/host_uri)\r\n"
"\r\n"
"    host             - Specifies HTTP Server address.\r\n"
"                       Can be either IPv4 address or 'http (or https)://addr'\r\n"
"                       Can use addresses resolvable by DNS as well. \r\n"
"                       Port can be specified after ':' if needed. \r\n"
"                       By default port 80 is used.\r\n"
"    http_uri         - HTTP server URI to download the file.\r\n"
"\r\n"
"  localfilepath    - Local destination file path.\r\n"
".SH DESCRIPTION\r\n"
" \r\n"
"NOTES:\r\n"
"  1. The HTTP command allows geting of the file specified by its 'http_uri'\r\n"
"     path from the HTTP server specified by its 'host' IPv4 address. If the\r\n"
"     optional 'localfilepath' parameter is provided, the downloaded file is\r\n"
"     stored locally using the provided file path. If the local file path is\r\n"
"     not specified, the file is stored in the current directory using the file\r\n"
"     server's name.\r\n"
"  2. Before using the HTTP command, the network interface intended to be\r\n"
"     used to retrieve the file must be configured. This configuration may be\r\n"
"     done by means of the 'ifconfig' command.\r\n"
"  3. If a network interface is defined with the '-i' option then only this\r\n"
"     interface will be used to retrieve the remote file. Otherwise, all network\r\n"
"     interfaces are tried in the order they have been discovered during the\r\n"
"     DXE phase.\r\n"
".SH EXAMPLES\r\n"
" \r\n"
"EXAMPLES:\r\n"
"  * To get the file "dir1/file1.dat" from the HTTP server 192.168.1.1, port 8080, and\r\n"
"    store it as file2.dat in the current directory (use tftp-like URL format) :\r\n"
"    fs0:\> http 192.168.1.1:8080 dir1/file1.dat file2.dat\r\n"
"  * To get the file /image.bin via HTTPS from server 192.168.1.1 at port 443 \r\n"
"    (default HTTPS port), and store it in the current directory: \r\n"
"    fs0:\> http https://192.168.1.1 image.bin\r\n"
"    To get an index file from http://google.com and place it into the \r\n"
"    current directory:\r\n"
"    fs0:\> http google.com index.html\r\n"
".SH RETURNVALUES\r\n"
" \r\n"
"RETURN VALUES:\r\n"
"  SHELL_SUCCESS             The action was completed as requested.\r\n"
"  SHELL_INVALID_PARAMETER   One of the passed-in parameters was incorrectly\r\n"
"                            formatted or its value was out of bounds.\r\n"
"  HTTP_ERROR                No EFI errors, but the server reported a status code\r\n"
"                            which should be treated as an error. If an error body sent\r\n"
"                            by the server, and -k parameter is on command line,\r\n"
"                            the file wil be saved either as localfilepath filename,\r\n"
"                            or as an URI name in the current directory.\r\n"
"                            If '/' is at the end of the URL, and no locafilepath filename\r\n"
"                            is given on the command line, the file will be retrieved as\r\n"
"                            index.html.\r\n"
