Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WebHook - Transform Url #824

Merged
merged 4 commits into from
Oct 15, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions examples/WireMock.Net.Client/Properties/launchSettings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"profiles": {
"WSL": {
"commandName": "WSL2",
"distributionName": ""
}
}
}
14 changes: 9 additions & 5 deletions src/WireMock.Net/Http/WebhookSender.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,37 +44,41 @@ IResponseMessage originalResponseMessage

IBodyData? bodyData;
IDictionary<string, WireMockList<string>>? headers;
string webhookRequestUrl;
if (webhookRequest.UseTransformer == true)
{
ITransformer responseMessageTransformer;
ITransformer transformer;
switch (webhookRequest.TransformerType)
{
case TransformerType.Handlebars:
var factoryHandlebars = new HandlebarsContextFactory(_settings.FileSystemHandler, _settings.HandlebarsRegistrationCallback);
responseMessageTransformer = new Transformer(factoryHandlebars);
transformer = new Transformer(factoryHandlebars);
break;

case TransformerType.Scriban:
case TransformerType.ScribanDotLiquid:
var factoryDotLiquid = new ScribanContextFactory(_settings.FileSystemHandler, webhookRequest.TransformerType);
responseMessageTransformer = new Transformer(factoryDotLiquid);
transformer = new Transformer(factoryDotLiquid);
break;

default:
throw new NotImplementedException($"TransformerType '{webhookRequest.TransformerType}' is not supported.");
}

(bodyData, headers) = responseMessageTransformer.Transform(mapping, originalRequestMessage, originalResponseMessage, webhookRequest.BodyData, webhookRequest.Headers, webhookRequest.TransformerReplaceNodeOptions);
bodyData = transformer.TransformBody(mapping, originalRequestMessage, originalResponseMessage, webhookRequest.BodyData, webhookRequest.TransformerReplaceNodeOptions);
headers = transformer.TransformHeaders(mapping, originalRequestMessage, originalResponseMessage, webhookRequest.Headers);
webhookRequestUrl = transformer.TransformString(mapping, originalRequestMessage, originalResponseMessage, webhookRequest.Url);
}
else
{
bodyData = webhookRequest.BodyData;
headers = webhookRequest.Headers;
webhookRequestUrl = webhookRequest.Url;
}

// Create RequestMessage
var requestMessage = new RequestMessage(
new UrlDetails(webhookRequest.Url),
new UrlDetails(webhookRequestUrl),
webhookRequest.Method,
ClientIp,
bodyData,
Expand Down
6 changes: 5 additions & 1 deletion src/WireMock.Net/Transformers/ITransformer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,9 @@ interface ITransformer
{
ResponseMessage Transform(IMapping mapping, IRequestMessage requestMessage, IResponseMessage original, bool useTransformerForBodyAsFile, ReplaceNodeOptions options);

(IBodyData? BodyData, IDictionary<string, WireMockList<string>>? Headers) Transform(IMapping mapping, IRequestMessage originalRequestMessage, IResponseMessage originalResponseMessage, IBodyData? bodyData, IDictionary<string, WireMockList<string>>? headers, ReplaceNodeOptions options);
IBodyData? TransformBody(IMapping mapping, IRequestMessage originalRequestMessage, IResponseMessage originalResponseMessage, IBodyData? bodyData, ReplaceNodeOptions options);

IDictionary<string, WireMockList<string>>? TransformHeaders(IMapping mapping, IRequestMessage originalRequestMessage, IResponseMessage originalResponseMessage, IDictionary<string, WireMockList<string>>? headers);

string TransformString(IMapping mapping, IRequestMessage originalRequestMessage, IResponseMessage originalResponseMessage, string? value);
}
13 changes: 13 additions & 0 deletions src/WireMock.Net/Transformers/TransformModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using System.Diagnostics.CodeAnalysis;

namespace WireMock.Transformers;

[SuppressMessage("ReSharper", "InconsistentNaming")]
internal struct TransformModel
{
public IMapping mapping { get; set; }

public IRequestMessage request { get; set; }

public IResponseMessage? response { get; set; }
}
70 changes: 47 additions & 23 deletions src/WireMock.Net/Transformers/Transformer.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Stef.Validation;
using System;
using System.Collections.Generic;
using System.Linq;
using WireMock.Types;
using WireMock.Util;

Expand All @@ -18,43 +18,57 @@ public Transformer(ITransformerContextFactory factory)
_factory = Guard.NotNull(factory);
}

