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();
}