private List <MediaTypeSegmentWithQuality> GetMediaTypes( MediaTypeCollection contentTypes, HttpRequest request) { var result = new List <MediaTypeSegmentWithQuality>(); AcceptHeaderParser.ParseAcceptHeader(request.Headers[HeaderNames.Accept], result); for (int i = 0; i < result.Count; i++) { var mediaType = new MediaType(result[i].MediaType); if (!RespectBrowserAcceptHeader && mediaType.MatchesAllSubTypes && mediaType.MatchesAllTypes) { result.Clear(); return(result); } if (!InAcceptableMediaTypes(result[i].MediaType, contentTypes)) { result.RemoveAt(i); } } result.Sort((left, right) => left.Quality > right.Quality ? -1 : (left.Quality == right.Quality ? 0 : 1)); return(result); }
public void ParseAcceptHeader_GracefullyRecoversFromInvalidMediaTypeValues_AndReturnsValidMediaTypes( string[] acceptHeader, string[] expected) { // Arrange var expectedMediaTypes = expected.Select(e => new MediaTypeSegmentWithQuality(new StringSegment(e), 1.0)).ToList(); // Act var parsed = AcceptHeaderParser.ParseAcceptHeader(acceptHeader); // Assert Assert.Equal(expectedMediaTypes, parsed); }
public void ParseAcceptHeader_DelimiterAtStart() { // Arrange var expected = new MediaTypeSegmentWithQuality[0]; var input = ",;:"; // Act var parsed = AcceptHeaderParser.ParseAcceptHeader(new List <string>() { input }); // Assert Assert.Equal(expected, parsed); }
public void ParseAcceptHeader_InvalidTokenAtEnd() { // Arrange var expected = new MediaTypeSegmentWithQuality[0]; var input = "*/*:"; // Act var parsed = AcceptHeaderParser.ParseAcceptHeader(new List <string>() { input }); // Assert Assert.Equal(expected, parsed); }
public void ParseAcceptHeader_GracefullyRecoversFromInvalidMediaTypeValues_AndReturnsValidMediaTypes( string acceptHeader, string expected) { // Arrange var expectedMediaTypes = expected .Split(new [] { "," }, StringSplitOptions.RemoveEmptyEntries) .Select(e => new MediaTypeSegmentWithQuality(new StringSegment(e), 1.0)) .ToList(); // Act var parsed = AcceptHeaderParser.ParseAcceptHeader(acceptHeader.Split(new [] { "," }, StringSplitOptions.RemoveEmptyEntries)); // Assert expectedMediaTypes.Should().BeEquivalentTo(parsed); }
public void ParseAcceptHeader_InvalidTokenAtStart() { // Arrange var expected = new MediaTypeSegmentWithQuality[0]; var input = ":;:"; // Act var parsed = AcceptHeaderParser.ParseAcceptHeader(new List <string>() { input }); // Assert expected.Should().Equal(parsed); }
public void ParseAcceptHeader_ValidMediaType_FollowedBySemicolon() { // Arrange var expected = new MediaTypeSegmentWithQuality[0]; var input = "*/*Content-Type;application/json"; // Act var parsed = AcceptHeaderParser.ParseAcceptHeader(new List <string>() { input }); // Assert Assert.Equal(expected, parsed); }
public void ParseAcceptHeader_ValidMediaType_FollowedByNondelimiter() { // Arrange var expected = new MediaTypeSegmentWithQuality[0]; var input = "*/*Content-Type:application/json"; // Act var parsed = AcceptHeaderParser.ParseAcceptHeader(new List <string>() { input }); // Assert expected.Should().Equal(parsed); }
public void ParseAcceptHeader_ParsesSimpleHeader() { // Arrange var header = "application/json"; var expected = new List <MediaTypeSegmentWithQuality> { new MediaTypeSegmentWithQuality(new StringSegment("application/json"), 1.0) }; // Act var parsed = AcceptHeaderParser.ParseAcceptHeader(new List <string> { header }); // Assert Assert.Equal(expected, parsed); }
public void ParseAcceptHeader_ParsesSimpleHeaderWithMultipleValues_InvalidFormat() { // Arrange var header = "application/json, application/xml,;q=0.8"; var expectedMediaTypes = new List <MediaTypeSegmentWithQuality> { new MediaTypeSegmentWithQuality(new StringSegment("application/json"), 1.0), new MediaTypeSegmentWithQuality(new StringSegment("application/xml"), 1.0), }; // Act var mediaTypes = AcceptHeaderParser.ParseAcceptHeader(new List <string> { header }); // Assert Assert.Equal(expectedMediaTypes, mediaTypes); }
public void ParseAcceptHeader_ParsesMultipleHeaderValues() { // Arrange var expected = new List <MediaTypeSegmentWithQuality> { new MediaTypeSegmentWithQuality(new StringSegment("application/json"), 1.0), new MediaTypeSegmentWithQuality(new StringSegment("application/xml;q=0.8"), 0.8) }; // Act var parsed = AcceptHeaderParser.ParseAcceptHeader( new List <string> { "application/json", "", "application/xml;q=0.8" }); // Assert Assert.Equal(expected, parsed); }
private List <MediaTypeSegmentWithQuality> GetAcceptableMediaTypes(MazeRequest request) { var result = new List <MediaTypeSegmentWithQuality>(); AcceptHeaderParser.ParseAcceptHeader(request.Headers[HeaderNames.Accept], result); for (var i = 0; i < result.Count; i++) { var mediaType = new MediaType(result[i].MediaType); if (!_respectBrowserAcceptHeader && mediaType.MatchesAllSubTypes && mediaType.MatchesAllTypes) { result.Clear(); return(result); } } result.Sort(_sortFunction); return(result); }
public async Task Invoke(HttpContext context) { var aceeptHeaderEnricherContext = new AceeptHeaderEnricherContext(context, _options); foreach (var aceeptHeaderEnricher in _aceeptHeaderEnrichers.Where(a => a.CanExecute(aceeptHeaderEnricherContext))) { aceeptHeaderEnricher.Execute(aceeptHeaderEnricherContext); } var acceptHeaders = new List <MediaTypeSegmentWithQuality>(); AcceptHeaderParser.ParseAcceptHeader(context.Request.Headers[HeaderNames.Accept], acceptHeaders); context.Features.Set <IOutputFormatter>(OutputFormatterSelector.SelectFormatter(_options.Value.OutputFormatters.OfType <TextOutputFormatter>(), acceptHeaders)); await _next(context); }
public void ParseAcceptHeader_ValidMediaType_FollowedByWhitespace() { // Arrange var expected = new MediaTypeSegmentWithQuality[] { new MediaTypeSegmentWithQuality(new StringSegment("application/json"), 1.0), }; var input = "*/*Content-Type application/json"; // Act var parsed = AcceptHeaderParser.ParseAcceptHeader(new List <string>() { input }); // Assert Assert.Equal(expected, parsed); }
public void ParseAcceptHeader_ValidMediaType_FollowedByComma() { // Arrange var expected = new MediaTypeSegmentWithQuality[] { new MediaTypeSegmentWithQuality(new StringSegment("*/*Content-Type"), 1.0), new MediaTypeSegmentWithQuality(new StringSegment("application/json"), 1.0), }; var input = "*/*Content-Type,application/json"; // Act var parsed = AcceptHeaderParser.ParseAcceptHeader(new List <string>() { input }); // Assert expected.Should().Equal(parsed); }
public static List <MediaTypeSegmentWithQuality> GetAcceptableMediaTypes(this HttpRequest request) { var mvcOptions = request.HttpContext.RequestServices.GetRequiredService <IOptions <MvcOptions> >()?.Value; var result = new List <MediaTypeSegmentWithQuality>(); //If the accept header contains '*/*' or 'text/html' ignore all accept headers AcceptHeaderParser.ParseAcceptHeader(request.Headers[HeaderNames.Accept], result); for (var i = 0; i < result.Count; i++) { var mediaType = new MediaType(result[i].MediaType); if ((!mvcOptions.RespectBrowserAcceptHeader && mediaType.MatchesAllSubTypes && mediaType.MatchesAllTypes) || result[i].MediaType == "text/html") { result.Clear(); return(result); } } result.Sort(_sortFunction); return(result); }
public void ParseAcceptHeader_ParsesSimpleHeaderWithMultipleValues() { // Arrange var header = "application/json, application/xml;q=0.8"; var expected = new List <MediaTypeSegmentWithQuality> { new MediaTypeSegmentWithQuality(new StringSegment("application/json"), 1.0), new MediaTypeSegmentWithQuality(new StringSegment("application/xml;q=0.8"), 0.8) }; // Act var parsed = AcceptHeaderParser.ParseAcceptHeader(new List <string> { header }); // Assert Assert.Equal(expected, parsed); foreach (var mediaType in parsed) { Assert.Same(header, mediaType.MediaType.Buffer); } }