public async Task BodyParser_Parse_ContentEncoding_GZip_And_DecompressGzipAndDeflate_Is_True_Should_Decompress(string compression) { // Arrange var bytes = Encoding.ASCII.GetBytes("0"); var compressed = CompressionUtils.Compress(compression, bytes); var bodyParserSettings = new BodyParserSettings { Stream = new MemoryStream(compressed), ContentType = "text/plain", DeserializeJson = false, ContentEncoding = compression.ToUpperInvariant(), DecompressGZipAndDeflate = true }; // Act var result = await BodyParser.Parse(bodyParserSettings); // Assert result.DetectedBodyType.Should().Be(BodyType.String); result.DetectedBodyTypeFromContentType.Should().Be(BodyType.String); result.BodyAsBytes.Should().BeEquivalentTo(new byte[] { 48 }); result.BodyAsJson.Should().BeNull(); result.BodyAsString.Should().Be("0"); result.DetectedCompression.Should().Be(compression); }
/// <inheritdoc cref="IOwinRequestMapper.MapAsync"/> public async Task <RequestMessage> MapAsync(IRequest request, IWireMockMiddlewareOptions options) { (UrlDetails urldetails, string clientIP) = ParseRequest(request); string method = request.Method; Dictionary <string, string[]> headers = null; IEnumerable <string> contentEncodingHeader = null; if (request.Headers.Any()) { headers = new Dictionary <string, string[]>(); foreach (var header in request.Headers) { headers.Add(header.Key, header.Value); if (string.Equals(header.Key, HttpKnownHeaderNames.ContentEncoding, StringComparison.OrdinalIgnoreCase)) { contentEncodingHeader = header.Value; } } } IDictionary <string, string> cookies = null; if (request.Cookies.Any()) { cookies = new Dictionary <string, string>(); foreach (var cookie in request.Cookies) { cookies.Add(cookie.Key, cookie.Value); } } BodyData body = null; if (request.Body != null && BodyParser.ShouldParseBody(method, options.AllowBodyForAllHttpMethods == true)) { var bodyParserSettings = new BodyParserSettings { Stream = request.Body, ContentType = request.ContentType, DeserializeJson = !options.DisableJsonBodyParsing.GetValueOrDefault(false), ContentEncoding = contentEncodingHeader?.FirstOrDefault(), DecompressGZipAndDeflate = !options.DisableRequestBodyDecompressing.GetValueOrDefault(false) }; body = await BodyParser.Parse(bodyParserSettings); } return(new RequestMessage(urldetails, method, clientIP, body, headers, cookies) { DateTime = DateTime.UtcNow }); }
public static async Task <ResponseMessage> CreateAsync(HttpResponseMessage httpResponseMessage, Uri requiredUri, Uri originalUri, bool deserializeJson, bool decompressGzipAndDeflate) { var responseMessage = new ResponseMessage { StatusCode = (int)httpResponseMessage.StatusCode }; // Set both content and response headers, replacing URLs in values var headers = (httpResponseMessage.Content?.Headers.Union(httpResponseMessage.Headers) ?? Enumerable.Empty <KeyValuePair <string, IEnumerable <string> > >()).ToArray(); if (httpResponseMessage.Content != null) { var stream = await httpResponseMessage.Content.ReadAsStreamAsync(); IEnumerable <string> contentTypeHeader = null; if (headers.Any(header => string.Equals(header.Key, HttpKnownHeaderNames.ContentType, StringComparison.OrdinalIgnoreCase))) { contentTypeHeader = headers.First(header => string.Equals(header.Key, HttpKnownHeaderNames.ContentType, StringComparison.OrdinalIgnoreCase)).Value; } IEnumerable <string> contentEncodingHeader = null; if (headers.Any(header => string.Equals(header.Key, HttpKnownHeaderNames.ContentEncoding, StringComparison.OrdinalIgnoreCase))) { contentEncodingHeader = headers.First(header => string.Equals(header.Key, HttpKnownHeaderNames.ContentEncoding, StringComparison.OrdinalIgnoreCase)).Value; } var bodyParserSettings = new BodyParserSettings { Stream = stream, ContentType = contentTypeHeader?.FirstOrDefault(), DeserializeJson = deserializeJson, ContentEncoding = contentEncodingHeader?.FirstOrDefault(), DecompressGZipAndDeflate = decompressGzipAndDeflate }; responseMessage.BodyData = await BodyParser.Parse(bodyParserSettings); } foreach (var header in headers) { // If Location header contains absolute redirect URL, and base URL is one that we proxy to, // we need to replace it to original one. if (string.Equals(header.Key, HttpKnownHeaderNames.Location, StringComparison.OrdinalIgnoreCase) && Uri.TryCreate(header.Value.First(), UriKind.Absolute, out Uri absoluteLocationUri) && string.Equals(absoluteLocationUri.Host, requiredUri.Host, StringComparison.OrdinalIgnoreCase)) { var replacedLocationUri = new Uri(originalUri, absoluteLocationUri.PathAndQuery); responseMessage.AddHeader(header.Key, replacedLocationUri.ToString()); } else { responseMessage.AddHeader(header.Key, header.Value.ToArray()); } } return(responseMessage); }
public async Task BodyParser_Parse_DetectedBodyTypeNoJsonParsing(byte[] content, BodyType detectedBodyType) { // arrange var bodyParserSettings = new BodyParserSettings { Stream = new MemoryStream(content), ContentType = null, DeserializeJson = false }; // act var body = await BodyParser.Parse(bodyParserSettings); // assert Check.That(body.DetectedBodyType).IsEqualTo(detectedBodyType); }
public async Task BodyParser_Parse_ContentTypeString(string contentType, string bodyAsString, BodyType detectedBodyType, BodyType detectedBodyTypeFromContentType) { // Arrange var bodyParserSettings = new BodyParserSettings { Stream = new MemoryStream(Encoding.UTF8.GetBytes(bodyAsString)), ContentType = contentType, DeserializeJson = true }; // Act var body = await BodyParser.Parse(bodyParserSettings); // Assert Check.That(body.BodyAsBytes).IsNotNull(); Check.That(body.BodyAsJson).IsNull(); Check.That(body.BodyAsString).Equals(bodyAsString); Check.That(body.DetectedBodyType).IsEqualTo(detectedBodyType); Check.That(body.DetectedBodyTypeFromContentType).IsEqualTo(detectedBodyTypeFromContentType); }
public async Task BodyParser_Parse_WithUTF8EncodingAndContentTypeMultipart_DetectedBodyTypeEqualsString() { // Arrange string contentType = "multipart/form-data"; string body = @" -----------------------------9051914041544843365972754266 Content-Disposition: form-data; name=""text"" text default -----------------------------9051914041544843365972754266 Content-Disposition: form-data; name=""file1""; filename=""a.txt"" Content-Type: text/plain Content of a txt -----------------------------9051914041544843365972754266 Content-Disposition: form-data; name=""file2""; filename=""a.html"" Content-Type: text/html <!DOCTYPE html><title>Content of a.html.</title> -----------------------------9051914041544843365972754266--"; var bodyParserSettings = new BodyParserSettings { Stream = new MemoryStream(Encoding.UTF8.GetBytes(body)), ContentType = contentType, DeserializeJson = true }; // Act var result = await BodyParser.Parse(bodyParserSettings); // Assert Check.That(result.DetectedBodyType).IsEqualTo(BodyType.String); Check.That(result.DetectedBodyTypeFromContentType).IsEqualTo(BodyType.MultiPart); Check.That(result.BodyAsBytes).IsNotNull(); Check.That(result.BodyAsJson).IsNull(); Check.That(result.BodyAsString).IsNotNull(); }
public async Task RequestMessageBodyMatcher_GetMatchingScore_Funcs_Matching(object body, RequestMessageBodyMatcher matcher, bool shouldMatch) { // assign BodyData bodyData; if (body is byte[] b) { var bodyParserSettings = new BodyParserSettings { Stream = new MemoryStream(b), ContentType = null, DeserializeJson = true }; bodyData = await BodyParser.Parse(bodyParserSettings); } else if (body is string s) { var bodyParserSettings = new BodyParserSettings { Stream = new MemoryStream(Encoding.UTF8.GetBytes(s)), ContentType = null, DeserializeJson = true }; bodyData = await BodyParser.Parse(bodyParserSettings); } else { throw new Exception(); } var requestMessage = new RequestMessage(new UrlDetails("http://localhost"), "GET", "127.0.0.1", bodyData); // act var result = new RequestMatchResult(); var score = matcher.GetMatchingScore(requestMessage, result); // assert Check.That(score).IsEqualTo(shouldMatch ? 1d : 0d); }
public async Task BodyParser_Parse_WithUTF16EncodingAndContentTypeMultipart_DetectedBodyTypeEqualsString() { // Arrange string contentType = "multipart/form-data"; string body = char.ConvertFromUtf32(0x1D161); //U+1D161 = MUSICAL SYMBOL SIXTEENTH NOTE var bodyParserSettings = new BodyParserSettings { Stream = new MemoryStream(Encoding.UTF8.GetBytes(body)), ContentType = contentType, DeserializeJson = true }; // Act var result = await BodyParser.Parse(bodyParserSettings); // Assert Check.That(result.DetectedBodyType).IsEqualTo(BodyType.Bytes); Check.That(result.DetectedBodyTypeFromContentType).IsEqualTo(BodyType.MultiPart); Check.That(result.BodyAsBytes).IsNotNull(); Check.That(result.BodyAsJson).IsNull(); Check.That(result.BodyAsString).IsNull(); }