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 { /// /// The Response. /// public class Response : IResponseBuilder { private TimeSpan _delay = TimeSpan.Zero; private bool _useTransformer; /// /// Gets the response message. /// /// /// The response message. /// public ResponseMessage ResponseMessage { get; } /// /// Creates this instance. /// /// ResponseMessage /// A . [PublicAPI] public static IResponseBuilder Create([CanBeNull] ResponseMessage responseMessage = null) { var message = responseMessage ?? new ResponseMessage { StatusCode = (int)HttpStatusCode.OK }; return new Response(message); } /// /// Creates this instance. /// /// A . [PublicAPI] public static IResponseBuilder Create([NotNull] Func func) { Check.NotNull(func, nameof(func)); return new Response(func()); } /// /// Initializes a new instance of the class. /// /// /// The response. /// private Response(ResponseMessage responseMessage) { ResponseMessage = responseMessage; } /// /// The with status code. /// /// The code. /// A .\ [PublicAPI] public IHeadersResponseBuilder WithStatusCode(int code) { ResponseMessage.StatusCode = code; return this; } /// /// The with status code. /// /// The code. /// A . [PublicAPI] public IHeadersResponseBuilder WithStatusCode(HttpStatusCode code) { return WithStatusCode((int)code); } /// /// The with Success status code (200). /// /// [PublicAPI] public IHeadersResponseBuilder WithSuccess() { return WithStatusCode((int)HttpStatusCode.OK); } /// /// The with NotFound status code (404). /// /// The . [PublicAPI] public IHeadersResponseBuilder WithNotFound() { return WithStatusCode((int)HttpStatusCode.NotFound); } /// /// The with header. /// /// The name. /// The value. /// The . public IHeadersResponseBuilder WithHeader(string name, string value) { Check.NotNull(name, nameof(name)); ResponseMessage.AddHeader(name, value); return this; } /// /// The with body. /// /// The body. /// A . public ITransformResponseBuilder WithBody(string body) { Check.NotNull(body, nameof(body)); ResponseMessage.Body = body; return this; } /// /// The with body as base64. /// /// The body asbase64. /// The Encoding. /// A . public ITransformResponseBuilder WithBodyAsBase64(string bodyAsbase64, Encoding encoding = null) { Check.NotNull(bodyAsbase64, nameof(bodyAsbase64)); ResponseMessage.Body = (encoding ?? Encoding.UTF8).GetString(Convert.FromBase64String(bodyAsbase64)); return this; } /// /// The with transformer. /// /// /// The . /// public IDelayResponseBuilder WithTransformer() { _useTransformer = true; return this; } /// /// The after delay. /// /// /// The delay. /// /// /// The . /// public IResponseBuilder WithDelay(TimeSpan delay) { _delay = delay; return this; } /// /// The provide response. /// /// /// The request. /// /// /// The . /// public async Task 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(); 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; } } }