Beispiel #1
0
        public Task <ResponseResult> GetResponseAsync(HttpContextBase context, IEnumerable <RouteMatchResult> routeMatchResults)
        {
            context.ThrowIfNull("context");
            routeMatchResults.ThrowIfNull("routeMatchResults");

            RouteMatchResult[] unmatchedResults = routeMatchResults.Where(arg => arg.MatchResult.ResultType == MatchResultType.RouteNotMatched).ToArray();

            if (!unmatchedResults.Any())
            {
                return(ResponseResult.ResponseNotGenerated().AsCompletedTask());
            }

            RouteMatchResult[] unmatchedResultsThatMatchedOnUrlRelativePath = unmatchedResults.Where(arg1 => RouteMatchedUrlRelativePath(arg1.MatchResult)).ToArray();
            int minimumUnmatchedRestrictions = unmatchedResultsThatMatchedOnUrlRelativePath.Any() ? unmatchedResultsThatMatchedOnUrlRelativePath.Min(arg => arg.MatchResult.UnmatchedRestrictions.Count()) : 0;

            RouteMatchResult[] closestMatches = unmatchedResultsThatMatchedOnUrlRelativePath.Where(arg => arg.MatchResult.UnmatchedRestrictions.Count() == minimumUnmatchedRestrictions).ToArray();

            if (closestMatches.Length != 1)
            {
                return(ResponseResult.ResponseNotGenerated().AsCompletedTask());
            }

            RouteMatchResult closestMatch = closestMatches[0];

            IRestriction[]      unmatchedRestrictions = closestMatch.MatchResult.UnmatchedRestrictions.ToArray();
            MethodRestriction[] methodRestrictions    = unmatchedRestrictions.OfType <MethodRestriction>().ToArray();

            if (methodRestrictions.Any())
            {
                IEnumerable <string> methods = methodRestrictions
                                               .Select(arg => arg.Method)
                                               .Distinct(StringComparer.OrdinalIgnoreCase)
                                               .OrderBy(arg => arg);

                return(ResponseResult.ResponseGenerated(new Response().MethodNotAllowed().Header("Allow", String.Join(", ", methods))).AsCompletedTask());
            }
            if (unmatchedRestrictions.OfType <HeaderRestriction <AcceptHeader> >().Any())
            {
                return(ResponseResult.ResponseGenerated(new Response().NotAcceptable()).AsCompletedTask());
            }
            if (unmatchedRestrictions.OfType <HeaderRestriction <AcceptCharsetHeader> >().Any())
            {
                return(ResponseResult.ResponseGenerated(new Response().NotAcceptable()).AsCompletedTask());
            }
            if (unmatchedRestrictions.OfType <HeaderRestriction <AcceptEncodingHeader> >().Any())
            {
                return(ResponseResult.ResponseGenerated(new Response().NotAcceptable()).AsCompletedTask());
            }
            if (unmatchedRestrictions.OfType <HeaderRestriction <ContentEncodingHeader> >().Any())
            {
                return(ResponseResult.ResponseGenerated(new Response().UnsupportedMediaType()).AsCompletedTask());
            }

            return(ResponseResult.ResponseNotGenerated().AsCompletedTask());
        }
Beispiel #2
0
        public async Task <ResponseResult> GetResponseAsync(HttpContextBase context, IEnumerable <RouteMatchResult> routeMatchResults)
        {
            context.ThrowIfNull("context");
            routeMatchResults.ThrowIfNull("routeMatchResults");

            routeMatchResults = routeMatchResults.ToArray();

            RouteMatchResult[] matchedResults = routeMatchResults.Where(arg => arg.MatchResult.ResultType == MatchResultType.RouteMatched).ToArray();

            if (!matchedResults.Any())
            {
                return(ResponseResult.ResponseNotGenerated());
            }

            int maximumMatchedRestrictions = matchedResults.Max(arg => arg.MatchResult.MatchedRestrictions.Count());

            RouteMatchResult[] bestMatches = matchedResults.Where(arg => arg.MatchResult.MatchedRestrictions.CountEqual(maximumMatchedRestrictions)).ToArray();

            if (bestMatches.Length > 1)
            {
                return(ResponseResult.ResponseGenerated(new Response().MultipleChoices()));
            }
            if (bestMatches.Length == 0)
            {
                return(ResponseResult.ResponseNotGenerated());
            }

            RouteMatchResult   bestMatch          = bestMatches[0];
            AuthenticateResult authenticateResult = await bestMatch.Route.AuthenticateAsync(context.Request, context.Response);

            if (authenticateResult.ResultType == AuthenticateResultType.AuthenticationFailed)
            {
                return(ResponseResult.ResponseGenerated(authenticateResult.FailedResponse ?? new Response().Unauthorized()));
            }

            Task <IResponse> responseTask = bestMatch.Route.ProcessResponseAsync(context);

            return(ResponseResult.ResponseGenerated(responseTask, bestMatch.MatchResult.CacheKey));
        }
 public void SetUp()
 {
     _route = new Route.Routing.Route("name", Guid.NewGuid(), "relative");
     _result = new RouteMatchResult(_route, MatchResult.RouteMatched(Enumerable.Empty<IRestriction>(), "key"));
 }