public async Task <(ResponseMessage ResponseMessage, IMapping Mapping)> SendAsync( [NotNull] IProxyAndRecordSettings proxyAndRecordSettings, [NotNull] HttpClient client, [NotNull] RequestMessage requestMessage, [NotNull] string url) { Check.NotNull(client, nameof(client)); Check.NotNull(requestMessage, nameof(requestMessage)); Check.NotNull(url, nameof(url)); var originalUri = new Uri(requestMessage.Url); var requiredUri = new Uri(url); // Create HttpRequestMessage var httpRequestMessage = HttpRequestMessageHelper.Create(requestMessage, url); // Call the URL var httpResponseMessage = await client.SendAsync(httpRequestMessage, HttpCompletionOption.ResponseContentRead); // Create ResponseMessage bool deserializeJson = !_settings.DisableJsonBodyParsing.GetValueOrDefault(false); bool decompressGzipAndDeflate = !_settings.DisableRequestBodyDecompressing.GetValueOrDefault(false); var responseMessage = await HttpResponseMessageHelper.CreateAsync(httpResponseMessage, requiredUri, originalUri, deserializeJson, decompressGzipAndDeflate); IMapping mapping = null; if (HttpStatusRangeParser.IsMatch(proxyAndRecordSettings.SaveMappingForStatusCodePattern, responseMessage.StatusCode) && (proxyAndRecordSettings.SaveMapping || proxyAndRecordSettings.SaveMappingToFile)) { mapping = ToMapping(proxyAndRecordSettings, requestMessage, responseMessage); } return(responseMessage, mapping); }
public WireMockService(ILogger logger, IWireMockServerSettings settings, IProxyAndRecordSettings proxyAndRecordSettings) { this.logger = logger; this.settings = settings; this.settings.ProxyAndRecordSettings = proxyAndRecordSettings; this.settings.Logger = new Logger(logger); }
public ProxyAsyncResponseProvider([NotNull] Func <RequestMessage, IProxyAndRecordSettings, Task <ResponseMessage> > responseMessageFunc, [NotNull] IProxyAndRecordSettings settings) { Check.NotNull(responseMessageFunc, nameof(responseMessageFunc)); Check.NotNull(settings, nameof(settings)); _responseMessageFunc = responseMessageFunc; _settings = settings; }
/// <inheritdoc cref="IProxyResponseBuilder.WithProxy(IProxyAndRecordSettings)"/> public IResponseBuilder WithProxy(IProxyAndRecordSettings settings) { Check.NotNull(settings, nameof(settings)); ProxyAndRecordSettings = settings; _httpClientForProxy = HttpClientBuilder.Build(settings); return(this); }
public static HttpClient CreateHttpClient(IProxyAndRecordSettings settings) { #if NETSTANDARD || NETCOREAPP3_1 || NET5_0 var handler = new HttpClientHandler { CheckCertificateRevocationList = false, SslProtocols = System.Security.Authentication.SslProtocols.Tls12 | System.Security.Authentication.SslProtocols.Tls11 | System.Security.Authentication.SslProtocols.Tls, ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true, AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }; #elif NET46 var handler = new HttpClientHandler { ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true, AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }; ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11; #else var handler = new WebRequestHandler { ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true, AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }; ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11; #endif if (!string.IsNullOrEmpty(settings.ClientX509Certificate2ThumbprintOrSubjectName)) { handler.ClientCertificateOptions = ClientCertificateOption.Manual; var x509Certificate2 = CertificateLoader.LoadCertificate(settings.ClientX509Certificate2ThumbprintOrSubjectName); handler.ClientCertificates.Add(x509Certificate2); } handler.AllowAutoRedirect = settings.AllowAutoRedirect == true; // If UseCookies enabled, httpClient ignores Cookie header handler.UseCookies = false; if (settings.WebProxySettings != null) { handler.UseProxy = true; handler.Proxy = new WebProxy(settings.WebProxySettings.Address); if (settings.WebProxySettings.UserName != null && settings.WebProxySettings.Password != null) { handler.Proxy.Credentials = new NetworkCredential(settings.WebProxySettings.UserName, settings.WebProxySettings.Password); } } var client = new HttpClient(handler); #if NET452 || NET46 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; #endif return(client); }
/// <inheritdoc cref="IProxyResponseBuilder.WithProxy(IProxyAndRecordSettings)"/> public IResponseBuilder WithProxy(IProxyAndRecordSettings settings) { Check.NotNull(settings, nameof(settings)); ProxyUrl = settings.Url; WebProxySettings = settings.WebProxySettings; _httpClientForProxy = HttpClientHelper.CreateHttpClient(settings); return(this); }
private IMapping ToMapping(IProxyAndRecordSettings proxyAndRecordSettings, RequestMessage requestMessage, ResponseMessage responseMessage) { string[] excludedHeaders = proxyAndRecordSettings.ExcludedHeaders ?? new string[] { }; string[] excludedCookies = proxyAndRecordSettings.ExcludedCookies ?? new string[] { }; var request = Request.Create(); request.WithPath(requestMessage.Path); request.UsingMethod(requestMessage.Method); requestMessage.Query.Loop((key, value) => request.WithParam(key, false, value.ToArray())); requestMessage.Cookies.Loop((key, value) => { if (!excludedCookies.Contains(key, StringComparer.OrdinalIgnoreCase)) { request.WithCookie(key, value); } }); var allExcludedHeaders = new List <string>(excludedHeaders) { "Cookie" }; requestMessage.Headers.Loop((key, value) => { if (!allExcludedHeaders.Contains(key, StringComparer.OrdinalIgnoreCase)) { request.WithHeader(key, value.ToArray()); } }); bool throwExceptionWhenMatcherFails = _settings.ThrowExceptionWhenMatcherFails == true; switch (requestMessage.BodyData?.DetectedBodyType) { case BodyType.Json: request.WithBody(new JsonMatcher(MatchBehaviour.AcceptOnMatch, requestMessage.BodyData.BodyAsJson, true, throwExceptionWhenMatcherFails)); break; case BodyType.String: request.WithBody(new ExactMatcher(MatchBehaviour.AcceptOnMatch, throwExceptionWhenMatcherFails, requestMessage.BodyData.BodyAsString)); break; case BodyType.Bytes: request.WithBody(new ExactObjectMatcher(MatchBehaviour.AcceptOnMatch, requestMessage.BodyData.BodyAsBytes, throwExceptionWhenMatcherFails)); break; } var response = Response.Create(responseMessage); return(new Mapping(Guid.NewGuid(), string.Empty, null, _settings, request, response, 0, null, null, null, null)); }
private async Task <ResponseMessage> ProxyAndRecordAsync(RequestMessage requestMessage, IProxyAndRecordSettings settings) { var requestUri = new Uri(requestMessage.Url); var proxyUri = new Uri(settings.Url); var proxyUriWithRequestPathAndQuery = new Uri(proxyUri, requestUri.PathAndQuery); var responseMessage = await HttpClientHelper.SendAsync(_httpClientForProxy, requestMessage, proxyUriWithRequestPathAndQuery.AbsoluteUri); if (settings.SaveMapping) { var mapping = ToMapping(requestMessage, responseMessage, settings.BlackListedHeaders ?? new string[] { }); _options.Mappings.TryAdd(mapping.Guid, mapping); if (settings.SaveMappingToFile) { SaveMappingToFile(mapping); } } return(responseMessage); }
private void InitProxyAndRecord(IProxyAndRecordSettings settings) { _httpClientForProxy = HttpClientHelper.CreateHttpClient(settings.ClientX509Certificate2ThumbprintOrSubjectName); Given(Request.Create().WithPath("/*").UsingAnyMethod()).RespondWith(new ProxyAsyncResponseProvider(ProxyAndRecordAsync, settings)); }
/// <inheritdoc cref="IProxyResponseBuilder.WithProxy(IProxyAndRecordSettings)"/> public IResponseBuilder WithProxy(IProxyAndRecordSettings settings) { Check.NotNull(settings, nameof(settings)); return(WithProxy(settings.Url, settings.ClientX509Certificate2ThumbprintOrSubjectName)); }