mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-04-23 08:48:28 +02:00
Create WireMock.Net.ProtoBuf project (#1350)
* Create WireMock.Net.ProtoBuf project * ok * Update Directory.Build.props Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -50,15 +50,12 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<!-- CVE-2019-0820 -->
|
<PackageReference Include="JetBrains.Annotations" Version="2025.2.0" PrivateAssets="All" />
|
||||||
<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />
|
|
||||||
|
|
||||||
<PackageReference Include="JetBrains.Annotations" Version="2024.3.0" PrivateAssets="All" />
|
|
||||||
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All" />
|
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup Condition=" '$(TargetFramework)' == 'net8.0' ">
|
<ItemGroup Condition=" '$(TargetFramework)' == 'net8.0' ">
|
||||||
<PackageReference Include="SonarAnalyzer.CSharp" Version="9.32.0.97167">
|
<PackageReference Include="SonarAnalyzer.CSharp" Version="10.15.0.120848">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
|
|||||||
@@ -56,13 +56,14 @@ For more info, see also this WIKI page: [What is WireMock.Net](https://github.co
|
|||||||
| **WireMock.Net.OpenApiParser** | [](https://www.nuget.org/packages/WireMock.Net.OpenApiParser) | [](https://www.myget.org/feed/wiremock-net/package/nuget/WireMock.Net.OpenApiParser)
|
| **WireMock.Net.OpenApiParser** | [](https://www.nuget.org/packages/WireMock.Net.OpenApiParser) | [](https://www.myget.org/feed/wiremock-net/package/nuget/WireMock.Net.OpenApiParser)
|
||||||
| **WireMock.Net.MimePart** | [](https://www.nuget.org/packages/WireMock.Net.MimePart) | [](https://www.myget.org/feed/wiremock-net/package/nuget/WireMock.Net.MimePart)
|
| **WireMock.Net.MimePart** | [](https://www.nuget.org/packages/WireMock.Net.MimePart) | [](https://www.myget.org/feed/wiremock-net/package/nuget/WireMock.Net.MimePart)
|
||||||
| **WireMock.Net.GraphQL** | [](https://www.nuget.org/packages/WireMock.Net.GraphQL) | [](https://www.myget.org/feed/wiremock-net/package/nuget/WireMock.Net.GraphQL)
|
| **WireMock.Net.GraphQL** | [](https://www.nuget.org/packages/WireMock.Net.GraphQL) | [](https://www.myget.org/feed/wiremock-net/package/nuget/WireMock.Net.GraphQL)
|
||||||
|
| **WireMock.Net.ProtoBuf** | [](https://www.nuget.org/packages/WireMock.Net.ProtoBuf) | [](https://www.myget.org/feed/wiremock-net/package/nuget/WireMock.Net.ProtoBuf)
|
||||||
| | | |
|
| | | |
|
||||||
| **WireMock.Net.RestClient** | [](https://www.nuget.org/packages/WireMock.Net.RestClient) | [](https://www.myget.org/feed/wiremock-net/package/nuget/WireMock.Net.RestClient)
|
| **WireMock.Net.RestClient** | [](https://www.nuget.org/packages/WireMock.Net.RestClient) | [](https://www.myget.org/feed/wiremock-net/package/nuget/WireMock.Net.RestClient)
|
||||||
| **WireMock.Org.RestClient** | [](https://www.nuget.org/packages/WireMock.Org.RestClient) | [](https://www.myget.org/feed/wiremock-net/package/nuget/WireMock.Org.RestClient)
|
| **WireMock.Org.RestClient** | [](https://www.nuget.org/packages/WireMock.Org.RestClient) | [](https://www.myget.org/feed/wiremock-net/package/nuget/WireMock.Org.RestClient)
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
🔺 **WireMock.Net.Minimal** does not include *WireMock.Net.MimePart* and *WireMock.Net.GraphQL*.
|
🔺 **WireMock.Net.Minimal** does not include *WireMock.Net.MimePart*, *WireMock.Net.GraphQL* and *WireMock.Net.ProtoBuf*.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -142,6 +142,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.Extensions.Rou
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.Extensions.Routing", "src\WireMock.Net.Extensions.Routing\WireMock.Net.Extensions.Routing.csproj", "{1E874C8F-08A2-493B-8421-619F9A6E9E77}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.Extensions.Routing", "src\WireMock.Net.Extensions.Routing\WireMock.Net.Extensions.Routing.csproj", "{1E874C8F-08A2-493B-8421-619F9A6E9E77}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.ProtoBuf", "src\WireMock.Net.ProtoBuf\WireMock.Net.ProtoBuf.csproj", "{B47413AA-55D3-49A7-896A-17ADBFF72407}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@@ -344,6 +346,10 @@ Global
|
|||||||
{1E874C8F-08A2-493B-8421-619F9A6E9E77}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{1E874C8F-08A2-493B-8421-619F9A6E9E77}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{1E874C8F-08A2-493B-8421-619F9A6E9E77}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{1E874C8F-08A2-493B-8421-619F9A6E9E77}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{1E874C8F-08A2-493B-8421-619F9A6E9E77}.Release|Any CPU.Build.0 = Release|Any CPU
|
{1E874C8F-08A2-493B-8421-619F9A6E9E77}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{B47413AA-55D3-49A7-896A-17ADBFF72407}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{B47413AA-55D3-49A7-896A-17ADBFF72407}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{B47413AA-55D3-49A7-896A-17ADBFF72407}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{B47413AA-55D3-49A7-896A-17ADBFF72407}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
@@ -400,6 +406,7 @@ Global
|
|||||||
{B6269AAC-170A-4346-8B9A-444DED3D9A45} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2}
|
{B6269AAC-170A-4346-8B9A-444DED3D9A45} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2}
|
||||||
{3FCBCA9C-9DB0-4A96-B47E-30470764CC9C} = {0BB8B634-407A-4610-A91F-11586990767A}
|
{3FCBCA9C-9DB0-4A96-B47E-30470764CC9C} = {0BB8B634-407A-4610-A91F-11586990767A}
|
||||||
{1E874C8F-08A2-493B-8421-619F9A6E9E77} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2}
|
{1E874C8F-08A2-493B-8421-619F9A6E9E77} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2}
|
||||||
|
{B47413AA-55D3-49A7-896A-17ADBFF72407} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {DC539027-9852-430C-B19F-FD035D018458}
|
SolutionGuid = {DC539027-9852-430C-B19F-FD035D018458}
|
||||||
|
|||||||
@@ -15,12 +15,12 @@ public interface IResponseMessage
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The Body.
|
/// The Body.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
IBodyData? BodyData { get; }
|
IBodyData? BodyData { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the body destination (Null, SameAsSource, String or Bytes).
|
/// Gets the body destination (Null, SameAsSource, String or Bytes).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
string? BodyDestination { get; }
|
string? BodyDestination { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the body.
|
/// Gets or sets the body.
|
||||||
@@ -30,27 +30,27 @@ public interface IResponseMessage
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the Fault percentage.
|
/// Gets the Fault percentage.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
double? FaultPercentage { get; }
|
double? FaultPercentage { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The FaultType.
|
/// The FaultType.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
FaultType FaultType { get; }
|
FaultType FaultType { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the headers.
|
/// Gets the headers.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
IDictionary<string, WireMockList<string>>? Headers { get; }
|
IDictionary<string, WireMockList<string>>? Headers { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the trailing headers.
|
/// Gets the trailing headers.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
IDictionary<string, WireMockList<string>>? TrailingHeaders { get; }
|
IDictionary<string, WireMockList<string>>? TrailingHeaders { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the status code.
|
/// Gets or sets the status code.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
object? StatusCode { get; }
|
object? StatusCode { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Adds the header.
|
/// Adds the header.
|
||||||
|
|||||||
@@ -38,9 +38,6 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<!-- CVE-2018-8292 -->
|
|
||||||
<PackageReference Include="System.Net.Http " Version="4.3.4" />
|
|
||||||
|
|
||||||
<!-- See also https://mstack.nl/blog/20210801-source-generators -->
|
<!-- See also https://mstack.nl/blog/20210801-source-generators -->
|
||||||
<PackageReference Include="FluentBuilder" Version="0.10.0">
|
<PackageReference Include="FluentBuilder" Version="0.10.0">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
@@ -50,34 +47,15 @@
|
|||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<!--<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
|
||||||
<PackageReference Include="Stef.Validation" Version="0.1.1" />
|
|
||||||
<PackageReference Include="AnyOf" Version="0.4.0" />-->
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup Condition="$(TargetFramework.StartsWith('netstandard')) and '$(TargetFramework)' != 'netstandard1.0'">
|
<ItemGroup Condition="$(TargetFramework.StartsWith('netstandard')) and '$(TargetFramework)' != 'netstandard1.0'">
|
||||||
<PackageReference Include="System.Security.Cryptography.X509Certificates" Version="4.3.0" />
|
<PackageReference Include="System.Security.Cryptography.X509Certificates" Version="4.3.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<!--<ItemGroup>
|
|
||||||
<PackageReference Include="Nullable" Version="1.3.1">
|
|
||||||
<PrivateAssets>all</PrivateAssets>
|
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
||||||
</PackageReference>
|
|
||||||
</ItemGroup>-->
|
|
||||||
|
|
||||||
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard1.3' or '$(TargetFramework)' == 'net45' or '$(TargetFramework)' == 'net451' or '$(TargetFramework)' == 'net461'">
|
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard1.3' or '$(TargetFramework)' == 'net45' or '$(TargetFramework)' == 'net451' or '$(TargetFramework)' == 'net461'">
|
||||||
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
|
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
|
||||||
|
|
||||||
<!--<PackageReference Include="Nullable" Version="1.3.1">
|
|
||||||
<PrivateAssets>all</PrivateAssets>
|
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
||||||
</PackageReference>-->
|
|
||||||
|
|
||||||
<!--<PackageReference Include="PolySharp" Version="1.14.1">
|
|
||||||
<PrivateAssets>all</PrivateAssets>
|
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
||||||
</PackageReference>-->
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
@@ -7,4 +7,4 @@ namespace WireMock.Net.Extensions.Routing.Delegates;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="requestMessage">The incoming request message.</param>
|
/// <param name="requestMessage">The incoming request message.</param>
|
||||||
/// <returns>A task that resolves to a <see cref="ResponseMessage"/>.</returns>
|
/// <returns>A task that resolves to a <see cref="ResponseMessage"/>.</returns>
|
||||||
public delegate Task<ResponseMessage> WireMockHttpRequestHandler(IRequestMessage requestMessage);
|
public delegate Task<IResponseMessage> WireMockHttpRequestHandler(IRequestMessage requestMessage);
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ public sealed class WireMockRouter(WireMockServer server)
|
|||||||
Func<IRequestMessage, object?> requestHandler) =>
|
Func<IRequestMessage, object?> requestHandler) =>
|
||||||
request => CreateResponseMessageAsync(requestHandler(request));
|
request => CreateResponseMessageAsync(requestHandler(request));
|
||||||
|
|
||||||
private static async Task<ResponseMessage> CreateResponseMessageAsync(object? response)
|
private static async Task<IResponseMessage> CreateResponseMessageAsync(object? response)
|
||||||
{
|
{
|
||||||
var awaitedResponse = response is Task task
|
var awaitedResponse = response is Task task
|
||||||
? await task.ToGenericTaskAsync()
|
? await task.ToGenericTaskAsync()
|
||||||
|
|||||||
@@ -177,11 +177,10 @@ namespace WireMock.Owin.Mappers
|
|||||||
var jsonBody = JsonConvert.SerializeObject(bodyData.BodyAsJson, new JsonSerializerSettings { Formatting = formatting, NullValueHandling = NullValueHandling.Ignore });
|
var jsonBody = JsonConvert.SerializeObject(bodyData.BodyAsJson, new JsonSerializerSettings { Formatting = formatting, NullValueHandling = NullValueHandling.Ignore });
|
||||||
return (bodyData.Encoding ?? _utf8NoBom).GetBytes(jsonBody);
|
return (bodyData.Encoding ?? _utf8NoBom).GetBytes(jsonBody);
|
||||||
|
|
||||||
#if PROTOBUF
|
|
||||||
case BodyType.ProtoBuf:
|
case BodyType.ProtoBuf:
|
||||||
var protoDefinitions = bodyData.ProtoDefinition?.Invoke().Texts;
|
var protoDefinitions = bodyData.ProtoDefinition?.Invoke().Texts;
|
||||||
return await ProtoBufUtils.GetProtoBufMessageWithHeaderAsync(protoDefinitions, bodyData.ProtoBufMessageType, bodyData.BodyAsJson).ConfigureAwait(false);
|
var protoBufUtils = TypeLoader.LoadStaticInstance<IProtoBufUtils>();
|
||||||
#endif
|
return await protoBufUtils.GetProtoBufMessageWithHeaderAsync(protoDefinitions, bodyData.ProtoBufMessageType, bodyData.BodyAsJson).ConfigureAwait(false);
|
||||||
|
|
||||||
case BodyType.Bytes:
|
case BodyType.Bytes:
|
||||||
return bodyData.BodyAsBytes;
|
return bodyData.BodyAsBytes;
|
||||||
|
|||||||
@@ -1,61 +0,0 @@
|
|||||||
// Copyright © WireMock.Net
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using WireMock.Matchers;
|
|
||||||
using WireMock.Matchers.Request;
|
|
||||||
using WireMock.Models;
|
|
||||||
|
|
||||||
namespace WireMock.RequestBuilders;
|
|
||||||
|
|
||||||
public partial class Request
|
|
||||||
{
|
|
||||||
/// <inheritdoc />
|
|
||||||
public IRequestBuilder WithBodyAsProtoBuf(string protoDefinition, string messageType, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
|
|
||||||
{
|
|
||||||
return WithBodyAsProtoBuf([protoDefinition], messageType, matchBehaviour);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public IRequestBuilder WithBodyAsProtoBuf(string protoDefinition, string messageType, IObjectMatcher matcher, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
|
|
||||||
{
|
|
||||||
return WithBodyAsProtoBuf([protoDefinition], messageType, matcher, matchBehaviour);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public IRequestBuilder WithBodyAsProtoBuf(IReadOnlyList<string> protoDefinitions, string messageType, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
|
|
||||||
{
|
|
||||||
return Add(new RequestMessageProtoBufMatcher(matchBehaviour, () => new IdOrTexts(null, protoDefinitions), messageType));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public IRequestBuilder WithBodyAsProtoBuf(IReadOnlyList<string> protoDefinitions, string messageType, IObjectMatcher matcher, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
|
|
||||||
{
|
|
||||||
return Add(new RequestMessageProtoBufMatcher(matchBehaviour, () => new IdOrTexts(null, protoDefinitions), messageType, matcher));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public IRequestBuilder WithBodyAsProtoBuf(string messageType, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
|
|
||||||
{
|
|
||||||
return Add(new RequestMessageProtoBufMatcher(matchBehaviour, ProtoDefinitionFunc(), messageType));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public IRequestBuilder WithBodyAsProtoBuf(string messageType, IObjectMatcher matcher, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
|
|
||||||
{
|
|
||||||
return Add(new RequestMessageProtoBufMatcher(matchBehaviour, ProtoDefinitionFunc(), messageType, matcher));
|
|
||||||
}
|
|
||||||
|
|
||||||
private Func<IdOrTexts> ProtoDefinitionFunc()
|
|
||||||
{
|
|
||||||
return () =>
|
|
||||||
{
|
|
||||||
if (Mapping.ProtoDefinition == null)
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException($"No ProtoDefinition defined on mapping '{Mapping.Guid}'. Please use the WireMockServerSettings to define ProtoDefinitions.");
|
|
||||||
}
|
|
||||||
|
|
||||||
return Mapping.ProtoDefinition.Value;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -20,9 +20,7 @@ public partial class Request : RequestMessageCompositeMatcher, IRequestBuilder
|
|||||||
{
|
{
|
||||||
private readonly IList<IRequestMatcher> _requestMatchers;
|
private readonly IList<IRequestMatcher> _requestMatchers;
|
||||||
|
|
||||||
/// <summary>
|
/// <inheritdoc />
|
||||||
/// The link back to the Mapping.
|
|
||||||
/// </summary>
|
|
||||||
public IMapping Mapping { get; set; } = null!;
|
public IMapping Mapping { get; set; } = null!;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -73,6 +71,7 @@ public partial class Request : RequestMessageCompositeMatcher, IRequestBuilder
|
|||||||
return _requestMatchers.OfType<T>().FirstOrDefault(func);
|
return _requestMatchers.OfType<T>().FirstOrDefault(func);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
public IRequestBuilder Add<T>(T requestMatcher) where T : IRequestMatcher
|
public IRequestBuilder Add<T>(T requestMatcher) where T : IRequestMatcher
|
||||||
{
|
{
|
||||||
foreach (var existing in _requestMatchers.OfType<T>().ToArray())
|
foreach (var existing in _requestMatchers.OfType<T>().ToArray())
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
// Copyright © WireMock.Net
|
|
||||||
|
|
||||||
namespace WireMock.ResponseBuilders;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The ResponseBuilder interface.
|
|
||||||
/// </summary>
|
|
||||||
public interface IResponseBuilder : IProxyResponseBuilder
|
|
||||||
{
|
|
||||||
}
|
|
||||||
@@ -1,12 +1,10 @@
|
|||||||
// Copyright © WireMock.Net
|
// Copyright © WireMock.Net
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using JsonConverter.Abstractions;
|
using JsonConverter.Abstractions;
|
||||||
using Stef.Validation;
|
using Stef.Validation;
|
||||||
using WireMock.Exceptions;
|
|
||||||
using WireMock.Models;
|
using WireMock.Models;
|
||||||
using WireMock.Types;
|
using WireMock.Types;
|
||||||
using WireMock.Util;
|
using WireMock.Util;
|
||||||
@@ -235,72 +233,4 @@ public partial class Response
|
|||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public IResponseBuilder WithBodyAsProtoBuf(
|
|
||||||
string protoDefinition,
|
|
||||||
string messageType,
|
|
||||||
object value,
|
|
||||||
IJsonConverter? jsonConverter = null,
|
|
||||||
JsonConverterOptions? options = null
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return WithBodyAsProtoBuf([protoDefinition], messageType, value, jsonConverter, options);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public IResponseBuilder WithBodyAsProtoBuf(
|
|
||||||
IReadOnlyList<string> protoDefinitions,
|
|
||||||
string messageType,
|
|
||||||
object value,
|
|
||||||
IJsonConverter? jsonConverter = null,
|
|
||||||
JsonConverterOptions? options = null
|
|
||||||
)
|
|
||||||
{
|
|
||||||
Guard.NotNullOrEmpty(protoDefinitions);
|
|
||||||
Guard.NotNullOrWhiteSpace(messageType);
|
|
||||||
Guard.NotNull(value);
|
|
||||||
|
|
||||||
#if !PROTOBUF
|
|
||||||
throw new NotSupportedException("The WithBodyAsProtoBuf method can not be used for .NETStandard1.3 or .NET Framework 4.6.1 or lower.");
|
|
||||||
#else
|
|
||||||
ResponseMessage.BodyDestination = null;
|
|
||||||
ResponseMessage.BodyData = new BodyData
|
|
||||||
{
|
|
||||||
DetectedBodyType = BodyType.ProtoBuf,
|
|
||||||
BodyAsJson = value,
|
|
||||||
ProtoDefinition = () => new IdOrTexts(null, protoDefinitions),
|
|
||||||
ProtoBufMessageType = messageType
|
|
||||||
};
|
|
||||||
|
|
||||||
return this;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public IResponseBuilder WithBodyAsProtoBuf(
|
|
||||||
string messageType,
|
|
||||||
object value,
|
|
||||||
IJsonConverter? jsonConverter = null,
|
|
||||||
JsonConverterOptions? options = null
|
|
||||||
)
|
|
||||||
{
|
|
||||||
Guard.NotNullOrWhiteSpace(messageType);
|
|
||||||
Guard.NotNull(value);
|
|
||||||
|
|
||||||
#if !PROTOBUF
|
|
||||||
throw new NotSupportedException("The WithBodyAsProtoBuf method can not be used for .NETStandard1.3 or .NET Framework 4.6.1 or lower.");
|
|
||||||
#else
|
|
||||||
ResponseMessage.BodyDestination = null;
|
|
||||||
ResponseMessage.BodyData = new BodyData
|
|
||||||
{
|
|
||||||
DetectedBodyType = BodyType.ProtoBuf,
|
|
||||||
BodyAsJson = value,
|
|
||||||
ProtoDefinition = () => Mapping.ProtoDefinition ?? throw new WireMockException("ProtoDefinition cannot be resolved. You probably forgot to call .WithProtoDefinition(...) on the mapping."),
|
|
||||||
ProtoBufMessageType = messageType
|
|
||||||
};
|
|
||||||
|
|
||||||
return this;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -13,13 +13,13 @@ public partial class Response
|
|||||||
/// A delegate to execute to generate the response.
|
/// A delegate to execute to generate the response.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[MemberNotNullWhen(true, nameof(WithCallbackUsed))]
|
[MemberNotNullWhen(true, nameof(WithCallbackUsed))]
|
||||||
public Func<IRequestMessage, ResponseMessage>? Callback { get; private set; }
|
public Func<IRequestMessage, IResponseMessage>? Callback { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A delegate to execute to generate the response async.
|
/// A delegate to execute to generate the response async.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[MemberNotNullWhen(true, nameof(WithCallbackUsed))]
|
[MemberNotNullWhen(true, nameof(WithCallbackUsed))]
|
||||||
public Func<IRequestMessage, Task<ResponseMessage>>? CallbackAsync { get; private set; }
|
public Func<IRequestMessage, Task<IResponseMessage>>? CallbackAsync { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Defines if the method WithCallback(...) is used.
|
/// Defines if the method WithCallback(...) is used.
|
||||||
@@ -27,7 +27,7 @@ public partial class Response
|
|||||||
public bool WithCallbackUsed { get; private set; }
|
public bool WithCallbackUsed { get; private set; }
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public IResponseBuilder WithCallback(Func<IRequestMessage, ResponseMessage> callbackHandler)
|
public IResponseBuilder WithCallback(Func<IRequestMessage, IResponseMessage> callbackHandler)
|
||||||
{
|
{
|
||||||
Guard.NotNull(callbackHandler);
|
Guard.NotNull(callbackHandler);
|
||||||
|
|
||||||
@@ -35,14 +35,14 @@ public partial class Response
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public IResponseBuilder WithCallback(Func<IRequestMessage, Task<ResponseMessage>> callbackHandler)
|
public IResponseBuilder WithCallback(Func<IRequestMessage, Task<IResponseMessage>> callbackHandler)
|
||||||
{
|
{
|
||||||
Guard.NotNull(callbackHandler);
|
Guard.NotNull(callbackHandler);
|
||||||
|
|
||||||
return WithCallbackInternal(true, callbackHandler);
|
return WithCallbackInternal(true, callbackHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
private IResponseBuilder WithCallbackInternal(bool withCallbackUsed, Func<IRequestMessage, ResponseMessage> callbackHandler)
|
private IResponseBuilder WithCallbackInternal(bool withCallbackUsed, Func<IRequestMessage, IResponseMessage> callbackHandler)
|
||||||
{
|
{
|
||||||
Guard.NotNull(callbackHandler);
|
Guard.NotNull(callbackHandler);
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@ public partial class Response
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
private IResponseBuilder WithCallbackInternal(bool withCallbackUsed, Func<IRequestMessage, Task<ResponseMessage>> callbackHandler)
|
private IResponseBuilder WithCallbackInternal(bool withCallbackUsed, Func<IRequestMessage, Task<IResponseMessage>> callbackHandler)
|
||||||
{
|
{
|
||||||
Guard.NotNull(callbackHandler);
|
Guard.NotNull(callbackHandler);
|
||||||
|
|
||||||
|
|||||||
@@ -28,9 +28,7 @@ public partial class Response : IResponseBuilder
|
|||||||
|
|
||||||
private TimeSpan? _delay;
|
private TimeSpan? _delay;
|
||||||
|
|
||||||
/// <summary>
|
/// <inheritdoc />
|
||||||
/// The link back to the mapping.
|
|
||||||
/// </summary>
|
|
||||||
public IMapping Mapping { get; set; } = null!;
|
public IMapping Mapping { get; set; } = null!;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -81,10 +79,8 @@ public partial class Response : IResponseBuilder
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public ReplaceNodeOptions TransformerReplaceNodeOptions { get; private set; }
|
public ReplaceNodeOptions TransformerReplaceNodeOptions { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <inheritdoc />
|
||||||
/// Gets the response message.
|
public IResponseMessage ResponseMessage { get; }
|
||||||
/// </summary>
|
|
||||||
public ResponseMessage ResponseMessage { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates this instance.
|
/// Creates this instance.
|
||||||
@@ -226,7 +222,7 @@ public partial class Response : IResponseBuilder
|
|||||||
).ConfigureAwait(false);
|
).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
ResponseMessage responseMessage;
|
IResponseMessage responseMessage;
|
||||||
if (!WithCallbackUsed)
|
if (!WithCallbackUsed)
|
||||||
{
|
{
|
||||||
responseMessage = ResponseMessage;
|
responseMessage = ResponseMessage;
|
||||||
|
|||||||
@@ -126,12 +126,10 @@ internal class MappingConverter(MatcherMapper mapper)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if PROTOBUF
|
|
||||||
if (requestMessageProtoBufMatcher?.Matcher != null)
|
if (requestMessageProtoBufMatcher?.Matcher != null)
|
||||||
{
|
{
|
||||||
sb.AppendLine(" // .WithBodyAsProtoBuf() is not yet supported");
|
sb.AppendLine(" // .WithBodyAsProtoBuf() is not yet supported");
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
if (requestMessageBodyMatcher?.Matchers != null)
|
if (requestMessageBodyMatcher?.Matchers != null)
|
||||||
{
|
{
|
||||||
@@ -188,7 +186,7 @@ internal class MappingConverter(MatcherMapper mapper)
|
|||||||
sb.AppendLine($" .WithStatusCode({(int)httpStatusCode})");
|
sb.AppendLine($" .WithStatusCode({(int)httpStatusCode})");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response.ResponseMessage.Headers is { })
|
if (response.ResponseMessage.Headers != null)
|
||||||
{
|
{
|
||||||
foreach (var header in response.ResponseMessage.Headers)
|
foreach (var header in response.ResponseMessage.Headers)
|
||||||
{
|
{
|
||||||
@@ -196,7 +194,7 @@ internal class MappingConverter(MatcherMapper mapper)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response.ResponseMessage.TrailingHeaders is { })
|
if (response.ResponseMessage.TrailingHeaders != null)
|
||||||
{
|
{
|
||||||
foreach (var header in response.ResponseMessage.TrailingHeaders)
|
foreach (var header in response.ResponseMessage.TrailingHeaders)
|
||||||
{
|
{
|
||||||
@@ -400,13 +398,11 @@ internal class MappingConverter(MatcherMapper mapper)
|
|||||||
{
|
{
|
||||||
void AfterMap(MatcherModel matcherModel)
|
void AfterMap(MatcherModel matcherModel)
|
||||||
{
|
{
|
||||||
#if PROTOBUF
|
|
||||||
// In case the ProtoDefinition is defined at the Mapping level, clear the Pattern at the Matcher level
|
// In case the ProtoDefinition is defined at the Mapping level, clear the Pattern at the Matcher level
|
||||||
if (bodyMatchers?.OfType<ProtoBufMatcher>().Any() == true && mappingModel.ProtoDefinition != null)
|
if (bodyMatchers?.OfType<IProtoBufMatcher>().Any() == true && mappingModel.ProtoDefinition != null)
|
||||||
{
|
{
|
||||||
matcherModel.Pattern = null;
|
matcherModel.Pattern = null;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mappingModel.Request.Body = new BodyModel();
|
mappingModel.Request.Body = new BodyModel();
|
||||||
|
|||||||
@@ -80,10 +80,9 @@ internal class MatcherMapper
|
|||||||
case "MimePartMatcher":
|
case "MimePartMatcher":
|
||||||
return CreateMimePartMatcher(matchBehaviour, matcherModel);
|
return CreateMimePartMatcher(matchBehaviour, matcherModel);
|
||||||
|
|
||||||
#if PROTOBUF
|
case "ProtoBufMatcher":
|
||||||
case nameof(ProtoBufMatcher):
|
|
||||||
return CreateProtoBufMatcher(matchBehaviour, stringPatterns.GetPatterns(), matcherModel);
|
return CreateProtoBufMatcher(matchBehaviour, stringPatterns.GetPatterns(), matcherModel);
|
||||||
#endif
|
|
||||||
case nameof(RegexMatcher):
|
case nameof(RegexMatcher):
|
||||||
return new RegexMatcher(matchBehaviour, stringPatterns, ignoreCase, useRegexExtended, matchOperator);
|
return new RegexMatcher(matchBehaviour, stringPatterns, ignoreCase, useRegexExtended, matchOperator);
|
||||||
|
|
||||||
@@ -210,7 +209,7 @@ internal class MatcherMapper
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
#if PROTOBUF
|
#if PROTOBUF
|
||||||
case ProtoBufMatcher protoBufMatcher:
|
case IProtoBufMatcher protoBufMatcher:
|
||||||
protoBufMatcher.ProtoDefinition().Value(id => model.Pattern = id, texts =>
|
protoBufMatcher.ProtoDefinition().Value(id => model.Pattern = id, texts =>
|
||||||
{
|
{
|
||||||
if (texts.Count == 1)
|
if (texts.Count == 1)
|
||||||
@@ -286,17 +285,15 @@ internal class MatcherMapper
|
|||||||
return TypeLoader.LoadNewInstance<IMimePartMatcher>(matchBehaviour, contentTypeMatcher, contentDispositionMatcher, contentTransferEncodingMatcher, contentMatcher);
|
return TypeLoader.LoadNewInstance<IMimePartMatcher>(matchBehaviour, contentTypeMatcher, contentDispositionMatcher, contentTransferEncodingMatcher, contentMatcher);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if PROTOBUF
|
private IProtoBufMatcher CreateProtoBufMatcher(MatchBehaviour? matchBehaviour, IReadOnlyList<string> protoDefinitions, MatcherModel matcher)
|
||||||
private ProtoBufMatcher CreateProtoBufMatcher(MatchBehaviour? matchBehaviour, IReadOnlyList<string> protoDefinitions, MatcherModel matcher)
|
|
||||||
{
|
{
|
||||||
var objectMatcher = Map(matcher.ContentMatcher) as IObjectMatcher;
|
var objectMatcher = Map(matcher.ContentMatcher) as IObjectMatcher;
|
||||||
|
|
||||||
return new ProtoBufMatcher(
|
return TypeLoader.LoadNewInstance<IProtoBufMatcher>(
|
||||||
() => ProtoDefinitionHelper.GetIdOrTexts(_settings, protoDefinitions.ToArray()),
|
() => ProtoDefinitionUtils.GetIdOrTexts(_settings, protoDefinitions.ToArray()),
|
||||||
matcher.ProtoBufMessageType!,
|
matcher.ProtoBufMessageType!,
|
||||||
matchBehaviour ?? MatchBehaviour.AcceptOnMatch,
|
matchBehaviour ?? MatchBehaviour.AcceptOnMatch,
|
||||||
objectMatcher
|
objectMatcher
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
@@ -356,12 +356,9 @@ internal class RespondWithAProvider : IRespondWithAProvider
|
|||||||
{
|
{
|
||||||
Guard.NotNull(protoDefinitionOrId);
|
Guard.NotNull(protoDefinitionOrId);
|
||||||
|
|
||||||
#if PROTOBUF
|
ProtoDefinition = ProtoDefinitionUtils.GetIdOrTexts(_settings, protoDefinitionOrId);
|
||||||
ProtoDefinition = ProtoDefinitionHelper.GetIdOrTexts(_settings, protoDefinitionOrId);
|
|
||||||
return this;
|
return this;
|
||||||
#else
|
|
||||||
throw new NotSupportedException("The WithProtoDefinition method can not be used for .NETStandard1.3 or .NET Framework 4.6.1 or lower.");
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
|||||||
@@ -241,13 +241,13 @@ public partial class WireMockServer
|
|||||||
if (requestModel.Body?.Matcher != null)
|
if (requestModel.Body?.Matcher != null)
|
||||||
{
|
{
|
||||||
var bodyMatcher = _matcherMapper.Map(requestModel.Body.Matcher)!;
|
var bodyMatcher = _matcherMapper.Map(requestModel.Body.Matcher)!;
|
||||||
#if PROTOBUF
|
|
||||||
// If the BodyMatcher is a ProtoBufMatcher, and if ProtoDefinition is defined on Mapping-level, set the ProtoDefinition from that Mapping.
|
// If the BodyMatcher is a ProtoBufMatcher, and if ProtoDefinition is defined on Mapping-level, set the ProtoDefinition from that Mapping.
|
||||||
if (bodyMatcher is ProtoBufMatcher protoBufMatcher && mappingModel?.ProtoDefinition != null)
|
if (bodyMatcher is IProtoBufMatcher protoBufMatcher && mappingModel?.ProtoDefinition != null)
|
||||||
{
|
{
|
||||||
protoBufMatcher.ProtoDefinition = () => ProtoDefinitionHelper.GetIdOrTexts(_settings, mappingModel.ProtoDefinition);
|
protoBufMatcher.ProtoDefinition = () => ProtoDefinitionUtils.GetIdOrTexts(_settings, mappingModel.ProtoDefinition);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
requestBuilder = requestBuilder.WithBody(bodyMatcher);
|
requestBuilder = requestBuilder.WithBody(bodyMatcher);
|
||||||
}
|
}
|
||||||
else if (requestModel.Body?.Matchers != null)
|
else if (requestModel.Body?.Matchers != null)
|
||||||
@@ -368,18 +368,19 @@ public partial class WireMockServer
|
|||||||
{
|
{
|
||||||
if (responseModel.ProtoBufMessageType != null)
|
if (responseModel.ProtoBufMessageType != null)
|
||||||
{
|
{
|
||||||
|
var protoBufUtils = TypeLoader.LoadStaticInstance<IProtoBufUtils>();
|
||||||
|
|
||||||
if (responseModel.ProtoDefinition != null)
|
if (responseModel.ProtoDefinition != null)
|
||||||
{
|
{
|
||||||
responseBuilder = responseBuilder.WithBodyAsProtoBuf(responseModel.ProtoDefinition, responseModel.ProtoBufMessageType, responseModel.BodyAsJson);
|
responseBuilder = protoBufUtils.UpdateResponseBuilder(responseBuilder, responseModel.ProtoBufMessageType, responseModel.BodyAsJson, responseModel.ProtoDefinition);
|
||||||
}
|
}
|
||||||
else if (responseModel.ProtoDefinitions != null)
|
else if (responseModel.ProtoDefinitions != null)
|
||||||
{
|
{
|
||||||
responseBuilder = responseBuilder.WithBodyAsProtoBuf(responseModel.ProtoDefinitions, responseModel.ProtoBufMessageType, responseModel.BodyAsJson);
|
responseBuilder = protoBufUtils.UpdateResponseBuilder(responseBuilder, responseModel.ProtoBufMessageType, responseModel.BodyAsJson, responseModel.ProtoDefinitions);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// ProtoDefinition(s) is/are defined at Mapping/Server level
|
responseBuilder = protoBufUtils.UpdateResponseBuilder(responseBuilder, responseModel.ProtoBufMessageType, responseModel.BodyAsJson);
|
||||||
responseBuilder = responseBuilder.WithBodyAsProtoBuf(responseModel.ProtoBufMessageType, responseModel.BodyAsJson);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -125,9 +125,9 @@
|
|||||||
<PackageReference Include="Scriban.Signed" Version="5.5.0" />
|
<PackageReference Include="Scriban.Signed" Version="5.5.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup Condition="'$(TargetFramework)' != 'netstandard1.3' and '$(TargetFramework)' != 'net451' and '$(TargetFramework)' != 'net452' and '$(TargetFramework)' != 'net46' and '$(TargetFramework)' != 'net461'">
|
<!--<ItemGroup Condition="'$(TargetFramework)' != 'netstandard1.3' and '$(TargetFramework)' != 'net451' and '$(TargetFramework)' != 'net452' and '$(TargetFramework)' != 'net46' and '$(TargetFramework)' != 'net461'">
|
||||||
<PackageReference Include="ProtoBufJsonConverter" Version="0.10.0" />
|
<PackageReference Include="ProtoBufJsonConverter" Version="0.10.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>-->
|
||||||
|
|
||||||
<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp3.1' ">
|
<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp3.1' ">
|
||||||
<!--<PackageReference Include="Nullable" Version="1.3.1">
|
<!--<PackageReference Include="Nullable" Version="1.3.1">
|
||||||
@@ -155,16 +155,6 @@
|
|||||||
</Compile>
|
</Compile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Handlebars.Net.Helpers" Version="2.5.2" />
|
|
||||||
<!--<PackageReference Include="Handlebars.Net.Helpers.DynamicLinq" Version="2.5.2" />-->
|
|
||||||
<PackageReference Include="Handlebars.Net.Helpers.Humanizer" Version="2.5.2" />
|
|
||||||
<PackageReference Include="Handlebars.Net.Helpers.Json" Version="2.5.2" />
|
|
||||||
<PackageReference Include="Handlebars.Net.Helpers.Random" Version="2.5.2" />
|
|
||||||
<PackageReference Include="Handlebars.Net.Helpers.Xeger" Version="2.5.2" />
|
|
||||||
<PackageReference Include="Handlebars.Net.Helpers.XPath" Version="2.5.2" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup Condition="'$(TargetFramework)' != 'netstandard1.3' and '$(TargetFramework)' != 'net451' and '$(TargetFramework)' != 'net452' ">
|
<ItemGroup Condition="'$(TargetFramework)' != 'netstandard1.3' and '$(TargetFramework)' != 'net451' and '$(TargetFramework)' != 'net452' ">
|
||||||
<PackageReference Include="Handlebars.Net.Helpers.Xslt" Version="2.5.2" />
|
<PackageReference Include="Handlebars.Net.Helpers.Xslt" Version="2.5.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
// Copyright © WireMock.Net
|
// Copyright © WireMock.Net
|
||||||
|
|
||||||
#if PROTOBUF
|
|
||||||
using System;
|
using System;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@@ -24,19 +23,13 @@ public class ProtoBufMatcher : IProtoBufMatcher
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public MatchBehaviour MatchBehaviour { get; }
|
public MatchBehaviour MatchBehaviour { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <inheritdoc />
|
||||||
/// The Func to define the proto definition as id or texts.
|
public Func<IdOrTexts> ProtoDefinition { get; set; }
|
||||||
/// </summary>
|
|
||||||
public Func<IdOrTexts> ProtoDefinition { get; internal set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <inheritdoc />
|
||||||
/// The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".
|
|
||||||
/// </summary>
|
|
||||||
public string MessageType { get; }
|
public string MessageType { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <inheritdoc />
|
||||||
/// The Matcher to use (optional).
|
|
||||||
/// </summary>
|
|
||||||
public IObjectMatcher? Matcher { get; }
|
public IObjectMatcher? Matcher { get; }
|
||||||
|
|
||||||
private static readonly Converter ProtoBufToJsonConverter = SingletonFactory<Converter>.GetInstance();
|
private static readonly Converter ProtoBufToJsonConverter = SingletonFactory<Converter>.GetInstance();
|
||||||
@@ -122,5 +115,4 @@ public class ProtoBufMatcher : IProtoBufMatcher
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
8
src/WireMock.Net.ProtoBuf/Properties/AssemblyInfo.cs
Normal file
8
src/WireMock.Net.ProtoBuf/Properties/AssemblyInfo.cs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
// Copyright © WireMock.Net
|
||||||
|
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
|
[assembly: InternalsVisibleTo("WireMock.Net.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")]
|
||||||
|
|
||||||
|
// Needed for Moq in the UnitTest project
|
||||||
|
// [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")]
|
||||||
@@ -0,0 +1,108 @@
|
|||||||
|
// Copyright © WireMock.Net
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using WireMock.Matchers;
|
||||||
|
using WireMock.Matchers.Request;
|
||||||
|
using WireMock.Models;
|
||||||
|
|
||||||
|
namespace WireMock.RequestBuilders;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// IRequestBuilderExtensions extensions for ProtoBuf.
|
||||||
|
/// </summary>
|
||||||
|
// ReSharper disable once InconsistentNaming
|
||||||
|
public static class IRequestBuilderExtensions
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// WithBodyAsProtoBuf
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="requestBuilder">The <see cref="IRequestBuilder"/>.</param>
|
||||||
|
/// <param name="protoDefinition">The proto definition as text.</param>
|
||||||
|
/// <param name="messageType">The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".</param>
|
||||||
|
/// <param name="matchBehaviour">The match behaviour. (default = "AcceptOnMatch")</param>
|
||||||
|
/// <returns>The <see cref="IRequestBuilder"/>.</returns>
|
||||||
|
public static IRequestBuilder WithBodyAsProtoBuf(this IRequestBuilder requestBuilder, string protoDefinition, string messageType, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
|
||||||
|
{
|
||||||
|
return requestBuilder.WithBodyAsProtoBuf([protoDefinition], messageType, matchBehaviour);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// WithBodyAsProtoBuf
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="requestBuilder">The <see cref="IRequestBuilder"/>.</param>
|
||||||
|
/// <param name="protoDefinition">The proto definition as text.</param>
|
||||||
|
/// <param name="messageType">The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".</param>
|
||||||
|
/// <param name="matcher">The matcher to use to match the ProtoBuf as (json) object.</param>
|
||||||
|
/// <param name="matchBehaviour">The match behaviour. (default = "AcceptOnMatch")</param>
|
||||||
|
/// <returns>The <see cref="IRequestBuilder"/>.</returns>
|
||||||
|
public static IRequestBuilder WithBodyAsProtoBuf(this IRequestBuilder requestBuilder, string protoDefinition, string messageType, IObjectMatcher matcher, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
|
||||||
|
{
|
||||||
|
return requestBuilder.WithBodyAsProtoBuf([protoDefinition], messageType, matcher, matchBehaviour);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// WithBodyAsProtoBuf
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="requestBuilder">The <see cref="IRequestBuilder"/>.</param>
|
||||||
|
/// <param name="protoDefinitions">The proto definitions as text.</param>
|
||||||
|
/// <param name="messageType">The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".</param>
|
||||||
|
/// <param name="matchBehaviour">The match behaviour. (default = "AcceptOnMatch")</param>
|
||||||
|
/// <returns>The <see cref="IRequestBuilder"/>.</returns>
|
||||||
|
public static IRequestBuilder WithBodyAsProtoBuf(this IRequestBuilder requestBuilder, IReadOnlyList<string> protoDefinitions, string messageType, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
|
||||||
|
{
|
||||||
|
return requestBuilder.Add(new RequestMessageProtoBufMatcher(matchBehaviour, () => new IdOrTexts(null, protoDefinitions), messageType));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// WithBodyAsProtoBuf
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="requestBuilder">The <see cref="IRequestBuilder"/>.</param>
|
||||||
|
/// <param name="protoDefinitions">The proto definitions as text.</param>
|
||||||
|
/// <param name="messageType">The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".</param>
|
||||||
|
/// <param name="matcher">The matcher to use to match the ProtoBuf as (json) object.</param>
|
||||||
|
/// <param name="matchBehaviour">The match behaviour. (default = "AcceptOnMatch")</param>
|
||||||
|
/// <returns>The <see cref="IRequestBuilder"/>.</returns>
|
||||||
|
public static IRequestBuilder WithBodyAsProtoBuf(this IRequestBuilder requestBuilder, IReadOnlyList<string> protoDefinitions, string messageType, IObjectMatcher matcher, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
|
||||||
|
{
|
||||||
|
return requestBuilder.Add(new RequestMessageProtoBufMatcher(matchBehaviour, () => new IdOrTexts(null, protoDefinitions), messageType, matcher));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// WithBodyAsProtoBuf
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="requestBuilder">The <see cref="IRequestBuilder"/>.</param>
|
||||||
|
/// <param name="messageType">The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".</param>
|
||||||
|
/// <param name="matchBehaviour">The match behaviour. (default = "AcceptOnMatch")</param>
|
||||||
|
/// <returns>The <see cref="IRequestBuilder"/>.</returns>
|
||||||
|
public static IRequestBuilder WithBodyAsProtoBuf(this IRequestBuilder requestBuilder, string messageType, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
|
||||||
|
{
|
||||||
|
return requestBuilder.Add(new RequestMessageProtoBufMatcher(matchBehaviour, ProtoDefinitionFunc(requestBuilder), messageType));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// WithBodyAsProtoBuf
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="requestBuilder">The <see cref="IRequestBuilder"/>.</param>
|
||||||
|
/// <param name="messageType">The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".</param>
|
||||||
|
/// <param name="matcher">The matcher to use to match the ProtoBuf as (json) object.</param>
|
||||||
|
/// <param name="matchBehaviour">The match behaviour. (default = "AcceptOnMatch")</param>
|
||||||
|
/// <returns>The <see cref="IRequestBuilder"/>.</returns>
|
||||||
|
public static IRequestBuilder WithBodyAsProtoBuf(this IRequestBuilder requestBuilder, string messageType, IObjectMatcher matcher, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
|
||||||
|
{
|
||||||
|
return requestBuilder.Add(new RequestMessageProtoBufMatcher(matchBehaviour, ProtoDefinitionFunc(requestBuilder), messageType, matcher));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Func<IdOrTexts> ProtoDefinitionFunc(IRequestBuilder requestBuilder)
|
||||||
|
{
|
||||||
|
return () =>
|
||||||
|
{
|
||||||
|
if (requestBuilder.Mapping.ProtoDefinition == null)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException($"No ProtoDefinition defined on mapping '{requestBuilder.Mapping.Guid}'. Please use the WireMockServerSettings to define ProtoDefinitions.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return requestBuilder.Mapping.ProtoDefinition.Value;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,106 @@
|
|||||||
|
// Copyright © WireMock.Net
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using JsonConverter.Abstractions;
|
||||||
|
using Stef.Validation;
|
||||||
|
using WireMock.Exceptions;
|
||||||
|
using WireMock.Models;
|
||||||
|
using WireMock.Types;
|
||||||
|
using WireMock.Util;
|
||||||
|
|
||||||
|
namespace WireMock.ResponseBuilders;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Extensions for <see cref="IResponseBuilder"/> to implement WithBodyAsProtoBuf.
|
||||||
|
/// </summary>
|
||||||
|
public static class IResponseBuilderExtensions
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// WithBodyAsProtoBuf : Create a ProtoBuf byte[] response based on a proto definition, message type and the value.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="responseBuilder">The response builder.</param>
|
||||||
|
/// <param name="protoDefinition">The proto definition as text.</param>
|
||||||
|
/// <param name="messageType">The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".</param>
|
||||||
|
/// <param name="value">The object to convert to protobuf byte[].</param>
|
||||||
|
/// <param name="jsonConverter">The <see cref="IJsonConverter"/> [optional]. Default value is NewtonsoftJsonConverter.</param>
|
||||||
|
/// <param name="options">The <see cref="JsonConverterOptions"/> [optional].</param>
|
||||||
|
/// <returns>A <see cref="IResponseBuilder"/>.</returns>
|
||||||
|
public static IResponseBuilder WithBodyAsProtoBuf(
|
||||||
|
this IResponseBuilder responseBuilder,
|
||||||
|
string protoDefinition,
|
||||||
|
string messageType,
|
||||||
|
object value,
|
||||||
|
IJsonConverter? jsonConverter = null,
|
||||||
|
JsonConverterOptions? options = null
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return responseBuilder.WithBodyAsProtoBuf([protoDefinition], messageType, value, jsonConverter, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// WithBodyAsProtoBuf : Create a ProtoBuf byte[] response based on proto definitions, message type and the value.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="responseBuilder">The response builder.</param>
|
||||||
|
/// <param name="protoDefinitions">The proto definition as text.</param>
|
||||||
|
/// <param name="messageType">The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".</param>
|
||||||
|
/// <param name="value">The object to convert to protobuf byte[].</param>
|
||||||
|
/// <param name="jsonConverter">The <see cref="IJsonConverter"/> [optional]. Default value is NewtonsoftJsonConverter.</param>
|
||||||
|
/// <param name="options">The <see cref="JsonConverterOptions"/> [optional].</param>
|
||||||
|
/// <returns>A <see cref="IResponseBuilder"/>.</returns>
|
||||||
|
public static IResponseBuilder WithBodyAsProtoBuf(
|
||||||
|
this IResponseBuilder responseBuilder,
|
||||||
|
IReadOnlyList<string> protoDefinitions,
|
||||||
|
string messageType,
|
||||||
|
object value,
|
||||||
|
IJsonConverter? jsonConverter = null,
|
||||||
|
JsonConverterOptions? options = null
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Guard.NotNullOrEmpty(protoDefinitions);
|
||||||
|
Guard.NotNullOrWhiteSpace(messageType);
|
||||||
|
Guard.NotNull(value);
|
||||||
|
|
||||||
|
responseBuilder.ResponseMessage.BodyDestination = null;
|
||||||
|
responseBuilder.ResponseMessage.BodyData = new BodyData
|
||||||
|
{
|
||||||
|
DetectedBodyType = BodyType.ProtoBuf,
|
||||||
|
BodyAsJson = value,
|
||||||
|
ProtoDefinition = () => new IdOrTexts(null, protoDefinitions),
|
||||||
|
ProtoBufMessageType = messageType
|
||||||
|
};
|
||||||
|
|
||||||
|
return responseBuilder;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// WithBodyAsProtoBuf : Create a ProtoBuf byte[] response based on a proto definition, message type and the value.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="responseBuilder">The response builder.</param>
|
||||||
|
/// <param name="messageType">The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".</param>
|
||||||
|
/// <param name="value">The object to convert to protobuf byte[].</param>
|
||||||
|
/// <param name="jsonConverter">The <see cref="IJsonConverter"/> [optional]. Default value is NewtonsoftJsonConverter.</param>
|
||||||
|
/// <param name="options">The <see cref="JsonConverterOptions"/> [optional].</param>
|
||||||
|
/// <returns>A <see cref="IResponseBuilder"/>.</returns>
|
||||||
|
public static IResponseBuilder WithBodyAsProtoBuf(
|
||||||
|
this IResponseBuilder responseBuilder,
|
||||||
|
string messageType,
|
||||||
|
object value,
|
||||||
|
IJsonConverter? jsonConverter = null,
|
||||||
|
JsonConverterOptions? options = null
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Guard.NotNullOrWhiteSpace(messageType);
|
||||||
|
Guard.NotNull(value);
|
||||||
|
|
||||||
|
responseBuilder.ResponseMessage.BodyDestination = null;
|
||||||
|
responseBuilder.ResponseMessage.BodyData = new BodyData
|
||||||
|
{
|
||||||
|
DetectedBodyType = BodyType.ProtoBuf,
|
||||||
|
BodyAsJson = value,
|
||||||
|
ProtoDefinition = () => responseBuilder.Mapping.ProtoDefinition ?? throw new WireMockException("ProtoDefinition cannot be resolved. You probably forgot to call .WithProtoDefinition(...) on the mapping."),
|
||||||
|
ProtoBufMessageType = messageType
|
||||||
|
};
|
||||||
|
|
||||||
|
return responseBuilder;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,18 +1,18 @@
|
|||||||
// Copyright © WireMock.Net
|
// Copyright © WireMock.Net
|
||||||
|
|
||||||
#if PROTOBUF
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using JsonConverter.Abstractions;
|
using JsonConverter.Abstractions;
|
||||||
using ProtoBufJsonConverter;
|
using ProtoBufJsonConverter;
|
||||||
using ProtoBufJsonConverter.Models;
|
using ProtoBufJsonConverter.Models;
|
||||||
|
using WireMock.ResponseBuilders;
|
||||||
|
|
||||||
namespace WireMock.Util;
|
namespace WireMock.Util;
|
||||||
|
|
||||||
internal static class ProtoBufUtils
|
internal class ProtoBufUtils : IProtoBufUtils
|
||||||
{
|
{
|
||||||
internal static async Task<byte[]> GetProtoBufMessageWithHeaderAsync(
|
public async Task<byte[]> GetProtoBufMessageWithHeaderAsync(
|
||||||
IReadOnlyList<string>? protoDefinitions,
|
IReadOnlyList<string>? protoDefinitions,
|
||||||
string? messageType,
|
string? messageType,
|
||||||
object? value,
|
object? value,
|
||||||
@@ -33,5 +33,15 @@ internal static class ProtoBufUtils
|
|||||||
.GetInstance()
|
.GetInstance()
|
||||||
.ConvertAsync(request, cancellationToken).ConfigureAwait(false);
|
.ConvertAsync(request, cancellationToken).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#endif
|
public IResponseBuilder UpdateResponseBuilder(IResponseBuilder responseBuilder, string protoBufMessageType, object bodyAsJson, params string[] protoDefinitions)
|
||||||
|
{
|
||||||
|
if (protoDefinitions.Length > 0)
|
||||||
|
{
|
||||||
|
return responseBuilder.WithBodyAsProtoBuf(protoDefinitions, protoBufMessageType, bodyAsJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProtoDefinition(s) is/are defined at Mapping/Server level
|
||||||
|
return responseBuilder.WithBodyAsProtoBuf(protoBufMessageType, bodyAsJson);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
// Copyright © WireMock.Net
|
// Copyright © WireMock.Net
|
||||||
|
|
||||||
#if PROTOBUF
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
@@ -9,14 +8,13 @@ using ProtoBufJsonConverter;
|
|||||||
using ProtoBufJsonConverter.Models;
|
using ProtoBufJsonConverter.Models;
|
||||||
using Stef.Validation;
|
using Stef.Validation;
|
||||||
using WireMock.Models;
|
using WireMock.Models;
|
||||||
using WireMock.Settings;
|
|
||||||
|
|
||||||
namespace WireMock.Util;
|
namespace WireMock.Util;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Some helper methods for Proto Definitions.
|
/// Some helper methods for Proto Definitions.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static class ProtoDefinitionHelper
|
internal static class ProtoDefinitionDataHelper
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Builds a dictionary of ProtoDefinitions from a directory.
|
/// Builds a dictionary of ProtoDefinitions from a directory.
|
||||||
@@ -42,7 +40,7 @@ public static class ProtoDefinitionHelper
|
|||||||
|
|
||||||
// Build comment and get content from file.
|
// Build comment and get content from file.
|
||||||
var comment = $"// {protoRelativePath}";
|
var comment = $"// {protoRelativePath}";
|
||||||
#if NETSTANDARD2_0
|
#if NETSTANDARD2_0 || NET462
|
||||||
var content = File.ReadAllText(filePath);
|
var content = File.ReadAllText(filePath);
|
||||||
#else
|
#else
|
||||||
var content = await File.ReadAllTextAsync(filePath, cancellationToken);
|
var content = await File.ReadAllTextAsync(filePath, cancellationToken);
|
||||||
@@ -79,23 +77,4 @@ public static class ProtoDefinitionHelper
|
|||||||
|
|
||||||
return new ProtoDefinitionData(fileNameMappedToProtoDefinition);
|
return new ProtoDefinitionData(fileNameMappedToProtoDefinition);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
internal static IdOrTexts GetIdOrTexts(WireMockServerSettings settings, params string[] protoDefinitionOrId)
|
|
||||||
{
|
|
||||||
switch (protoDefinitionOrId.Length)
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
var idOrText = protoDefinitionOrId[0];
|
|
||||||
if (settings.ProtoDefinitions?.TryGetValue(idOrText, out var protoDefinitions) == true)
|
|
||||||
{
|
|
||||||
return new(idOrText, protoDefinitions);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new(null, protoDefinitionOrId);
|
|
||||||
|
|
||||||
default:
|
|
||||||
return new(null, protoDefinitionOrId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
// Copyright © WireMock.Net
|
// Copyright © WireMock.Net
|
||||||
|
|
||||||
#if PROTOBUF
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics.CodeAnalysis;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
@@ -30,10 +29,10 @@ internal class WireMockProtoFileResolver : IProtoFileResolver
|
|||||||
|
|
||||||
foreach (var extraProtoDefinition in protoDefinitions)
|
foreach (var extraProtoDefinition in protoDefinitions)
|
||||||
{
|
{
|
||||||
var firstNonEmptyLine = extraProtoDefinition.Split(['\r', '\n']).FirstOrDefault(l => !string.IsNullOrEmpty(l));
|
var firstNonEmptyLine = extraProtoDefinition.Split('\r', '\n').FirstOrDefault(l => !string.IsNullOrEmpty(l));
|
||||||
if (firstNonEmptyLine != null)
|
if (firstNonEmptyLine != null)
|
||||||
{
|
{
|
||||||
if (TryGetValidPath(firstNonEmptyLine.TrimStart(['/', ' ']), out var validPath))
|
if (TryGetValidPath(firstNonEmptyLine.TrimStart('/', ' '), out var validPath))
|
||||||
{
|
{
|
||||||
_files.Add(validPath, extraProtoDefinition);
|
_files.Add(validPath, extraProtoDefinition);
|
||||||
}
|
}
|
||||||
@@ -71,5 +70,4 @@ internal class WireMockProtoFileResolver : IProtoFileResolver
|
|||||||
validPath = null;
|
validPath = null;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
37
src/WireMock.Net.ProtoBuf/WireMock.Net.ProtoBuf.csproj
Normal file
37
src/WireMock.Net.ProtoBuf/WireMock.Net.ProtoBuf.csproj
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<Version>1.10.1-preview-00</Version>
|
||||||
|
<Description>ProtoBuf and gRPC support for WireMock.Net</Description>
|
||||||
|
<AssemblyTitle>WireMock.Net.ProtoBuf</AssemblyTitle>
|
||||||
|
<Authors>Stef Heyenrath</Authors>
|
||||||
|
<TargetFrameworks>netstandard2.1;net462;net6.0;net8.0</TargetFrameworks>
|
||||||
|
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||||
|
<PackageTags>wiremock;matchers;matcher;protobuf;grpc</PackageTags>
|
||||||
|
<RootNamespace>WireMock</RootNamespace>
|
||||||
|
<ProjectGuid>{B47413AA-55D3-49A7-896A-17ADBFF72407}</ProjectGuid>
|
||||||
|
<PublishRepositoryUrl>true</PublishRepositoryUrl>
|
||||||
|
<EmbedUntrackedSources>true</EmbedUntrackedSources>
|
||||||
|
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||||
|
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
|
||||||
|
<CodeAnalysisRuleSet>../WireMock.Net/WireMock.Net.ruleset</CodeAnalysisRuleSet>
|
||||||
|
<SignAssembly>true</SignAssembly>
|
||||||
|
<AssemblyOriginatorKeyFile>../WireMock.Net/WireMock.Net.snk</AssemblyOriginatorKeyFile>
|
||||||
|
<!--<DelaySign>true</DelaySign>-->
|
||||||
|
<PublicSign Condition=" '$(OS)' != 'Windows_NT' ">true</PublicSign>
|
||||||
|
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||||
|
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="ProtoBufJsonConverter" Version="0.10.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\WireMock.Net.Shared\WireMock.Net.Shared.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -1,5 +1,8 @@
|
|||||||
// Copyright © WireMock.Net
|
// Copyright © WireMock.Net
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using WireMock.Models;
|
||||||
|
|
||||||
namespace WireMock.Matchers;
|
namespace WireMock.Matchers;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -7,4 +10,18 @@ namespace WireMock.Matchers;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IProtoBufMatcher : IDecodeBytesMatcher, IBytesMatcher
|
public interface IProtoBufMatcher : IDecodeBytesMatcher, IBytesMatcher
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The Func to define the proto definition as id or texts.
|
||||||
|
/// </summary>
|
||||||
|
Func<IdOrTexts> ProtoDefinition { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".
|
||||||
|
/// </summary>
|
||||||
|
string MessageType { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The Matcher to use (optional).
|
||||||
|
/// </summary>
|
||||||
|
IObjectMatcher? Matcher { get; }
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using WireMock.Models;
|
using WireMock.Models;
|
||||||
|
using WireMock.Util;
|
||||||
|
|
||||||
namespace WireMock.Matchers.Request;
|
namespace WireMock.Matchers.Request;
|
||||||
|
|
||||||
@@ -24,11 +25,7 @@ public class RequestMessageProtoBufMatcher : IRequestMatcher
|
|||||||
/// <param name="matcher">The optional matcher to use to match the ProtoBuf as (json) object.</param>
|
/// <param name="matcher">The optional matcher to use to match the ProtoBuf as (json) object.</param>
|
||||||
public RequestMessageProtoBufMatcher(MatchBehaviour matchBehaviour, Func<IdOrTexts> protoDefinition, string messageType, IObjectMatcher? matcher = null)
|
public RequestMessageProtoBufMatcher(MatchBehaviour matchBehaviour, Func<IdOrTexts> protoDefinition, string messageType, IObjectMatcher? matcher = null)
|
||||||
{
|
{
|
||||||
#if PROTOBUF
|
Matcher = TypeLoader.LoadNewInstance<IProtoBufMatcher>(protoDefinition, messageType, matchBehaviour, matcher);
|
||||||
Matcher = new ProtoBufMatcher(protoDefinition, messageType, matchBehaviour, matcher);
|
|
||||||
#else
|
|
||||||
throw new System.NotSupportedException("The ProtoBufMatcher can not be used for .NETStandard1.3 or .NET Framework 4.6.1 or lower.");
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
@@ -5,6 +5,7 @@ using System.Runtime.CompilerServices;
|
|||||||
[assembly: InternalsVisibleTo("WireMock.Net.Minimal, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")]
|
[assembly: InternalsVisibleTo("WireMock.Net.Minimal, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")]
|
||||||
[assembly: InternalsVisibleTo("WireMock.Net.MimePart, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")]
|
[assembly: InternalsVisibleTo("WireMock.Net.MimePart, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")]
|
||||||
[assembly: InternalsVisibleTo("WireMock.Net.GraphQL, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")]
|
[assembly: InternalsVisibleTo("WireMock.Net.GraphQL, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")]
|
||||||
|
[assembly: InternalsVisibleTo("WireMock.Net.ProtoBuf, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")]
|
||||||
[assembly: InternalsVisibleTo("WireMock.Net.Matchers.CSharpCode, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")]
|
[assembly: InternalsVisibleTo("WireMock.Net.Matchers.CSharpCode, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")]
|
||||||
// [assembly: InternalsVisibleTo("WireMock.Net.StandAlone, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")]
|
// [assembly: InternalsVisibleTo("WireMock.Net.StandAlone, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")]
|
||||||
[assembly: InternalsVisibleTo("WireMock.Net.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")]
|
[assembly: InternalsVisibleTo("WireMock.Net.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")]
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ namespace WireMock.RequestBuilders;
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The BodyRequestBuilder interface.
|
/// The BodyRequestBuilder interface.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IBodyRequestBuilder : IProtoBufRequestBuilder
|
public interface IBodyRequestBuilder : IMultiPartRequestBuilder
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// WithBody: IMatcher
|
/// WithBody: IMatcher
|
||||||
|
|||||||
@@ -1,67 +0,0 @@
|
|||||||
// Copyright © WireMock.Net
|
|
||||||
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using WireMock.Matchers;
|
|
||||||
|
|
||||||
namespace WireMock.RequestBuilders;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The ProtoBufRequestBuilder interface.
|
|
||||||
/// </summary>
|
|
||||||
public interface IProtoBufRequestBuilder : IMultiPartRequestBuilder
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// WithBodyAsProtoBuf
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="protoDefinition">The proto definition as text.</param>
|
|
||||||
/// <param name="messageType">The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".</param>
|
|
||||||
/// <param name="matchBehaviour">The match behaviour. (default = "AcceptOnMatch")</param>
|
|
||||||
/// <returns>The <see cref="IRequestBuilder"/>.</returns>
|
|
||||||
IRequestBuilder WithBodyAsProtoBuf(string protoDefinition, string messageType, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// WithBodyAsProtoBuf
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="protoDefinition">The proto definition as text.</param>
|
|
||||||
/// <param name="messageType">The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".</param>
|
|
||||||
/// <param name="matcher">The matcher to use to match the ProtoBuf as (json) object.</param>
|
|
||||||
/// <param name="matchBehaviour">The match behaviour. (default = "AcceptOnMatch")</param>
|
|
||||||
/// <returns>The <see cref="IRequestBuilder"/>.</returns>
|
|
||||||
IRequestBuilder WithBodyAsProtoBuf(string protoDefinition, string messageType, IObjectMatcher matcher, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// WithBodyAsProtoBuf
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="protoDefinitions">The proto definitions as text.</param>
|
|
||||||
/// <param name="messageType">The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".</param>
|
|
||||||
/// <param name="matchBehaviour">The match behaviour. (default = "AcceptOnMatch")</param>
|
|
||||||
/// <returns>The <see cref="IRequestBuilder"/>.</returns>
|
|
||||||
IRequestBuilder WithBodyAsProtoBuf(IReadOnlyList<string> protoDefinitions, string messageType, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// WithBodyAsProtoBuf
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="protoDefinitions">The proto definitions as text.</param>
|
|
||||||
/// <param name="messageType">The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".</param>
|
|
||||||
/// <param name="matcher">The matcher to use to match the ProtoBuf as (json) object.</param>
|
|
||||||
/// <param name="matchBehaviour">The match behaviour. (default = "AcceptOnMatch")</param>
|
|
||||||
/// <returns>The <see cref="IRequestBuilder"/>.</returns>
|
|
||||||
IRequestBuilder WithBodyAsProtoBuf(IReadOnlyList<string> protoDefinitions, string messageType, IObjectMatcher matcher, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// WithBodyAsProtoBuf
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="messageType">The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".</param>
|
|
||||||
/// <param name="matchBehaviour">The match behaviour. (default = "AcceptOnMatch")</param>
|
|
||||||
/// <returns>The <see cref="IRequestBuilder"/>.</returns>
|
|
||||||
IRequestBuilder WithBodyAsProtoBuf(string messageType, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// WithBodyAsProtoBuf
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="messageType">The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".</param>
|
|
||||||
/// <param name="matcher">The matcher to use to match the ProtoBuf as (json) object.</param>
|
|
||||||
/// <param name="matchBehaviour">The match behaviour. (default = "AcceptOnMatch")</param>
|
|
||||||
/// <returns>The <see cref="IRequestBuilder"/>.</returns>
|
|
||||||
IRequestBuilder WithBodyAsProtoBuf(string messageType, IObjectMatcher matcher, MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch);
|
|
||||||
}
|
|
||||||
@@ -9,5 +9,16 @@ namespace WireMock.RequestBuilders;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IRequestBuilder : IClientIPRequestBuilder
|
public interface IRequestBuilder : IClientIPRequestBuilder
|
||||||
{
|
{
|
||||||
public IRequestBuilder Add<T>(T requestMatcher) where T : IRequestMatcher;
|
/// <summary>
|
||||||
|
/// Adds a request matcher to the builder.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">The type of the request matcher.</typeparam>
|
||||||
|
/// <param name="requestMatcher">The request matcher to add.</param>
|
||||||
|
/// <returns>The current <see cref="IRequestBuilder"/> instance.</returns>
|
||||||
|
IRequestBuilder Add<T>(T requestMatcher) where T : IRequestMatcher;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The link back to the Mapping.
|
||||||
|
/// </summary>
|
||||||
|
IMapping Mapping { get; set; }
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
// Copyright © WireMock.Net
|
// Copyright © WireMock.Net
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using JsonConverter.Abstractions;
|
using JsonConverter.Abstractions;
|
||||||
@@ -84,7 +83,7 @@ public interface IBodyResponseBuilder : IFaultResponseBuilder
|
|||||||
IResponseBuilder WithBodyAsJson(Func<IRequestMessage, object> bodyFactory, Encoding? encoding = null);
|
IResponseBuilder WithBodyAsJson(Func<IRequestMessage, object> bodyFactory, Encoding? encoding = null);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// WithBodyAsJson : Create a ... response based on a async callback function.
|
/// WithBodyAsJson : Create a ... response based on an async callback function.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="bodyFactory">The async delegate to build the body.</param>
|
/// <param name="bodyFactory">The async delegate to build the body.</param>
|
||||||
/// <param name="encoding">The body encoding.</param>
|
/// <param name="encoding">The body encoding.</param>
|
||||||
@@ -117,53 +116,4 @@ public interface IBodyResponseBuilder : IFaultResponseBuilder
|
|||||||
/// <param name="options">The <see cref="JsonConverterOptions"/> [optional].</param>
|
/// <param name="options">The <see cref="JsonConverterOptions"/> [optional].</param>
|
||||||
/// <returns>A <see cref="IResponseBuilder"/>.</returns>
|
/// <returns>A <see cref="IResponseBuilder"/>.</returns>
|
||||||
IResponseBuilder WithBody(object body, Encoding? encoding, IJsonConverter jsonConverter, JsonConverterOptions? options = null);
|
IResponseBuilder WithBody(object body, Encoding? encoding, IJsonConverter jsonConverter, JsonConverterOptions? options = null);
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// WithBodyAsProtoBuf : Create a ProtoBuf byte[] response based on a proto definition, message type and the value.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="protoDefinition">The proto definition as text.</param>
|
|
||||||
/// <param name="messageType">The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".</param>
|
|
||||||
/// <param name="value">The object to convert to protobuf byte[].</param>
|
|
||||||
/// <param name="jsonConverter">The <see cref="IJsonConverter"/> [optional]. Default value is NewtonsoftJsonConverter.</param>
|
|
||||||
/// <param name="options">The <see cref="JsonConverterOptions"/> [optional].</param>
|
|
||||||
/// <returns>A <see cref="IResponseBuilder"/>.</returns>
|
|
||||||
IResponseBuilder WithBodyAsProtoBuf(
|
|
||||||
string protoDefinition,
|
|
||||||
string messageType,
|
|
||||||
object value,
|
|
||||||
IJsonConverter? jsonConverter = null,
|
|
||||||
JsonConverterOptions? options = null
|
|
||||||
);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// WithBodyAsProtoBuf : Create a ProtoBuf byte[] response based on proto definitions, message type and the value.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="protoDefinitions">The proto definition as text.</param>
|
|
||||||
/// <param name="messageType">The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".</param>
|
|
||||||
/// <param name="value">The object to convert to protobuf byte[].</param>
|
|
||||||
/// <param name="jsonConverter">The <see cref="IJsonConverter"/> [optional]. Default value is NewtonsoftJsonConverter.</param>
|
|
||||||
/// <param name="options">The <see cref="JsonConverterOptions"/> [optional].</param>
|
|
||||||
/// <returns>A <see cref="IResponseBuilder"/>.</returns>
|
|
||||||
IResponseBuilder WithBodyAsProtoBuf(
|
|
||||||
IReadOnlyList<string> protoDefinitions,
|
|
||||||
string messageType,
|
|
||||||
object value,
|
|
||||||
IJsonConverter? jsonConverter = null,
|
|
||||||
JsonConverterOptions? options = null
|
|
||||||
);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// WithBodyAsProtoBuf : Create a ProtoBuf byte[] response based on a proto definition, message type and the value.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="messageType">The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".</param>
|
|
||||||
/// <param name="value">The object to convert to protobuf byte[].</param>
|
|
||||||
/// <param name="jsonConverter">The <see cref="IJsonConverter"/> [optional]. Default value is NewtonsoftJsonConverter.</param>
|
|
||||||
/// <param name="options">The <see cref="JsonConverterOptions"/> [optional].</param>
|
|
||||||
/// <returns>A <see cref="IResponseBuilder"/>.</returns>
|
|
||||||
IResponseBuilder WithBodyAsProtoBuf(
|
|
||||||
string messageType,
|
|
||||||
object value,
|
|
||||||
IJsonConverter? jsonConverter = null,
|
|
||||||
JsonConverterOptions? options = null
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
@@ -17,12 +17,12 @@ public interface ICallbackResponseBuilder : IResponseProvider
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>The <see cref="IResponseBuilder"/>.</returns>
|
/// <returns>The <see cref="IResponseBuilder"/>.</returns>
|
||||||
[PublicAPI]
|
[PublicAPI]
|
||||||
IResponseBuilder WithCallback(Func<IRequestMessage, ResponseMessage> callbackHandler);
|
IResponseBuilder WithCallback(Func<IRequestMessage, IResponseMessage> callbackHandler);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The async callback builder
|
/// The async callback builder
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>The <see cref="IResponseBuilder"/>.</returns>
|
/// <returns>The <see cref="IResponseBuilder"/>.</returns>
|
||||||
[PublicAPI]
|
[PublicAPI]
|
||||||
IResponseBuilder WithCallback(Func<IRequestMessage, Task<ResponseMessage>> callbackHandler);
|
IResponseBuilder WithCallback(Func<IRequestMessage, Task<IResponseMessage>> callbackHandler);
|
||||||
}
|
}
|
||||||
19
src/WireMock.Net.Shared/ResponseBuilders/IResponseBuilder.cs
Normal file
19
src/WireMock.Net.Shared/ResponseBuilders/IResponseBuilder.cs
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
// Copyright © WireMock.Net
|
||||||
|
|
||||||
|
namespace WireMock.ResponseBuilders;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The ResponseBuilder interface.
|
||||||
|
/// </summary>
|
||||||
|
public interface IResponseBuilder : IProxyResponseBuilder
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The link back to the mapping.
|
||||||
|
/// </summary>
|
||||||
|
IMapping Mapping { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the response message.
|
||||||
|
/// </summary>
|
||||||
|
IResponseMessage ResponseMessage { get; }
|
||||||
|
}
|
||||||
@@ -18,6 +18,6 @@ public interface IResponseProvider
|
|||||||
/// <param name="mapping">The used mapping.</param>
|
/// <param name="mapping">The used mapping.</param>
|
||||||
/// <param name="requestMessage">The request.</param>
|
/// <param name="requestMessage">The request.</param>
|
||||||
/// <param name="settings">The WireMockServerSettings.</param>
|
/// <param name="settings">The WireMockServerSettings.</param>
|
||||||
/// <returns>The <see cref="ResponseMessage"/> including a new (optional) <see cref="IMapping"/>.</returns>
|
/// <returns>The <see cref="IResponseMessage"/> including a new (optional) <see cref="IMapping"/>.</returns>
|
||||||
Task<(IResponseMessage Message, IMapping? Mapping)> ProvideResponseAsync(IMapping mapping, IRequestMessage requestMessage, WireMockServerSettings settings);
|
Task<(IResponseMessage Message, IMapping? Mapping)> ProvideResponseAsync(IMapping mapping, IRequestMessage requestMessage, WireMockServerSettings settings);
|
||||||
}
|
}
|
||||||
@@ -14,6 +14,7 @@ using WireMock.RegularExpressions;
|
|||||||
using WireMock.Types;
|
using WireMock.Types;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using WireMock.Models;
|
using WireMock.Models;
|
||||||
|
|
||||||
#if USE_ASPNETCORE
|
#if USE_ASPNETCORE
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
#endif
|
#endif
|
||||||
19
src/WireMock.Net.Shared/Util/IProtoBufUtils.cs
Normal file
19
src/WireMock.Net.Shared/Util/IProtoBufUtils.cs
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
// Copyright © WireMock.Net
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using JsonConverter.Abstractions;
|
||||||
|
using WireMock.ResponseBuilders;
|
||||||
|
|
||||||
|
namespace WireMock.Util;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Defines the interface for ProtoBufUtils.
|
||||||
|
/// </summary>
|
||||||
|
public interface IProtoBufUtils
|
||||||
|
{
|
||||||
|
Task<byte[]> GetProtoBufMessageWithHeaderAsync(IReadOnlyList<string>? protoDefinitions, string? messageType, object? value, IJsonConverter? jsonConverter = null, CancellationToken cancellationToken = default);
|
||||||
|
|
||||||
|
IResponseBuilder UpdateResponseBuilder(IResponseBuilder responseBuilder, string protoBufMessageType, object bodyAsJson, params string[] protoDefinitions);
|
||||||
|
}
|
||||||
30
src/WireMock.Net.Shared/Util/ProtoDefinitionUtils.cs
Normal file
30
src/WireMock.Net.Shared/Util/ProtoDefinitionUtils.cs
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
// Copyright © WireMock.Net
|
||||||
|
|
||||||
|
using WireMock.Models;
|
||||||
|
using WireMock.Settings;
|
||||||
|
|
||||||
|
namespace WireMock.Util;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Some helper methods for Proto Definitions.
|
||||||
|
/// </summary>
|
||||||
|
public static class ProtoDefinitionUtils
|
||||||
|
{
|
||||||
|
internal static IdOrTexts GetIdOrTexts(WireMockServerSettings settings, params string[] protoDefinitionOrId)
|
||||||
|
{
|
||||||
|
switch (protoDefinitionOrId.Length)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
var idOrText = protoDefinitionOrId[0];
|
||||||
|
if (settings.ProtoDefinitions?.TryGetValue(idOrText, out var protoDefinitions) == true)
|
||||||
|
{
|
||||||
|
return new(idOrText, protoDefinitions);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new(null, protoDefinitionOrId);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return new(null, protoDefinitionOrId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -29,6 +29,18 @@
|
|||||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup Condition="'$(TargetFramework)' == 'netstandard1.3' or '$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1'">
|
||||||
|
<DefineConstants>$(DefineConstants);NETSTANDARD;USE_ASPNETCORE</DefineConstants>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup Condition="'$(TargetFramework)' == 'netcoreapp2.1' or '$(TargetFramework)' == 'netcoreapp2.2' or '$(TargetFramework)' == 'netcoreapp3.1' or '$(TargetFramework)' == 'net5.0' or '$(TargetFramework)' == 'net6.0' or '$(TargetFramework)' == 'net7.0' or '$(TargetFramework)' == 'net8.0'">
|
||||||
|
<DefineConstants>$(DefineConstants);USE_ASPNETCORE</DefineConstants>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup Condition="'$(TargetFramework)' == 'net461'">
|
||||||
|
<DefineConstants>$(DefineConstants);USE_ASPNETCORE;NET46</DefineConstants>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="PolySharp" Version="1.15.0">
|
<PackageReference Include="PolySharp" Version="1.15.0">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
@@ -37,6 +49,18 @@
|
|||||||
<PackageReference Include="Stef.Validation" Version="0.1.1" />
|
<PackageReference Include="Stef.Validation" Version="0.1.1" />
|
||||||
<PackageReference Include="AnyOf" Version="0.4.0" />
|
<PackageReference Include="AnyOf" Version="0.4.0" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="1.1.0" />
|
||||||
|
<PackageReference Include="JsonConverter.Abstractions" Version="0.7.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Handlebars.Net.Helpers" Version="2.5.2" />
|
||||||
|
<!--<PackageReference Include="Handlebars.Net.Helpers.DynamicLinq" Version="2.5.2" />-->
|
||||||
|
<PackageReference Include="Handlebars.Net.Helpers.Humanizer" Version="2.5.2" />
|
||||||
|
<PackageReference Include="Handlebars.Net.Helpers.Json" Version="2.5.2" />
|
||||||
|
<PackageReference Include="Handlebars.Net.Helpers.Random" Version="2.5.2" />
|
||||||
|
<PackageReference Include="Handlebars.Net.Helpers.Xeger" Version="2.5.2" />
|
||||||
|
<PackageReference Include="Handlebars.Net.Helpers.XPath" Version="2.5.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.3' ">
|
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.3' ">
|
||||||
|
|||||||
@@ -35,5 +35,6 @@
|
|||||||
<ItemGroup Condition="'$(TargetFramework)' != 'netstandard1.3' and '$(TargetFramework)' != 'net451' and '$(TargetFramework)' != 'net452' and '$(TargetFramework)' != 'net46' and '$(TargetFramework)' != 'net461'">
|
<ItemGroup Condition="'$(TargetFramework)' != 'netstandard1.3' and '$(TargetFramework)' != 'net451' and '$(TargetFramework)' != 'net452' and '$(TargetFramework)' != 'net46' and '$(TargetFramework)' != 'net461'">
|
||||||
<ProjectReference Include="../WireMock.Net.MimePart/WireMock.Net.MimePart.csproj" />
|
<ProjectReference Include="../WireMock.Net.MimePart/WireMock.Net.MimePart.csproj" />
|
||||||
<ProjectReference Include="../WireMock.Net.GraphQL/WireMock.Net.GraphQL.csproj" />
|
<ProjectReference Include="../WireMock.Net.GraphQL/WireMock.Net.GraphQL.csproj" />
|
||||||
|
<ProjectReference Include="../WireMock.Net.ProtoBuf/WireMock.Net.ProtoBuf.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -12,6 +12,8 @@ namespace WireMock.Net.Tests.Grpc;
|
|||||||
|
|
||||||
public class ProtoBufUtilsTests
|
public class ProtoBufUtilsTests
|
||||||
{
|
{
|
||||||
|
private static readonly IProtoBufUtils ProtoBufUtils = new ProtoBufUtils();
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task GetProtoBufMessageWithHeader_MultipleProtoFiles()
|
public async Task GetProtoBufMessageWithHeader_MultipleProtoFiles()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ namespace WireMock.Net.Tests.Grpc;
|
|||||||
|
|
||||||
public class ProtoDefinitionHelperTests
|
public class ProtoDefinitionHelperTests
|
||||||
{
|
{
|
||||||
|
private static readonly IProtoBufUtils ProtoBufUtils = new ProtoBufUtils();
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task FromDirectory_Greet_ShouldReturnModifiedProtoFiles()
|
public async Task FromDirectory_Greet_ShouldReturnModifiedProtoFiles()
|
||||||
{
|
{
|
||||||
@@ -21,7 +23,7 @@ public class ProtoDefinitionHelperTests
|
|||||||
var expectedComment = $"// {expectedFilename}";
|
var expectedComment = $"// {expectedFilename}";
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var protoDefinitionData = await ProtoDefinitionHelper.FromDirectory(directory);
|
var protoDefinitionData = await ProtoDefinitionDataHelper.FromDirectory(directory);
|
||||||
var protoDefinitions = protoDefinitionData.ToList("greet");
|
var protoDefinitions = protoDefinitionData.ToList("greet");
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
@@ -50,7 +52,7 @@ public class ProtoDefinitionHelperTests
|
|||||||
var directory = Path.Combine(Directory.GetCurrentDirectory(), "Grpc", "ot");
|
var directory = Path.Combine(Directory.GetCurrentDirectory(), "Grpc", "ot");
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var protoDefinitionData = await ProtoDefinitionHelper.FromDirectory(directory);
|
var protoDefinitionData = await ProtoDefinitionDataHelper.FromDirectory(directory);
|
||||||
var protoDefinitions = protoDefinitionData.ToList("trace_service");
|
var protoDefinitions = protoDefinitionData.ToList("trace_service");
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|||||||
Reference in New Issue
Block a user