uri->efragment = tmp;
}
- /* Identify absolute/relative URI */
- if ( ( tmp = strchr ( raw, ':' ) ) ) {
+ /* Identify absolute URIs */
+ epath = raw;
+ for ( tmp = raw ; ; tmp++ ) {
+ /* Possible scheme character (for our URI schemes) */
+ if ( isalpha ( *tmp ) || ( *tmp == '-' ) || ( *tmp == '_' ) )
+ continue;
+ /* Invalid scheme character or NUL: is a relative URI */
+ if ( *tmp != ':' )
+ break;
/* Absolute URI: identify hierarchical/opaque */
uri->scheme = raw;
*(tmp++) = '\0';
uri->opaque = tmp;
epath = NULL;
}
- } else {
- /* Relative URI */
- epath = raw;
+ break;
}
/* If we don't have a path (i.e. we have an absolute URI with
},
};
+/** Relative URI with colons in path */
+static struct uri_test uri_colons = {
+ "/boot/52:54:00:12:34:56/boot.ipxe",
+ {
+ .path = "/boot/52:54:00:12:34:56/boot.ipxe",
+ .epath = "/boot/52:54:00:12:34:56/boot.ipxe",
+ },
+};
+
/** URI with port number */
static struct uri_port_test uri_explicit_port = {
"http://192.168.0.1:8080/boot.php",
uri_parse_format_dup_ok ( &uri_file_relative );
uri_parse_format_dup_ok ( &uri_file_absolute );
uri_parse_format_dup_ok ( &uri_file_volume );
+ uri_parse_format_dup_ok ( &uri_colons );
/** URI port number tests */
uri_port_ok ( &uri_explicit_port );