net/http: Allow use of non-standard TCP/IP ports

Allow the use of HTTP servers listening on ports other 80. This is done
with an extension to the http notation:

  (http[,server[,port]])

 - or -

  (http[,server[:port]])

Signed-off-by: Stephen Balousek <sbalousek@wickedloop.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
Stephen Balousek authored and Daniel Kiper committed 2022-02-08 16:06:49 +01:00
1 parent a0548c140c
commit ac8a37dda0
2 files changed
+71 -2

No files matched your search

+38 -2
View File
@@ -312,6 +312,10 @@ http_establish (struct grub_file *file, grub_off_t offset, int initial)
int i;
struct grub_net_buff *nb;
grub_err_t err;
char *server_name;
char *port_string;
const char *port_string_end;
unsigned long port_number;
nb = grub_netbuff_alloc (GRUB_NET_TCP_RESERVE_SIZE
+ sizeof ("GET ") - 1
@@ -390,10 +394,42 @@ http_establish (struct grub_file *file, grub_off_t offset, int initial)
grub_netbuff_put (nb, 2);
grub_memcpy (ptr, "\r\n", 2);
data->sock = grub_net_tcp_open (file->device->net->server,
HTTP_PORT, http_receive,
port_string = grub_strrchr (file->device->net->server, ',');
if (port_string == NULL)
{
/* If ",port" is not found in the http server string, look for ":port". */
port_string = grub_strrchr (file->device->net->server, ':');
/* For IPv6 addresses, the ":port" syntax is not supported and ",port" must be used. */
if (port_string != NULL && grub_strchr (file->device->net->server, ':') != port_string)
port_string = NULL;
}
if (port_string != NULL)
{
port_number = grub_strtoul (port_string + 1, &port_string_end, 10);
if (*(port_string + 1) == '\0' || *port_string_end != '\0')
return grub_error (GRUB_ERR_BAD_NUMBER, N_("non-numeric or invalid port number `%s'"), port_string + 1);
if (port_number == 0 || port_number > 65535)
return grub_error (GRUB_ERR_OUT_OF_RANGE, N_("port number `%s' not in the range of 1 to 65535"), port_string + 1);
server_name = grub_strdup (file->device->net->server);
if (server_name == NULL)
return grub_errno;
server_name[port_string - file->device->net->server] = '\0';
}
else
{
port_number = HTTP_PORT;
server_name = file->device->net->server;
}
data->sock = grub_net_tcp_open (server_name,
port_number, http_receive,
http_err, NULL,
file);
if (server_name != file->device->net->server)
grub_free (server_name);
if (!data->sock)
{
grub_netbuff_free (nb);