mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-01-18 17:37:01 +01:00
* Add support for client certificate password and test with some real services that require client certificates. Also update so when proxying, the path and query will be passed to the proxied api. * Add correct param * Update to read certificate from store instead of file * Add support for client certificate password and test with some real services that require client certificates. Also update so when proxying, the path and query will be passed to the proxied api. * Add correct param * Fixup PR issues * Add support for client certificate password and test with some real services that require client certificates. Also update so when proxying, the path and query will be passed to the proxied api. * Add correct param * Fixup PR issues
97 lines
3.7 KiB
C#
97 lines
3.7 KiB
C#
using System;
|
|
using System.Linq;
|
|
using System.Net;
|
|
using System.Net.Http;
|
|
using System.Security.Authentication;
|
|
using System.Security.Cryptography.X509Certificates;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace WireMock.Http
|
|
{
|
|
internal static class HttpClientHelper
|
|
{
|
|
|
|
private static HttpClient CreateHttpClient(string clientX509Certificate2ThumbprintOrSubjectName = null)
|
|
{
|
|
if (!string.IsNullOrEmpty(clientX509Certificate2ThumbprintOrSubjectName))
|
|
{
|
|
#if NETSTANDARD || NET46
|
|
var handler = new HttpClientHandler
|
|
{
|
|
ClientCertificateOptions = ClientCertificateOption.Manual,
|
|
SslProtocols = System.Security.Authentication.SslProtocols.Tls12 | System.Security.Authentication.SslProtocols.Tls11 | System.Security.Authentication.SslProtocols.Tls,
|
|
ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true
|
|
};
|
|
|
|
var x509Certificate2 = CertificateUtil.GetCertificate(clientX509Certificate2ThumbprintOrSubjectName);
|
|
handler.ClientCertificates.Add(x509Certificate2);
|
|
|
|
|
|
#else
|
|
var handler = new WebRequestHandler
|
|
{
|
|
ClientCertificateOptions = ClientCertificateOption.Manual,
|
|
ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true,
|
|
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
|
|
};
|
|
|
|
var x509Certificate2 = CertificateUtil.GetCertificate(clientX509Certificate2ThumbprintOrSubjectName);
|
|
handler.ClientCertificates.Add(x509Certificate2);
|
|
return new HttpClient(handler);
|
|
#endif
|
|
}
|
|
|
|
return new HttpClient();
|
|
}
|
|
|
|
public static async Task<ResponseMessage> SendAsync(RequestMessage requestMessage, string url, string clientX509Certificate2ThumbprintOrSubjectName = null)
|
|
{
|
|
var client = CreateHttpClient(clientX509Certificate2ThumbprintOrSubjectName);
|
|
|
|
var httpRequestMessage = new HttpRequestMessage(new HttpMethod(requestMessage.Method), url);
|
|
|
|
// Overwrite the host header
|
|
httpRequestMessage.Headers.Host = new Uri(url).Authority;
|
|
|
|
// Set headers if present
|
|
if (requestMessage.Headers != null)
|
|
{
|
|
foreach (var headerName in requestMessage.Headers.Keys.Where(k => k.ToUpper() != "HOST"))
|
|
{
|
|
httpRequestMessage.Headers.Add(headerName, new[] { requestMessage.Headers[headerName] });
|
|
}
|
|
}
|
|
|
|
// Set Body if present
|
|
if (requestMessage.BodyAsBytes != null && requestMessage.BodyAsBytes.Length > 0)
|
|
{
|
|
httpRequestMessage.Content = new ByteArrayContent(requestMessage.BodyAsBytes);
|
|
}
|
|
|
|
// Call the URL
|
|
try
|
|
{
|
|
var httpResponseMessage = await client.SendAsync(httpRequestMessage, HttpCompletionOption.ResponseContentRead);
|
|
|
|
|
|
// Transform response
|
|
var responseMessage = new ResponseMessage
|
|
{
|
|
StatusCode = (int)httpResponseMessage.StatusCode,
|
|
Body = await httpResponseMessage.Content.ReadAsStringAsync()
|
|
};
|
|
|
|
foreach (var header in httpResponseMessage.Headers)
|
|
{
|
|
responseMessage.AddHeader(header.Key, header.Value.FirstOrDefault());
|
|
}
|
|
|
|
return responseMessage;
|
|
}
|
|
catch(Exception ex)
|
|
{
|
|
throw ex;
|
|
}
|
|
}
|
|
}
|
|
} |