The uri vmod let you parse a URI into the five generic components: scheme,
authority, path, query and fragment, as described by RFC3986.
vmod-uri makes no attempt to verify if the URI is using the scheme correctly,
but rather it extracts the generic components, if present, of an URI.
parse is usually called before any other functions, but in case of no prior
call, an implicit parse will take place with the default parameters before the
function itself will run.
vcl 4.1;
import uri;
sub vcl_backend_response {
if (beresp.status == 301 || beresp.status == 302) {
uri.parse(beresp.http.location);
uri.set_port();
set beresp.http.location = uri.as_string();
set beresp.status = beresp.status; // The reason field will be automatically set
}
}
vcl 4.1;
import goto;
import uri;
sub vcl_backend_response {
call follow_redirects;
}
sub follow_redirects {
if (beresp.status == 301 || beresp.status == 302) {
uri.parse(beresp.http.location);
uri.write();
set bereq.backend = goto.dns_backend(uri.as_string(), ttl_rule = abide, ignore_update = onempty);
return(retry);
}
}
VOID parse([STRING input], BOOL norm = 0)
Parse a URI and build the corresponding internal state,
any information from the previous state is overwritten. The URI must
be provided in the percent-encoded format. No mandatory components,
meaning a URI lacking components is as valid as a full URI containing
all components. The authority component must start with two forward
slashes, and a path must start with a forward slash if an authority
component is also present.
If input is not present, as it is optional, parse will use the
combined value of be/req.http.Host + be/req.url. However, if input
is present, but happens to be NULL, or empty, then all internal states
will be initiated but left empty.
If norm is true, the internal state is also rebuilt to reflect the
safe normalization process of RFC3986 Section 6.
The generic normalization process (safe):
Remove percent-encoding for unreserved characters.
Convert upper-case letters to lower-case in both the host and the scheme component.
Convert remaining lower-case percent-encoding to upper-case.
Employ remove_dot_segments algorithm to the path component, see RFC3986 Section 5.2.4.
Convert empty path to “/” when an authority component is present.
Removes default port for some commonly understood schemes: http (80), https (443), ftp (21), ssh (22).
Arguments:
norm accepts type BOOL with a default value of 0 optional
input accepts type STRING
Type: Function
Returns: None
VOID write()
Replace the combined value of be/req.http.Host + be/req.url with the
currently loaded internal state. The scheme and userinfo component
are currently ignored as they are not in use.
Arguments: None
Type: Function
Returns: None
Restricted to: client, backend
VOID reset()
Reset internal state of the VMOD back to its default.
Arguments: None
Type: Function
Returns: None
STRING as_string(STRING fmt = "%S%A%P%Q%F", BOOL decode = 0)
Build and return a URI based on the current internal state. Use fmt
to decide how and what to return. The default is to return all
components, as described by RFC3986 Section 5.3.
If decode is true, then before returning an attempt will be made to
remove percent encoding for any reserved characters.
fmt is a format string, valid percent-tokens are:
%% - outputs a single percent.
%S - outputs the scheme component of the internal state.
%A - outputs the autority component of the internal state.
%U - outputs the userinfo component of the internal state.
%H - outputs the host component of the internal state.
%p - outputs the port component of the internal state.
%P - outputs the path component of the internal state.
%Q - outputs the query component of the internal state.
%F - outputs the fragment component of the internal state.
Arguments:
fmt accepts type STRING with a default value of %S%A%P%Q%F optional
decode accepts type BOOL with a default value of 0 optional
Type: Function
Returns: String
STRING get_scheme()
Returns the scheme found in the currently loaded internal state,
or NULL if there is none.
Arguments: None
Type: Function
Returns: String
VOID set_scheme(STRING new = "")
Sets the scheme found in the currently loaded internal state.
In case of no new string given (default), the previous string from the internal state is cleared.
Arguments:
new accepts type STRING with a default value of empty. optional
Type: Function
Returns: None
STRING get_userinfo(BOOL decode = 0)
Returns the user information found in the currently loaded
internal state, or NULL if there is none.
If decode is true, then before returning an attempt will be made to
remove percent encoding for any reserved characters.
Arguments:
decode accepts type BOOL with a default value of 0 optional
Type: Function
Returns: String
VOID set_userinfo(STRING new = "", BOOL encode = 0)
Sets the user information found in the currently loaded internal state.
In case of no new string given (default), the previous string from the internal state is cleared.
If encode is true, then before returning an attempt will be made to
add percent encoding for any reserved characters.
Arguments:
new accepts type STRING with a default value of empty. optional
encode accepts type BOOL with a default value of 0 optional
Type: Function
Returns: None
STRING get_host(BOOL decode = 0)
Returns the host found in the currently loaded internal state,
or NULL if there is none.
If decode is true, then before returning an attempt will be made to
remove percent encoding for any reserved characters.
Arguments:
decode accepts type BOOL with a default value of 0 optional
Type: Function
Returns: String
VOID set_host(STRING new = "", BOOL encode = 0)
Sets the host found in the currently loaded internal state.
In case of no new string given (default), the previous string from the internal state is cleared.
If encode is true, then before returning an attempt will be made to
add percent encoding for any reserved characters.
Arguments:
new accepts type STRING with a default value of empty. optional
encode accepts type BOOL with a default value of 0 optional
Type: Function
Returns: None
STRING get_port()
Returns the port found in the currently loaded internal state,
or NULL if there is none.
Arguments: None
Type: Function
Returns: String
VOID set_port(STRING new = "")
Sets the port found in the currently loaded internal state.
In case of no new string given (default), the previous string from the internal state is cleared.
Arguments:
new accepts type STRING with a default value of empty. optional
Type: Function
Returns: None
STRING get_path(BOOL decode = 0)
Returns the path found in the currently loaded internal state,
or NULL if there is none.
If decode is true, then before returning an attempt will be made to
remove percent encoding for any reserved characters.
Arguments:
decode accepts type BOOL with a default value of 0 optional
Type: Function
Returns: String
VOID set_path(STRING new = "", BOOL encode = 0)
Sets the path found in the currently loaded internal state.
In case of no new string given (default), the previous string from the internal state is cleared.
If encode is true, then before returning an attempt will be made to
add percent encoding for any reserved characters.
Arguments:
new accepts type STRING with a default value of empty. optional
encode accepts type BOOL with a default value of 0 optional
Type: Function
Returns: None
STRING get_query(BOOL decode = 0)
Returns the query found in the currently loaded internal state,
or NULL if there is none.
If decode is true, then before returning an attempt will be made to
remove percent encoding for any reserved characters.
Arguments:
decode accepts type BOOL with a default value of 0 optional
Type: Function
Returns: String
VOID set_query(STRING new = "", BOOL encode = 0)
Sets the query found in the currently loaded internal state.
In case of no new string given (default), the previous string from the internal state is cleared.
If encode is true, then before returning an attempt will be made to
add percent encoding for any reserved characters.
Arguments:
new accepts type STRING with a default value of empty. optional
encode accepts type BOOL with a default value of 0 optional
Type: Function
Returns: None
STRING get_fragment(BOOL decode = 0)
Returns the fragment found in the currently loaded internal state,
or NULL if there is none.
If decode is true, then before returning an attempt will be made to
remove percent encoding for any reserved characters.
Arguments:
decode accepts type BOOL with a default value of 0 optional
Type: Function
Returns: String
VOID set_fragment(STRING new = "", BOOL encode = 0)
Sets the fragment found in the currently loaded internal state.
In case of no new string given (default), the previous string from the internal state is cleared.
If encode is true, then before returning an attempt will be made to
add percent encoding for any reserved characters.
Arguments:
new accepts type STRING with a default value of empty. optional
encode accepts type BOOL with a default value of 0 optional
Type: Function
Returns: None
STRING decode(STRANDS in, BOOL strict = 1)
Perform URL decoding of the provided string, limited to only decoding the characters that are allowed in a URI as per RFC3986 (“unreserved characters”).
Note that compared to the other functions provided in this VMOD, this function provides a stand-alone one-shot operation, and does not alter or refer to any internal state.
With strict=true (default), decoding failures will also fail the VCL
transaction. For strict=false, the operation will never fail, and
will attempt to preserve existing unparseable inputs.
Example
set req.url = uri.decode(req.url);
Arguments:
in accepts type STRANDS
strict accepts type BOOL with a default value of 1 optional
Type: Function
Returns: String
The uri VMOD is available in Varnish Enterprise version 6.0.8r2 and later.