optimize ParseParameters to use native Uri class

This commit is contained in:
sbwalker 2024-02-29 10:09:19 -05:00
parent 76680777ff
commit dd1d0d1cb8
3 changed files with 62 additions and 71 deletions

View File

@ -384,9 +384,7 @@
_path = _name; _path = _name;
} }
var fragment = (_path.Contains("?")) ? _path.Substring(_path.IndexOf("?")) : ""; (_path, string parameters) = Utilities.ParsePath(_path);
fragment = (_path.Contains("#")) ? _path.Substring(_path.IndexOf("#")) : "";
_path = (!string.IsNullOrEmpty(fragment)) ? _path.Replace(fragment, "") : _path;
if (_path.Contains("/")) if (_path.Contains("/"))
{ {
@ -412,7 +410,7 @@
page.Path = parent.Path + "/" + Utilities.GetFriendlyUrl(_path); page.Path = parent.Path + "/" + Utilities.GetFriendlyUrl(_path);
} }
} }
page.Path += fragment; page.Path += parameters;
} }
else else
{ {

View File

@ -526,9 +526,7 @@
_path = _name; _path = _name;
} }
var fragment = (_path.Contains("?")) ? _path.Substring(_path.IndexOf("?")) : ""; (_path, string parameters) = Utilities.ParsePath(_path);
fragment = (_path.Contains("#")) ? _path.Substring(_path.IndexOf("#")) : "";
_path = (!string.IsNullOrEmpty(fragment)) ? _path.Replace(fragment, "") : _path;
if (_path.Contains("/")) if (_path.Contains("/"))
{ {
@ -554,7 +552,7 @@
_page.Path = parent.Path + "/" + Utilities.GetFriendlyUrl(_path); _page.Path = parent.Path + "/" + Utilities.GetFriendlyUrl(_path);
} }
} }
_page.Path += fragment; _page.Path += parameters;
} }
else else
{ {

View File

@ -20,88 +20,83 @@ namespace Oqtane.Shared
return $"{type.Namespace}, {assemblyName}"; return $"{type.Namespace}, {assemblyName}";
} }
public static (string UrlParameters, string Querystring, string Anchor) ParseParameters(string parameters) public static (string UrlParameters, string Querystring, string Fragment) ParseParameters(string url)
{ {
// /path/urlparameters
// /urlparameters /urlparameters?Id=1 /urlparameters#5 /urlparameters?Id=1#5 /urlparameters?reload#5 // /urlparameters /urlparameters?Id=1 /urlparameters#5 /urlparameters?Id=1#5 /urlparameters?reload#5
// Id=1 Id=1#5 reload#5 reload // Id=1 Id=1#5 reload#5 reload
// #5 // #5
var urlparameters = string.Empty; if (!url.StartsWith("/")) // paths always start with "/"
var querystring = string.Empty;
var anchor = string.Empty;
if (parameters.Contains('#'))
{ {
anchor = parameters.Split('#').Last(); url = ((!url.StartsWith("#")) ? "/?" : "/") + url;
parameters = parameters.Replace("#" + anchor, ""); }
url = ((!url.Contains("://")) ? Constants.PackageRegistryUrl : "") + url;
var uri = new Uri(url);
var querystring = uri.Query.Replace("?", "");
var fragment = uri.Fragment.Replace("#", "");
var urlparameters = uri.LocalPath;
urlparameters = (urlparameters == "/") ? "" : urlparameters;
if (urlparameters.Contains(Constants.UrlParametersDelimiter))
{
urlparameters = urlparameters.Substring(urlparameters.IndexOf(Constants.UrlParametersDelimiter) + 1);
} }
if (parameters.Contains('?')) return (urlparameters, querystring, fragment);
{
urlparameters = parameters.Split('?').First();
querystring = parameters.Replace(urlparameters + "?", "");
}
else if (parameters.Contains('/'))
{
urlparameters = parameters;
}
else
{
querystring = parameters;
}
return (urlparameters, querystring, anchor);
} }
private static (string Path, string Parameters) ParsePath(string path, string parameters) public static (string Path, string Parameters) ParsePath(string url)
{ {
if (!string.IsNullOrEmpty(path)) url = (!url.StartsWith("/") ? "/" : "") + url;
(string path, string querystring, string fragment) = ParseParameters(url);
var uriBuilder = new UriBuilder
{ {
if (path.Contains('?')) Path = path,
{ Query = querystring,
parameters = "?" + path.Split('?').Last(); Fragment = fragment
path = path.Split('?').First(); };
}
if (path.Contains('#')) return (uriBuilder.Path, uriBuilder.Uri.Query + uriBuilder.Uri.Fragment);
{
parameters = "#" + path.Split('#').Last();
path = path.Split('#').First();
}
}
return (path, parameters);
} }
public static string NavigateUrl(string alias, string path, string parameters) public static string NavigateUrl(string alias, string path, string parameters)
{ {
string urlparameters; if (!string.IsNullOrEmpty(parameters))
string querystring;
string anchor;
// parse path (in case parameters are embedded in path)
(path, parameters) = ParsePath(path, parameters);
// parse parameters
(urlparameters, querystring, anchor) = ParseParameters(parameters);
if (!string.IsNullOrEmpty(urlparameters))
{ {
if (urlparameters.StartsWith("/")) urlparameters = urlparameters.Remove(0, 1); // parse path
path += $"/{Constants.UrlParametersDelimiter}/{urlparameters}"; (path, _) = ParsePath(path);
// parse parameters
(string urlparameters, string querystring, string fragment) = ParseParameters(parameters);
// add urlparameters to path
if (!string.IsNullOrEmpty(urlparameters))
{
if (urlparameters.StartsWith("/")) urlparameters = urlparameters.Remove(0, 1);
path += $"/{Constants.UrlParametersDelimiter}/{urlparameters}";
}
// build url
var uriBuilder = new UriBuilder
{
Path = !string.IsNullOrEmpty(alias)
? (!string.IsNullOrEmpty(path)) ? $"{alias}{path}": $"{alias}"
: $"{path}",
Query = querystring,
Fragment = fragment
};
path = uriBuilder.Uri.PathAndQuery;
}
else
{
path = ((!string.IsNullOrEmpty(alias)) ? alias + "/" : "") + path;
} }
// build url return path;
var uriBuilder = new UriBuilder
{
Path = !string.IsNullOrEmpty(alias)
? (!string.IsNullOrEmpty(path))
? $"{alias}/{path}"
: $"{alias}"
: $"{path}",
Query = querystring,
};
anchor = string.IsNullOrEmpty(anchor) ? "" : "#" + anchor;
return uriBuilder.Uri.PathAndQuery + anchor;
} }
public static string EditUrl(string alias, string path, int moduleid, string action, string parameters) public static string EditUrl(string alias, string path, int moduleid, string action, string parameters)