/// <summary>Append a relative path to a Uri, handling traling slashes appropiately.</summary>
/// <param name="uri">The base Uri. </param>
/// <param name="relativeOrAbslouteUri">The relative or absloute URI. </param>
/// <param name="sep">The seperator. </param>
/// <returns>The appended Uri. </returns>
internal static Uri AppendPathToUri(Uri uri, string relativeOrAbslouteUri, string sep)
{
Uri relativeUri;
// Because of URI's Scheme, URI.TryCreate() can't differentiate a string with colon from an absolute URI.
// A workaround is added here to verify if a given string is an absolute URI.
if (Uri.TryCreate(relativeOrAbslouteUri, UriKind.Absolute, out relativeUri)
&& (relativeUri.Scheme == "http" || relativeUri.Scheme == "https"))
{
// Handle case if relPath is an absolute Uri
if (uri.IsBaseOf(relativeUri))
{
return relativeUri;
}
// Happens when using fiddler, DNS aliases, or potentially NATs
var absoluteUri = new Uri(relativeOrAbslouteUri);
return new Uri(uri, absoluteUri.AbsolutePath);
}
var ub = new UriBuilder(uri);
var appendString = ub.Path.EndsWith(sep) ? relativeOrAbslouteUri : sep + relativeOrAbslouteUri;
var escapedRelativeOrAbslouteUri = Uri.EscapeUriString(appendString);
ub.Path += escapedRelativeOrAbslouteUri;
return ub.Uri;
}