mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-05-05 15:34:33 +02:00
* Version 2.x * Setup .NET 9 * 12 * cleanup some #if for NETSTANDARD1_3 * cleanup + fix tests for net8 * openapi * NO ConfigureAwait(false) + cleanup * . * #endif * HashSet * WireMock.Net.NUnit * HttpContext * Add WebSockets (#1423) * Add WebSockets * Add tests * fix * more tests * Add tests * ... * remove IOwin * - * tests * fluent * ok * match * . * byte[] * x * func * func * byte * trans * ... * frameworks......... * jmes * xxx * sc * using var httpClient = new HttpClient(); * usings * maxRetries * up * xunit v3 * ct * --- * ct * ct2 * T Unit * WireMock.Net.TUnitTests / 10 * t unit first * --project * no tunit * t2 * --project * --project * ci - --project * publish ./test/wiremock-coverage.xml * windows * . * log * ... * log * goed * BodyType * . * . * --scenario * ... * pact * ct * . * WireMock.Net.RestClient.AwesomeAssertions (#1427) * WireMock.Net.RestClient.AwesomeAssertions * ok * atpath * fix test * sonar fixes * ports * proxy test * FIX? * --- * await Task.Delay(100, _ct); * ? * --project * Aspire: use IDistributedApplicationEventingSubscriber (#1428) * broadcast * ok * more tsts * . * Collection * up * . * 2 * remove nfluent * <VersionPrefix>2.0.0-preview-02</VersionPrefix> * ... * . * nuget icon * . * <PackageReference Include="JmesPath.Net" Version="1.1.0" /> * x * 500 * . * fix some warnings * ws
73 lines
3.4 KiB
C#
73 lines
3.4 KiB
C#
// Copyright © WireMock.Net
|
|
|
|
using System.Linq;
|
|
using System.Net;
|
|
using System.Net.Http;
|
|
using WireMock.Util;
|
|
|
|
namespace WireMock.Http;
|
|
|
|
internal static class HttpResponseMessageHelper
|
|
{
|
|
public static async Task<ResponseMessage> CreateAsync(
|
|
HttpResponseMessage httpResponseMessage,
|
|
Uri requiredUri,
|
|
Uri originalUri,
|
|
bool deserializeJson,
|
|
bool decompressGzipAndDeflate,
|
|
bool deserializeFormUrlEncoded)
|
|
{
|
|
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().ConfigureAwait(false);
|
|
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;
|
|
}
|
|
|
|
if (httpResponseMessage.StatusCode != HttpStatusCode.NoContent) // A body is not allowed for 204.
|
|
{
|
|
var bodyParserSettings = new BodyParserSettings
|
|
{
|
|
Stream = stream,
|
|
ContentType = contentTypeHeader?.FirstOrDefault(),
|
|
DeserializeJson = deserializeJson,
|
|
ContentEncoding = contentEncodingHeader?.FirstOrDefault(),
|
|
DecompressGZipAndDeflate = decompressGzipAndDeflate,
|
|
DeserializeFormUrlEncoded = deserializeFormUrlEncoded
|
|
};
|
|
responseMessage.BodyData = await BodyParser.ParseAsync(bodyParserSettings).ConfigureAwait(false);
|
|
}
|
|
}
|
|
|
|
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 var 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;
|
|
}
|
|
} |