예제 #1
0
            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);
            }
예제 #2
0
        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);
        }
예제 #3
0
        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);
                }
            }
        }
예제 #4
0
 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);
     }
 }
예제 #5
0
        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);
        }