mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-03-18 07:13:46 +01:00
217 lines
6.7 KiB
C#
217 lines
6.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Net;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using HandlebarsDotNet;
|
|
using JetBrains.Annotations;
|
|
using WireMock.Validation;
|
|
|
|
namespace WireMock.ResponseBuilders
|
|
{
|
|
/// <summary>
|
|
/// The Response.
|
|
/// </summary>
|
|
public class Response : IResponseBuilder
|
|
{
|
|
private TimeSpan _delay = TimeSpan.Zero;
|
|
private bool _useTransformer;
|
|
|
|
/// <summary>
|
|
/// Gets the response message.
|
|
/// </summary>
|
|
/// <value>
|
|
/// The response message.
|
|
/// </value>
|
|
public ResponseMessage ResponseMessage { get; }
|
|
|
|
/// <summary>
|
|
/// Creates this instance.
|
|
/// </summary>
|
|
/// <param name="responseMessage">ResponseMessage</param>
|
|
/// <returns>A <see cref="IResponseBuilder"/>.</returns>
|
|
[PublicAPI]
|
|
public static IResponseBuilder Create([CanBeNull] ResponseMessage responseMessage = null)
|
|
{
|
|
var message = responseMessage ?? new ResponseMessage { StatusCode = (int)HttpStatusCode.OK };
|
|
return new Response(message);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates this instance.
|
|
/// </summary>
|
|
/// <returns>A <see cref="IResponseBuilder"/>.</returns>
|
|
[PublicAPI]
|
|
public static IResponseBuilder Create([NotNull] Func<ResponseMessage> func)
|
|
{
|
|
Check.NotNull(func, nameof(func));
|
|
|
|
return new Response(func());
|
|
}
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="Response"/> class.
|
|
/// </summary>
|
|
/// <param name="responseMessage">
|
|
/// The response.
|
|
/// </param>
|
|
private Response(ResponseMessage responseMessage)
|
|
{
|
|
ResponseMessage = responseMessage;
|
|
}
|
|
|
|
/// <summary>
|
|
/// The with status code.
|
|
/// </summary>
|
|
/// <param name="code">The code.</param>
|
|
/// <returns>A <see cref="IHeadersResponseBuilder"/>.</returns>\
|
|
[PublicAPI]
|
|
public IHeadersResponseBuilder WithStatusCode(int code)
|
|
{
|
|
ResponseMessage.StatusCode = code;
|
|
return this;
|
|
}
|
|
|
|
/// <summary>
|
|
/// The with status code.
|
|
/// </summary>
|
|
/// <param name="code">The code.</param>
|
|
/// <returns>A <see cref="IHeadersResponseBuilder"/>.</returns>
|
|
[PublicAPI]
|
|
public IHeadersResponseBuilder WithStatusCode(HttpStatusCode code)
|
|
{
|
|
return WithStatusCode((int)code);
|
|
}
|
|
|
|
/// <summary>
|
|
/// The with Success status code (200).
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[PublicAPI]
|
|
public IHeadersResponseBuilder WithSuccess()
|
|
{
|
|
return WithStatusCode((int)HttpStatusCode.OK);
|
|
}
|
|
|
|
/// <summary>
|
|
/// The with NotFound status code (404).
|
|
/// </summary>
|
|
/// <returns>The <see cref="IResponseBuilder"/>.</returns>
|
|
[PublicAPI]
|
|
public IHeadersResponseBuilder WithNotFound()
|
|
{
|
|
return WithStatusCode((int)HttpStatusCode.NotFound);
|
|
}
|
|
|
|
/// <summary>
|
|
/// The with header.
|
|
/// </summary>
|
|
/// <param name="name">The name.</param>
|
|
/// <param name="value">The value.</param>
|
|
/// <returns>The <see cref="IHeadersResponseBuilder"/>.</returns>
|
|
public IHeadersResponseBuilder WithHeader(string name, string value)
|
|
{
|
|
Check.NotNull(name, nameof(name));
|
|
|
|
ResponseMessage.AddHeader(name, value);
|
|
return this;
|
|
}
|
|
|
|
/// <summary>
|
|
/// The with body.
|
|
/// </summary>
|
|
/// <param name="body">The body.</param>
|
|
/// <returns>A <see cref="ITransformResponseBuilder"/>.</returns>
|
|
public ITransformResponseBuilder WithBody(string body)
|
|
{
|
|
Check.NotNull(body, nameof(body));
|
|
|
|
ResponseMessage.Body = body;
|
|
return this;
|
|
}
|
|
|
|
/// <summary>
|
|
/// The with body as base64.
|
|
/// </summary>
|
|
/// <param name="bodyAsbase64">The body asbase64.</param>
|
|
/// <param name="encoding">The Encoding.</param>
|
|
/// <returns>A <see cref="ITransformResponseBuilder"/>.</returns>
|
|
public ITransformResponseBuilder WithBodyAsBase64(string bodyAsbase64, Encoding encoding = null)
|
|
{
|
|
Check.NotNull(bodyAsbase64, nameof(bodyAsbase64));
|
|
|
|
ResponseMessage.Body = (encoding ?? Encoding.UTF8).GetString(Convert.FromBase64String(bodyAsbase64));
|
|
return this;
|
|
}
|
|
|
|
/// <summary>
|
|
/// The with transformer.
|
|
/// </summary>
|
|
/// <returns>
|
|
/// The <see cref="IResponseBuilder"/>.
|
|
/// </returns>
|
|
public IDelayResponseBuilder WithTransformer()
|
|
{
|
|
_useTransformer = true;
|
|
return this;
|
|
}
|
|
|
|
/// <summary>
|
|
/// The after delay.
|
|
/// </summary>
|
|
/// <param name="delay">
|
|
/// The delay.
|
|
/// </param>
|
|
/// <returns>
|
|
/// The <see cref="IResponseProvider"/>.
|
|
/// </returns>
|
|
public IResponseBuilder WithDelay(TimeSpan delay)
|
|
{
|
|
_delay = delay;
|
|
return this;
|
|
}
|
|
|
|
/// <summary>
|
|
/// The provide response.
|
|
/// </summary>
|
|
/// <param name="requestMessage">
|
|
/// The request.
|
|
/// </param>
|
|
/// <returns>
|
|
/// The <see cref="Task"/>.
|
|
/// </returns>
|
|
public async Task<ResponseMessage> ProvideResponse(RequestMessage requestMessage)
|
|
{
|
|
ResponseMessage responseMessage;
|
|
if (_useTransformer)
|
|
{
|
|
responseMessage = new ResponseMessage { StatusCode = ResponseMessage.StatusCode };
|
|
|
|
var template = new { request = requestMessage };
|
|
|
|
// Body
|
|
var templateBody = Handlebars.Compile(ResponseMessage.Body);
|
|
responseMessage.Body = templateBody(template);
|
|
|
|
// Headers
|
|
var newHeaders = new Dictionary<string, string>();
|
|
foreach (var header in ResponseMessage.Headers)
|
|
{
|
|
var templateHeaderKey = Handlebars.Compile(header.Key);
|
|
var templateHeaderValue = Handlebars.Compile(header.Value);
|
|
|
|
newHeaders.Add(templateHeaderKey(template), templateHeaderValue(template));
|
|
}
|
|
responseMessage.Headers = newHeaders;
|
|
}
|
|
else
|
|
{
|
|
responseMessage = ResponseMessage;
|
|
}
|
|
|
|
await Task.Delay(_delay);
|
|
|
|
return responseMessage;
|
|
}
|
|
}
|
|
} |