[#boost-urls-resolve]
= xref:boost.adoc[boost]::xref:boost/urls.adoc[urls]::resolve
:relfileprefix: ../../
:mrdocs:

Resolve a URL reference against a base URL

== Synopsis

Declared in `&lt;https://www.github.com/boostorg/url/blob/develop/include/boost/url/url_base.hpp#L2977[boost&sol;url&sol;url&lowbar;base&period;hpp]&gt;`

[source,cpp,subs="verbatim,replacements,macros,-callouts"]
----
system::result&lt;void&gt;
resolve(
    xref:boost/urls/url_view_base.adoc[url&lowbar;view&lowbar;base] const& base,
    xref:boost/urls/url_view_base.adoc[url&lowbar;view&lowbar;base] const& ref,
    xref:boost/urls/url_base.adoc[url&lowbar;base]& dest);
----

== Description

This function attempts to resolve a URL reference `ref` against the base URL `base` in a manner similar to that of a web browser resolving an anchor tag&period;

The base URL must satisfy the _URI_ grammar&period; In other words, it must contain a scheme&period;

Relative references are only usable when in the context of a base absolute URI&period; This process of resolving a relative _reference_ within the context of a _base_ URI is defined in detail in rfc3986 (see below)&period;

The resolution process works as if the relative reference is appended to the base URI and the result is normalized&period;

Given the input base URL, this function resolves the relative reference as if performing the following steps&colon;

* Ensure the base URI has at least a scheme
* Normalizing the reference path
* Merge base and reference paths
* Normalize the merged path

This function places the result of the resolution into `dest`, which can be any of the url containers that inherit from xref:boost/urls/url_base.adoc[`url&lowbar;base`]&period;

If an error occurs, the contents of `dest` is unspecified and `ec` is set&period;

[NOTE]
====
Abnormal hrefs where the number of &quot;&period;&period;&quot; segments exceeds the number of segments in the base path are handled by including the unmatched &quot;&period;&period;&quot; segments in the result, as described in https://www.rfc-editor.org/errata/eid4547[Errata 4547]&period;

====

== Example

[,cpp]
----
url dest;
system::error_code ec;

resolve("/one/two/three", "four", dest, ec);
assert( dest.str() == "/one/two/four" );

resolve("http://example.com/", "/one", dest, ec);
assert( dest.str() == "http://example.com/one" );

resolve("http://example.com/one", "/two", dest, ec);
assert( dest.str() == "http://example.com/two" );

resolve("http://a/b/c/d;p?q", "g#s", dest, ec);
assert( dest.str() == "http://a/b/c/g#s" );
----
== BNF

[,cpp]
----
absolute-URI  = scheme ":" hier-part [ "?" query ]
----
== Exception Safety

Basic guarantee&period; Calls to allocate may throw&period;

== Specification

== Return Value

An empty `boost&colon;&colon;system&colon;&colon;result` upon success, otherwise an error code if `!base&period;has&lowbar;scheme()`&period;

== Parameters

[cols="1,4"]
|===
| Name| Description
| *base*
| The base URL to resolve against&period;
| *ref*
| The URL reference to resolve&period;
| *dest*
| The container where the result is written, upon success&period;
|===

== See Also

xref:boost/urls/url.adoc[`url`], xref:boost/urls/url_view.adoc[`url&lowbar;view`]&period;


[.small]#Created with https://www.mrdocs.com[MrDocs]#
