private static HttpClient CreateHttpClient() { var handler = new ConformanceApiHttpHandler( service: new ConformanceApiService(s_tests), settings: new ServiceHttpHandlerSettings()) { InnerHandler = new NotFoundHttpHandler() }; return(new HttpClient(handler) { BaseAddress = new Uri("http://example.com/") }); }
private static HttpClient CreateHttpClient() { IConformanceApi getApiForRequest(HttpRequestMessage httpRequest) { string testName = httpRequest.Headers.TryGetValues(FacilityTestClientAspect.HeaderName, out var values) ? string.Join(",", values) : null; return(new ConformanceApiService(s_testProvider.TryGetTestInfo(testName))); } var handler = new ConformanceApiHttpHandler(getApiForRequest, new ServiceHttpHandlerSettings()) { InnerHandler = new NotFoundHttpHandler() }; return(new HttpClient(handler) { BaseAddress = new Uri("http://example.com/") }); }
public ConformanceTests(ServiceSerializer serializer) : base(serializer) { m_tests = CreateTestProvider(JsonSerializer); m_contentSerializer = HttpContentSerializer.Create(Serializer); var service = new ConformanceApiService(new ConformanceApiServiceSettings { Tests = m_tests, JsonSerializer = JsonSerializer }); var settings = new ServiceHttpHandlerSettings { ContentSerializer = m_contentSerializer }; var handler = new ConformanceApiHttpHandler(service, settings) { InnerHandler = new NotFoundHttpHandler() }; m_httpClient = new HttpClient(handler) { BaseAddress = new Uri("http://example.com/") }; }
private static HttpClientConformanceApi CreateHttpApi(bool skipClientValidation = false, bool skipServerValidation = false, RequiredResponseDto?requiredResponse = null) { var service = new FakeConformanceApiService(requiredResponse: requiredResponse); var settings = new ServiceHttpHandlerSettings { SkipRequestValidation = skipServerValidation, SkipResponseValidation = skipServerValidation, }; var handler = new ConformanceApiHttpHandler(service, settings) { InnerHandler = new NotFoundHttpHandler() }; var httpClient = new HttpClient(handler) { BaseAddress = new Uri("http://example.com/") }; return(new HttpClientConformanceApi(new HttpClientServiceSettings { HttpClient = httpClient, SkipRequestValidation = skipClientValidation, SkipResponseValidation = skipClientValidation, })); }
private async Task HostAsync(HttpContext httpContext) { var httpRequest = httpContext.Request; var requestUrl = httpRequest.GetEncodedUrl(); var apiHandler = new ConformanceApiHttpHandler(new ConformanceApiService(m_tests)); var requestMessage = new HttpRequestMessage(new HttpMethod(httpRequest.Method), requestUrl) { Content = new StreamContent(httpRequest.Body), }; foreach (var header in httpRequest.Headers) { // Every header should be able to fit into one of the two header collections. // Try message.Headers first since that accepts more of them. if (!requestMessage.Headers.TryAddWithoutValidation(header.Key, header.Value.AsEnumerable())) { requestMessage.Content.Headers.TryAddWithoutValidation(header.Key, header.Value.AsEnumerable()); } } HttpResponseMessage?responseMessage = null; ServiceErrorDto? error = null; try { responseMessage = await apiHandler.TryHandleHttpRequestAsync(requestMessage, httpContext.RequestAborted).ConfigureAwait(false); if (responseMessage == null) { error = ServiceErrors.CreateInvalidRequest($"Test not found for {httpRequest.Method} {requestUrl}"); } } catch (Exception exception) { error = ServiceErrorUtility.CreateInternalErrorForException(exception); } if (error != null) { var statusCode = HttpServiceErrors.TryGetHttpStatusCode(error.Code) ?? HttpStatusCode.InternalServerError; responseMessage = new HttpResponseMessage(statusCode) { Content = JsonHttpContentSerializer.Instance.CreateHttpContent(error) }; } if (responseMessage != null) { using (responseMessage) { var response = httpContext.Response; response.StatusCode = (int)responseMessage.StatusCode; var responseHeaders = responseMessage.Headers; // Ignore the Transfer-Encoding header if it is just "chunked". // We let the host decide about whether the response should be chunked or not. if (responseHeaders.TransferEncodingChunked == true && responseHeaders.TransferEncoding.Count == 1) { responseHeaders.TransferEncoding.Clear(); } foreach (var header in responseHeaders) { response.Headers.Append(header.Key, header.Value.ToArray()); } // ReSharper disable once ConditionIsAlwaysTrueOrFalse if (responseMessage.Content != null) { var contentHeaders = responseMessage.Content.Headers; // Copy the response content headers only after ensuring they are complete. // We ask for Content-Length first because HttpContent lazily computes this // and only afterwards writes the value into the content headers. _ = contentHeaders.ContentLength; foreach (var header in contentHeaders) { response.Headers.Append(header.Key, header.Value.ToArray()); } await responseMessage.Content.CopyToAsync(response.Body).ConfigureAwait(false); } } } }