private int ReadQueryString(ReadOnlySpan <char> buffer, QueryString queryString, HttpRequest request) { int result = 0; ReadOnlySpan <char> qsdata = buffer; for (int i = 0; i < buffer.Length; i++) { if (buffer[i] == '?') { result = i; qsdata = buffer.Slice(i + 1, buffer.Length - i - 1); break; } } if (result > 0) { string name = null; string value = null; int offset = 0; for (int i = 0; i < qsdata.Length; i++) { if (qsdata[i] == '=') { name = new string(qsdata.Slice(offset, i - offset)); offset = i + 1; } else if (qsdata[i] == '&') { if (name != null && i - offset > 0) { value = new string(qsdata.Slice(offset, i - offset)); queryString.Add(name, value); name = null; } offset = i + 1; } } if (name != null && qsdata.Length - offset > 0) { value = new string(qsdata.Slice(offset, qsdata.Length - offset)); queryString.Add(name, value); } } return(result); }
public static int ReadUrlQueryString(ReadOnlySpan <char> url, QueryString queryString, HttpRequest request) { int result = 0; ReadOnlySpan <char> qsdata = url; for (int i = 0; i < url.Length; i++) { if (url[i] == '?') { result = i; qsdata = url.Slice(i + 1, url.Length - i - 1); break; } } if (result > 0) { string name = null; string value = null; int offset = 0; for (int i = 0; i < qsdata.Length; i++) { if (qsdata[i] == '=') { name = new string(qsdata.Slice(offset, i - offset)); offset = i + 1; } else if (qsdata[i] == '&') { if (name != null && i - offset > 0) { value = new string(qsdata.Slice(offset, i - offset)); queryString.Add(name, value); name = null; } offset = i + 1; } } if (name != null && qsdata.Length - offset > 0) { value = new string(qsdata.Slice(offset, qsdata.Length - offset)); queryString.Add(name, value); } } return(result); }
public static void AnalyzeQueryString(ReadOnlySpan <char> url, QueryString qs) { int offset = 0; string name = null, value = null; for (int i = 0; i < url.Length; i++) { if (url[i] == '?') { offset = i + 1; } if (url[i] == '=' && offset > 0) { name = new string(url.Slice(offset, i - offset)); offset = i + 1; } if (name != null && url[i] == '&') { if (i > offset) { value = new string(url.Slice(offset, i - offset)); qs.Add(name, value); } name = null; offset = i + 1; } } if (name != null) { if (url.Length > offset) { value = new string(url.Slice(offset, url.Length - offset)); qs.Add(name, value); } } }
public bool Execut(string url, QueryString queryString) { if (mItems.Count == 0) { return(url == mTemplate); } else { int offset = mOffset; for (int i = 0; i < mItems.Count; i++) { MatchItem item = mItems[i]; string value; var count = item.Match(url, offset, out value); if (count <= 0) { return(false); } queryString.Add(item.Name, value); offset += count; } return(true); } }
public bool Match(HttpRequest request, out RouteMatchResult result, QueryString queryString) { result = null; RouteGroup rg = null; UrlRoute urlRoute = null; string key = $"{request.GetHostBase()}{request.BaseUrl}"; if (mRouteCached.TryGetValue(key, out UrlRouteAgent cached)) { cached.ActiveTime = TimeWatch.GetTotalSeconds(); if (cached.Route == null && cached.Version == this.mVersion) { if (request.Server.EnableLog(EventArgs.LogType.Info)) { request.Server.Log(EventArgs.LogType.Info, $"HTTP {request.ID} {request.RemoteIPAddress} {request.Method} {key} rewrite cached miss"); } return(false); } if (cached.Route != null && cached.Version == this.mVersion) { if (cached.Parameters.Count > 0) { foreach (var item in cached.Parameters) { queryString.Add(item.Key, item.Value); } } result = cached.MatchResult; if (request.Server.EnableLog(EventArgs.LogType.Info)) { request.Server.Log(EventArgs.LogType.Info, $"HTTP {request.ID} {request.RemoteIPAddress} {request.Method} {key} rewrite cached hit"); } return(true); } } bool iscached = true; Dictionary <string, string> parameters = new Dictionary <string, string>(); result = new RouteMatchResult(); if (mRoutes.TryGetValue(request.Path, out rg)) { urlRoute = rg.Match(request.BaseUrl, ref result, parameters, request.Ext, request); } if (urlRoute == null) { RouteGroup[] rgs = mMatchRoutes; if (rgs != null) { for (int i = 0; i < rgs.Length; i++) { rg = rgs[i]; if (rg.PathLevel == request.PathLevel) { iscached = rg.Cached; urlRoute = rg.Match(request.BaseUrl, ref result, parameters, request.Ext, request); if (urlRoute != null) { if (urlRoute.Prefix != null && urlRoute.Prefix.Type == UrlPrefix.PrefixType.Host) { iscached = true; } break; } } } } } if (urlRoute != null) { result.HasQueryString = urlRoute.HasQueryString; } if (urlRoute != null && urlRoute.Prefix?.Type == UrlPrefix.PrefixType.Param) { return(urlRoute != null); } var agent = new UrlRouteAgent { Route = urlRoute, Version = this.mVersion, MatchResult = result, Parameters = parameters }; if (parameters.Count > 0) { foreach (var ps in parameters) { queryString.Add(ps.Key, ps.Value); } } if (iscached) { UrlRouteAgent exits = (UrlRouteAgent)mRouteCached.ExistOrAdd(key, agent); if (request.Server.EnableLog(EventArgs.LogType.Info)) { request.Server.Log(EventArgs.LogType.Info, $"HTTP {request.ID} {request.RemoteIPAddress} {request.Method} {key} rewrite save to cached"); } if (exits != null) { exits.Route = urlRoute; exits.Version = mVersion; exits.MatchResult = result; exits.Parameters = parameters; } } return(urlRoute != null); }