[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v4 15/19] Prepend prefix when HTTP path is relative
From: |
Robbie Harwood |
Subject: |
[PATCH v4 15/19] Prepend prefix when HTTP path is relative |
Date: |
Mon, 9 Jan 2023 18:30:41 -0500 |
From: Stephen Benjamin <stephen@redhat.com>
This sets a couple of variables. With the url http://www.example.com/foo/bar :
http_path: /foo/bar
http_url: http://www.example.com/foo/bar
Resolves: rhbz#1616395
Co-authored-by: Javier Martinez Canillas <javierm@redhat.com>
Co-authored-by: Robbie Harwood <rharwood@redhat.com>
Signed-off-by: Peter Jones <pjones@redhat.com>
Signed-off-by: Stephen Benjamin <stephen@redhat.com>
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
Signed-off-by: Robbie Harwood <rharwood@redhat.com>
---
grub-core/kern/main.c | 10 ++++-
grub-core/net/efi/http.c | 85 ++++++++++++++++++++++++++++++----------
2 files changed, 73 insertions(+), 22 deletions(-)
diff --git a/grub-core/kern/main.c b/grub-core/kern/main.c
index e1e6cf7a02..353a62ef1e 100644
--- a/grub-core/kern/main.c
+++ b/grub-core/kern/main.c
@@ -131,12 +131,20 @@ grub_set_prefix_and_root (void)
if (fwdevice && fwpath)
{
char *fw_path;
+ char separator[3] = ")";
- fw_path = grub_xasprintf ("(%s)/%s", fwdevice, fwpath);
+ grub_dprintf ("fw_path", "\n");
+ grub_dprintf ("fw_path", "fwdevice:\"%s\" fwpath:\"%s\"\n", fwdevice,
fwpath);
+
+ if (!grub_strncmp(fwdevice, "http", 4) && fwpath[0] != '/')
+ grub_strcpy(separator, ")/");
+
+ fw_path = grub_xasprintf ("(%s%s%s", fwdevice, separator, fwpath);
if (fw_path)
{
grub_env_set ("fw_path", fw_path);
grub_env_export ("fw_path");
+ grub_dprintf ("fw_path", "fw_path:\"%s\"\n", fw_path);
grub_free (fw_path);
}
}
diff --git a/grub-core/net/efi/http.c b/grub-core/net/efi/http.c
index 87fc02da20..ed0d40bee3 100644
--- a/grub-core/net/efi/http.c
+++ b/grub-core/net/efi/http.c
@@ -8,10 +8,53 @@
static void
http_configure (struct grub_efi_net_device *dev, int prefer_ip6)
{
+ grub_efi_ipv6_address_t address;
grub_efi_http_config_data_t http_config;
grub_efi_httpv4_access_point_t httpv4_node;
grub_efi_httpv6_access_point_t httpv6_node;
grub_efi_status_t status;
+ int https;
+ char *http_url;
+ const char *rest, *http_server, *http_path = NULL;
+
+ http_server = grub_env_get ("root");
+ https = (grub_strncmp (http_server, "https", 5) == 0) ? 1 : 0;
+
+ /* extract http server + port */
+ if (http_server)
+ {
+ http_server = grub_strchr (http_server, ',');
+ if (http_server)
+ http_server++;
+ }
+
+ /* fw_path is like (http,192.168.1.1:8000)/httpboot, extract path part */
+ http_path = grub_env_get ("fw_path");
+ if (http_path)
+ {
+ http_path = grub_strchr (http_path, ')');
+ if (http_path)
+ {
+ http_path++;
+ grub_env_unset ("http_path");
+ grub_env_set ("http_path", http_path);
+ grub_env_export ("http_path");
+ }
+ }
+
+ if (http_server && http_path)
+ {
+ if (grub_efi_string_to_ip6_address (http_server, &address, &rest) &&
*rest == 0)
+ http_url = grub_xasprintf ("%s://[%s]%s", https ? "https" : "http",
http_server, http_path);
+ else
+ http_url = grub_xasprintf ("%s://%s%s", https ? "https" : "http",
http_server, http_path);
+ if (http_url)
+ {
+ grub_env_unset ("http_url");
+ grub_env_set ("http_url", http_url);
+ grub_free (http_url);
+ }
+ }
grub_efi_http_t *http = dev->http;
@@ -339,32 +382,32 @@ grub_efihttp_open (struct grub_efi_net_device *dev,
grub_err_t err;
grub_off_t size = 0;
char *buf = NULL;
- char *root_url;
- grub_efi_ipv6_address_t address;
- const char *rest;
+ char *file_name = NULL;
+ const char *http_path;
- if (grub_efi_string_to_ip6_address (file->device->net->server, &address,
&rest) && *rest == 0)
- root_url = grub_xasprintf ("%s://[%s]", type ? "https" : "http",
file->device->net->server);
- else
- root_url = grub_xasprintf ("%s://%s", type ? "https" : "http",
file->device->net->server);
- if (root_url)
- {
- grub_env_unset ("root_url");
- grub_env_set ("root_url", root_url);
- grub_free (root_url);
- }
- else
- {
+ /* If path is relative, prepend http_path */
+ http_path = grub_env_get ("http_path");
+ if (http_path && file->device->net->name[0] != '/') {
+ file_name = grub_xasprintf ("%s/%s", http_path, file->device->net->name);
+ if (!file_name)
return grub_errno;
+ }
+
+ err = efihttp_request (dev->http, file->device->net->server,
+ file_name ? file_name : file->device->net->name, type,
1, 0);
+ if (err != GRUB_ERR_NONE)
+ {
+ grub_free (file_name);
+ return err;
}
- err = efihttp_request (dev->http, file->device->net->server,
file->device->net->name, type, 1, 0);
+ err = efihttp_request (dev->http, file->device->net->server,
+ file_name ? file_name : file->device->net->name, type,
0, &size);
+ grub_free (file_name);
if (err != GRUB_ERR_NONE)
- return err;
-
- err = efihttp_request (dev->http, file->device->net->server,
file->device->net->name, type, 0, &size);
- if (err != GRUB_ERR_NONE)
- return err;
+ {
+ return err;
+ }
if (size)
{
--
2.39.0
- [PATCH v4 04/19] efinet: add structures for PXE messages, (continued)
- [PATCH v4 04/19] efinet: add structures for PXE messages, Robbie Harwood, 2023/01/09
- [PATCH v4 10/19] efinet: also use the firmware acceleration for http, Robbie Harwood, 2023/01/09
- [PATCH v4 02/19] net: read bracketed ipv6 addrs and port numbers, Robbie Harwood, 2023/01/09
- [PATCH v4 11/19] efi/http: match protocol+hostname of boot url in root_url, Robbie Harwood, 2023/01/09
- [PATCH v4 14/19] Try mac/guid/etc before grub.cfg on tftp config files, Robbie Harwood, 2023/01/09
- [PATCH v4 06/19] bootp: Process DHCPACK packet during HTTP Boot, Robbie Harwood, 2023/01/09
- [PATCH v4 12/19] Add fw_path variable to detect config file on efi, Robbie Harwood, 2023/01/09
- [PATCH v4 13/19] use fw_path prefix when fallback searching for grub config, Robbie Harwood, 2023/01/09
- [PATCH v4 08/19] efinet: set DNS server from UEFI protocol, Robbie Harwood, 2023/01/09
- [PATCH v4 05/19] grub.texi: Add net_bootp6 doumentation, Robbie Harwood, 2023/01/09
- [PATCH v4 15/19] Prepend prefix when HTTP path is relative,
Robbie Harwood <=
- [PATCH v4 16/19] efi/http: Enclose literal IPv6 addresses in square brackets, Robbie Harwood, 2023/01/09
- [PATCH v4 17/19] http: Prepend prefix when the HTTP path is relative, Robbie Harwood, 2023/01/09
- [PATCH v4 03/19] efinet + bootp: add net_bootp6 command supporting dhcpv6, Robbie Harwood, 2023/01/09
- [PATCH v4 18/19] normal/main: Discover the device to read the config from as a fallback, Robbie Harwood, 2023/01/09
- [PATCH v4 19/19] efinet: Add DHCP proxy support, Robbie Harwood, 2023/01/09
- [PATCH v4 07/19] efinet Configure network from UEFI device path, Robbie Harwood, 2023/01/09
- [PATCH v4 09/19] Support UEFI networking protocols, Robbie Harwood, 2023/01/09