mirror of
https://github.com/ipxe/ipxe
synced 2026-04-04 03:00:20 +03:00
[uri] Decode/encode URIs when parsing/unparsing
Currently, handling of URI escapes is ad-hoc; escaped strings are stored as-is in the URI structure, and it is up to the individual protocol to unescape as necessary. This is error-prone and expensive in terms of code size. Modify this behavior by unescaping in parse_uri() and escaping in unparse_uri() those fields that typically handle URI escapes (hostname, user, password, path, query, fragment), and allowing unparse_uri() to accept a subset of fields to print so it can be easily used to generate e.g. the escaped HTTP path?query request. Signed-off-by: Joshua Oreman <oremanj@rwcr.net> Signed-off-by: Marty Connor <mdc@etherboot.org>
This commit is contained in:
committed by
Marty Connor
parent
ef9d1a32c6
commit
3d9dd93a14
@@ -61,7 +61,9 @@ int boot_next_server_and_filename ( struct in_addr next_server,
|
||||
const char *filename ) {
|
||||
struct uri *uri;
|
||||
struct image *image;
|
||||
char buf[ 23 /* tftp://xxx.xxx.xxx.xxx/ */ + strlen(filename) + 1 ];
|
||||
char buf[ 23 /* tftp://xxx.xxx.xxx.xxx/ */ +
|
||||
( 3 * strlen(filename) ) /* completely URI-encoded */
|
||||
+ 1 /* NUL */ ];
|
||||
int filename_is_absolute;
|
||||
int rc;
|
||||
|
||||
@@ -78,8 +80,10 @@ int boot_next_server_and_filename ( struct in_addr next_server,
|
||||
* between filenames with and without initial slashes,
|
||||
* which is significant for TFTP.
|
||||
*/
|
||||
snprintf ( buf, sizeof ( buf ), "tftp://%s/%s",
|
||||
inet_ntoa ( next_server ), filename );
|
||||
snprintf ( buf, sizeof ( buf ), "tftp://%s/",
|
||||
inet_ntoa ( next_server ) );
|
||||
uri_encode ( filename, buf + strlen ( buf ),
|
||||
sizeof ( buf ) - strlen ( buf ), URI_PATH );
|
||||
filename = buf;
|
||||
}
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@ int imgfetch ( struct image *image, const char *uri_string,
|
||||
if ( password )
|
||||
uri->password = "***";
|
||||
unparse_uri ( uri_string_redacted, sizeof ( uri_string_redacted ),
|
||||
uri );
|
||||
uri, URI_ALL );
|
||||
uri->password = password;
|
||||
|
||||
if ( ( rc = create_downloader ( &monojob, image, image_register,
|
||||
|
||||
Reference in New Issue
Block a user