URL = [ absoluteURL | relativeURL ] [ "#" fragment ]
absoluteURL = protocol ":" ( hier_part | opaque_part )
relativeURL = ( net_path | abs_path | rel_path ) [ "?" query ]
hier_part = ( net_path | abs_path ) [ "?" query ]
opaque_part (s) = urichar_no_slash *urichar
net_path = "//" authority [ abs_path ]
abs_path (s) = "/" path_segments
rel_path (s) = 1*relsegchar [ abs_path ]
protocol (s) = alpha *( alphanum | "+" | "-" | "." )
authority (s) = server | reg_name
reg_name (s) = 1*( pathchar | ";" )
server = [ [ userinfo "@" ] host [ ":" port ] ]
userinfo = user [ ":" password ]
user (s) = *relsegchar
password (s) = *relsegchar
host (s) = hostname | IPv4address
hostname = *( domainlabel "." ) toplabel [ "." ]
domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
toplabel = alpha | alpha *( alphanum | "-" ) alphanum
IPv4address = 1*digit "." 1*digit "." 1*digit "." 1*digit
port (s) = *digit
path_segments = segment *( "/" segment )
segment = *pathchar *( ";" *pathchar )
query (s) = *urichar
fragment (s) = *urichar
escaped = "%" hex hex
pathchar = relsegchar | ":"
relsegchar = unreserved | escaped | "@" | "&" | "=" | "+" | "$" | ","
urichar = unreserved | escaped | reserved
urichar_no_slash = unreserved | escaped | reserved_no_slash
reserved = reserved_no_slash | "/"
reserved_no_slash = ";" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
unreserved = alphanum | mark
mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
alphanum = alpha | digit
alpha = ( "a" ... "z" ) | ( "A" ... "Z" )
hex = ( "a" ... "f" ) | ( "A" ... "F" ) | digit
digit = "0" ... "9"
|