public (IBodyData? BodyData, IDictionary<string, WireMockList<string>>? Headers) Transform(
public IBodyData? TransformBody(
IMapping mapping,
IRequestMessage originalRequestMessage,
IResponseMessage originalResponseMessage,
IBodyData? bodyData,
IDictionary<string, WireMockList<string>>? headers,
ReplaceNodeOptions options)
{
var transformerContext = _factory.Create();

var model = new
{
mapping,
request = originalRequestMessage,
response = originalResponseMessage
};
var (transformerContext, model) = Create(mapping, originalRequestMessage, originalResponseMessage);

IBodyData? newBodyData = null;
if (bodyData?.DetectedBodyType != null)
{
newBodyData = TransformBodyData(transformerContext, options, model, bodyData, false);
}

return (newBodyData, TransformHeaders(transformerContext, model, headers));
return newBodyData;
}

public ResponseMessage Transform(IMapping mapping, IRequestMessage requestMessage, IResponseMessage original, bool useTransformerForBodyAsFile, ReplaceNodeOptions options)
public IDictionary<string, WireMockList<string>>? TransformHeaders(
IMapping mapping,
IRequestMessage originalRequestMessage,
IResponseMessage originalResponseMessage,
IDictionary<string, WireMockList<string>>? headers
)
{
var transformerContext = _factory.Create();
var (transformerContext, model) = Create(mapping, originalRequestMessage, originalResponseMessage);

var responseMessage = new ResponseMessage();
return TransformHeaders(transformerContext, model, headers);
}

var model = new
public string TransformString(
IMapping mapping,
IRequestMessage originalRequestMessage,
IResponseMessage originalResponseMessage,
string? value
)
{
if (value is null)
{
mapping,
request = requestMessage
};
return string.Empty;
}

var (transformerContext, model) = Create(mapping, originalRequestMessage, originalResponseMessage);
return transformerContext.ParseAndRender(value, model);
}

public ResponseMessage Transform(IMapping mapping, IRequestMessage requestMessage, IResponseMessage original, bool useTransformerForBodyAsFile, ReplaceNodeOptions options)
{
var responseMessage = new ResponseMessage();

var (transformerContext, model) = Create(mapping, requestMessage, null);

if (original.BodyData?.DetectedBodyType != null)
{
Expand Down Expand Up @@ -85,7 +99,17 @@ public ResponseMessage Transform(IMapping mapping, IRequestMessage requestMessag
return responseMessage;
}

private static IBodyData? TransformBodyData(ITransformerContext transformerContext, ReplaceNodeOptions options, object model, IBodyData original, bool useTransformerForBodyAsFile)
private (ITransformerContext TransformerContext, TransformModel Model) Create(IMapping mapping, IRequestMessage request, IResponseMessage? response)
{
return (_factory.Create(), new TransformModel
{
mapping = mapping,
request = request,
response = response
});
}

private static IBodyData? TransformBodyData(ITransformerContext transformerContext, ReplaceNodeOptions options, TransformModel model, IBodyData original, bool useTransformerForBodyAsFile)
{
return original.DetectedBodyType switch
{
Expand All @@ -96,7 +120,7 @@ public ResponseMessage Transform(IMapping mapping, IRequestMessage requestMessag
};
}

private static IDictionary<string, WireMockList<string>> TransformHeaders(ITransformerContext transformerContext, object model, IDictionary<string, WireMockList<string>>? original)
private static IDictionary<string, WireMockList<string>> TransformHeaders(ITransformerContext transformerContext, TransformModel model, IDictionary<string, WireMockList<string>>? original)
{
if (original == null)
{
Expand Down
Loading