示例#1
0
        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);
        }
示例#2
0
 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;
        }
示例#4
0
        /// <inheritdoc cref="IProxyResponseBuilder.WithProxy(IProxyAndRecordSettings)"/>
        public IResponseBuilder WithProxy(IProxyAndRecordSettings settings)
        {
            Check.NotNull(settings, nameof(settings));

            ProxyAndRecordSettings = settings;

            _httpClientForProxy = HttpClientBuilder.Build(settings);
            return(this);
        }
示例#5
0
        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);
        }
示例#6
0
        /// <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);
        }
示例#7
0
        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));
 }
示例#10
0
        /// <inheritdoc cref="IProxyResponseBuilder.WithProxy(IProxyAndRecordSettings)"/>
        public IResponseBuilder WithProxy(IProxyAndRecordSettings settings)
        {
            Check.NotNull(settings, nameof(settings));

            return(WithProxy(settings.Url, settings.ClientX509Certificate2ThumbprintOrSubjectName));
        }