// Copyright © WireMock.Net using System; using System.Text; using System.Threading.Tasks; using JsonConverter.Abstractions; using Stef.Validation; using WireMock.Models; using WireMock.Types; using WireMock.Util; namespace WireMock.ResponseBuilders; public partial class Response { private bool _bodyFromFileSet; /// public IResponseBuilder WithBody(Func bodyFactory, string? destination = BodyDestinationFormat.SameAsSource, Encoding? encoding = null) { Guard.NotNull(bodyFactory); return WithCallbackInternal(true, req => new ResponseMessage { BodyData = new BodyData { DetectedBodyType = BodyType.String, BodyAsString = bodyFactory(req), Encoding = encoding ?? Encoding.UTF8, IsFuncUsed = "Func" } }); } /// public IResponseBuilder WithBody(Func> bodyFactory, string? destination = BodyDestinationFormat.SameAsSource, Encoding? encoding = null) { Guard.NotNull(bodyFactory); return WithCallbackInternal(true, async req => new ResponseMessage { BodyData = new BodyData { DetectedBodyType = BodyType.String, BodyAsString = await bodyFactory(req).ConfigureAwait(false), Encoding = encoding ?? Encoding.UTF8, IsFuncUsed = "Func>" } }); } /// public IResponseBuilder WithSseBody(Func, Task> bodyFactory, TimeSpan? timeout = null) { Guard.NotNull(bodyFactory); var queue = new BlockingQueue(timeout); return WithCallbackInternal(true, req => new ResponseMessage { BodyData = new BodyData { DetectedBodyType = BodyType.SseString, SseStringQueue = queue, BodyAsSseStringTask = bodyFactory(req, queue), Encoding = Encoding.UTF8, IsFuncUsed = "Func, Task>" } }); } /// public IResponseBuilder WithBody(byte[] body, string? destination = BodyDestinationFormat.SameAsSource, Encoding? encoding = null) { Guard.NotNull(body); ResponseMessage.BodyDestination = destination; ResponseMessage.BodyData = new BodyData(); switch (destination) { case BodyDestinationFormat.String: var enc = encoding ?? Encoding.UTF8; ResponseMessage.BodyData.DetectedBodyType = BodyType.String; ResponseMessage.BodyData.BodyAsString = enc.GetString(body); ResponseMessage.BodyData.Encoding = enc; break; default: ResponseMessage.BodyData.DetectedBodyType = BodyType.Bytes; ResponseMessage.BodyData.BodyAsBytes = body; break; } return this; } /// public IResponseBuilder WithBodyFromFile(string filename, bool cache = true) { Guard.NotNull(filename); _bodyFromFileSet = true; ResponseMessage.BodyData = new BodyData { BodyAsFileIsCached = cache, BodyAsFile = filename }; if (cache && !UseTransformer) { ResponseMessage.BodyData.DetectedBodyType = BodyType.Bytes; } else { ResponseMessage.BodyData.DetectedBodyType = BodyType.File; } return this; } /// public IResponseBuilder WithBody(string body, string? destination = BodyDestinationFormat.SameAsSource, Encoding? encoding = null) { Guard.NotNull(body); encoding ??= Encoding.UTF8; ResponseMessage.BodyDestination = destination; ResponseMessage.BodyData = new BodyData { Encoding = encoding }; switch (destination) { case BodyDestinationFormat.Bytes: ResponseMessage.BodyData.DetectedBodyType = BodyType.Bytes; ResponseMessage.BodyData.BodyAsBytes = encoding.GetBytes(body); break; case BodyDestinationFormat.Json: ResponseMessage.BodyData.DetectedBodyType = BodyType.Json; ResponseMessage.BodyData.BodyAsJson = JsonUtils.DeserializeObject(body); break; default: ResponseMessage.BodyData.DetectedBodyType = BodyType.String; ResponseMessage.BodyData.BodyAsString = body; break; } return this; } /// public IResponseBuilder WithBodyAsJson(object body, Encoding? encoding = null, bool? indented = null) { Guard.NotNull(body); ResponseMessage.BodyDestination = null; ResponseMessage.BodyData = new BodyData { Encoding = encoding, DetectedBodyType = BodyType.Json, BodyAsJson = body, BodyAsJsonIndented = indented }; return this; } /// public IResponseBuilder WithBodyAsJson(object body, bool indented) { return WithBodyAsJson(body, null, indented); } /// public IResponseBuilder WithBodyAsJson(Func bodyFactory, Encoding? encoding = null) { Guard.NotNull(bodyFactory); return WithCallbackInternal(true, req => new ResponseMessage { BodyData = new BodyData { Encoding = encoding ?? Encoding.UTF8, DetectedBodyType = BodyType.Json, BodyAsJson = bodyFactory(req), IsFuncUsed = "Func" } }); } /// public IResponseBuilder WithBodyAsJson(Func> bodyFactory, Encoding? encoding = null) { Guard.NotNull(bodyFactory); return WithCallbackInternal(true, async req => new ResponseMessage { BodyData = new BodyData { Encoding = encoding ?? Encoding.UTF8, DetectedBodyType = BodyType.Json, BodyAsJson = await bodyFactory(req).ConfigureAwait(false), IsFuncUsed = "Func>" } }); } /// public IResponseBuilder WithBody(object body, IJsonConverter jsonConverter, JsonConverterOptions? options = null) { return WithBody(body, null, jsonConverter, options); } /// public IResponseBuilder WithBody(object body, Encoding? encoding, IJsonConverter jsonConverter, JsonConverterOptions? options = null) { Guard.NotNull(body); Guard.NotNull(jsonConverter); ResponseMessage.BodyDestination = null; ResponseMessage.BodyData = new BodyData { Encoding = encoding, DetectedBodyType = BodyType.String, BodyAsString = jsonConverter.Serialize(body, options) }; return this; } }