mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-04-22 08:48:46 +02:00
Add Grpc ProtoBuf support (request-response) (#1047)
* ProtoBuf
* .
* x
* ---
* x
* fx
* ...
* sc
* ...
* .
* groen
* x
* fix tests
* ok!?
* fix tests
* fix tests
* !
* x
* 6
* .
* x
* ivaluematcher
* transformer
* .
* sc
* .
* mapping
* x
* tra
* com
* ...
* .
* .
* .
* AddProtoDefinition
* .
* set
* grpahj
* .
* .
* IdOrText
* ...
* async
* async2
* .
* t
* nuget
* <PackageReference Include="ProtoBufJsonConverter" Version="0.2.0-preview-04" />
* http version
* tests
* .WithHttpVersion("2")
* <PackageReference Include="ProtoBufJsonConverter" Version="0.2.0" />
* HttpVersionParser
This commit is contained in:
@@ -98,4 +98,9 @@ public class MappingModel
|
||||
/// The probability when this request should be matched. Value is between 0 and 1. [Optional]
|
||||
/// </summary>
|
||||
public double? Probability { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The Grpc ProtoDefinition which is used for this mapping (request and response). [Optional]
|
||||
/// </summary>
|
||||
public string? ProtoDefinition { get; set; }
|
||||
}
|
||||
@@ -70,13 +70,22 @@ public class MatcherModel
|
||||
/// ContentTransferEncoding Matcher (base64)
|
||||
/// </summary>
|
||||
public MatcherModel? ContentTransferEncodingMatcher { get; set; }
|
||||
#endregion
|
||||
|
||||
#region MimePartMatcher + ProtoBufMatcher
|
||||
/// <summary>
|
||||
/// Content Matcher
|
||||
/// </summary>
|
||||
public MatcherModel? ContentMatcher { get; set; }
|
||||
#endregion
|
||||
|
||||
#region ProtoBufMatcher
|
||||
/// <summary>
|
||||
/// The full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".
|
||||
/// </summary>
|
||||
public string? ProtoBufMessageType { get; set; }
|
||||
#endregion
|
||||
|
||||
#region XPathMatcher
|
||||
/// <summary>
|
||||
/// Array of namespace prefix and uri. (optional)
|
||||
@@ -86,7 +95,7 @@ public class MatcherModel
|
||||
|
||||
#region GraphQLMatcher
|
||||
/// <summary>
|
||||
/// Mapping of custom GraphQL Scalar name to ClrType. (optional)
|
||||
/// Mapping of custom GraphQL Scalar name to ClrType. (optional)
|
||||
/// </summary>
|
||||
public IDictionary<string, Type>? CustomScalars { get; set; }
|
||||
#endregion
|
||||
|
||||
@@ -28,6 +28,11 @@ public class RequestModel
|
||||
/// </summary>
|
||||
public string[]? Methods { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The HTTP Version
|
||||
/// </summary>
|
||||
public string? HttpVersion { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reject on match for Methods.
|
||||
/// </summary>
|
||||
|
||||
@@ -35,7 +35,7 @@ public class ResponseModel
|
||||
public bool? BodyAsJsonIndented { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the body (as bytearray).
|
||||
/// Gets or sets the body (as byte array).
|
||||
/// </summary>
|
||||
public byte[]? BodyAsBytes { get; set; }
|
||||
|
||||
@@ -84,6 +84,11 @@ public class ResponseModel
|
||||
/// </summary>
|
||||
public string? HeadersRaw { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the Trailing Headers.
|
||||
/// </summary>
|
||||
public IDictionary<string, object>? TrailingHeaders { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the delay in milliseconds.
|
||||
/// </summary>
|
||||
@@ -123,4 +128,16 @@ public class ResponseModel
|
||||
/// Gets or sets the WebProxy settings.
|
||||
/// </summary>
|
||||
public WebProxyModel? WebProxy { get; set; }
|
||||
|
||||
#region ProtoBuf
|
||||
/// <summary>
|
||||
/// Gets or sets the proto definition.
|
||||
/// </summary>
|
||||
public string? ProtoDefinition { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".
|
||||
/// </summary>
|
||||
public string? ProtoBufMessageType { get; set; }
|
||||
#endregion
|
||||
}
|
||||
@@ -55,6 +55,11 @@ public class LogRequestModel
|
||||
/// </summary>
|
||||
public string Method { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The HTTP Version.
|
||||
/// </summary>
|
||||
public string HttpVersion { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// The Headers.
|
||||
/// </summary>
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Text.RegularExpressions;
|
||||
using JetBrains.Annotations;
|
||||
using WireMock.Handlers;
|
||||
using WireMock.Types;
|
||||
|
||||
@@ -114,6 +116,11 @@ public class SettingsModel
|
||||
/// </summary>
|
||||
public QueryParameterMultipleValueSupport? QueryParameterMultipleValueSupport { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// A list of Grpc ProtoDefinitions which can be used.
|
||||
/// </summary>
|
||||
public Dictionary<string, string>? ProtoDefinitions { get; set; }
|
||||
|
||||
#if NETSTANDARD1_3_OR_GREATER || NET461
|
||||
/// <summary>
|
||||
/// Server client certificate mode
|
||||
|
||||
@@ -63,6 +63,11 @@ public interface IRequestMessage
|
||||
/// </summary>
|
||||
string Method { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the HTTP Version.
|
||||
/// </summary>
|
||||
string HttpVersion { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the headers.
|
||||
/// </summary>
|
||||
@@ -94,23 +99,27 @@ public interface IRequestMessage
|
||||
IBodyData? BodyData { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The original body as string. Convenience getter for Handlebars and WireMockAssertions.
|
||||
/// The original body as string.
|
||||
/// Convenience getter for Handlebars and WireMockAssertions.
|
||||
/// </summary>
|
||||
string? Body { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The body (as JSON object). Convenience getter for Handlebars and WireMockAssertions.
|
||||
/// The body (as JSON object).
|
||||
/// Convenience getter for Handlebars and WireMockAssertions.
|
||||
/// </summary>
|
||||
object? BodyAsJson { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The body (as bytearray). Convenience getter for Handlebars and WireMockAssertions.
|
||||
/// The body (as bytearray).
|
||||
/// Convenience getter for Handlebars and WireMockAssertions.
|
||||
/// </summary>
|
||||
byte[]? BodyAsBytes { get; }
|
||||
|
||||
#if MIMEKIT
|
||||
/// <summary>
|
||||
/// The original body as MimeMessage. Convenience getter for Handlebars and WireMockAssertions.
|
||||
/// The original body as MimeMessage.
|
||||
/// Convenience getter for Handlebars and WireMockAssertions.
|
||||
/// </summary>
|
||||
object? BodyAsMimeMessage { get; }
|
||||
#endif
|
||||
|
||||
@@ -40,11 +40,16 @@ public interface IResponseMessage
|
||||
/// </summary>
|
||||
IDictionary<string, WireMockList<string>>? Headers { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the trailing headers.
|
||||
/// </summary>
|
||||
IDictionary<string, WireMockList<string>>? TrailingHeaders { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the status code.
|
||||
/// </summary>
|
||||
object? StatusCode { get; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Adds the header.
|
||||
/// </summary>
|
||||
@@ -53,9 +58,23 @@ public interface IResponseMessage
|
||||
void AddHeader(string name, string value);
|
||||
|
||||
/// <summary>
|
||||
/// Adds the header.
|
||||
/// Adds the trailing header.
|
||||
/// </summary>
|
||||
/// <param name="name">The name.</param>
|
||||
/// <param name="values">The values.</param>
|
||||
void AddHeader(string name, params string[] values);
|
||||
|
||||
/// <summary>
|
||||
/// Adds the trailing header.
|
||||
/// </summary>
|
||||
/// <param name="name">The name.</param>
|
||||
/// <param name="value">The value.</param>
|
||||
void AddTrailingHeader(string name, string value);
|
||||
|
||||
/// <summary>
|
||||
/// Adds the header.
|
||||
/// </summary>
|
||||
/// <param name="name">The name.</param>
|
||||
/// <param name="values">The values.</param>
|
||||
void AddTrailingHeader(string name, params string[] values);
|
||||
}
|
||||
@@ -1,7 +1,10 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using WireMock.Models;
|
||||
using WireMock.Types;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace WireMock.Util;
|
||||
|
||||
/// <summary>
|
||||
@@ -10,7 +13,7 @@ namespace WireMock.Util;
|
||||
public interface IBodyData
|
||||
{
|
||||
/// <summary>
|
||||
/// The body (as bytearray).
|
||||
/// The body (as byte array).
|
||||
/// </summary>
|
||||
byte[]? BodyAsBytes { get; set; }
|
||||
|
||||
@@ -26,6 +29,7 @@ public interface IBodyData
|
||||
|
||||
/// <summary>
|
||||
/// The body (as JSON object).
|
||||
/// Also used for ProtoBuf.
|
||||
/// </summary>
|
||||
object? BodyAsJson { get; set; }
|
||||
|
||||
@@ -68,4 +72,16 @@ public interface IBodyData
|
||||
/// Defines if this BodyData is the result of a dynamically created response-string. (
|
||||
/// </summary>
|
||||
public string? IsFuncUsed { get; set; }
|
||||
|
||||
#region ProtoBuf
|
||||
/// <summary>
|
||||
/// Gets or sets the proto definition.
|
||||
/// </summary>
|
||||
public Func<IdOrText>? ProtoDefinition { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the full type of the protobuf (request/response) message object. Format is "{package-name}.{type-name}".
|
||||
/// </summary>
|
||||
public string? ProtoBufMessageType { get; set; }
|
||||
#endregion
|
||||
}
|
||||
33
src/WireMock.Net.Abstractions/Models/IdOrText.cs
Normal file
33
src/WireMock.Net.Abstractions/Models/IdOrText.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
namespace WireMock.Models;
|
||||
|
||||
/// <summary>
|
||||
/// A structure defining an (optional) Id and a Text.
|
||||
/// </summary>
|
||||
public readonly struct IdOrText
|
||||
{
|
||||
/// <summary>
|
||||
/// The Id [optional].
|
||||
/// </summary>
|
||||
public string? Id { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The Text.
|
||||
/// </summary>
|
||||
public string Text { get; }
|
||||
|
||||
/// <summary>
|
||||
/// When Id is defined, return the Id, else the Text.
|
||||
/// </summary>
|
||||
public string Value => Id ?? Text;
|
||||
|
||||
/// <summary>
|
||||
/// Create a IdOrText
|
||||
/// </summary>
|
||||
/// <param name="id">The Id [optional]</param>
|
||||
/// <param name="text">The Text.</param>
|
||||
public IdOrText(string? id, string text)
|
||||
{
|
||||
Id = id;
|
||||
Text = text;
|
||||
}
|
||||
}
|
||||
@@ -38,5 +38,10 @@ public enum BodyType
|
||||
/// <summary>
|
||||
/// Body is a String which is x-www-form-urlencoded.
|
||||
/// </summary>
|
||||
FormUrlEncoded
|
||||
FormUrlEncoded,
|
||||
|
||||
/// <summary>
|
||||
/// Body is a ProtoBuf Byte array
|
||||
/// </summary>
|
||||
ProtoBuf
|
||||
}
|
||||
@@ -31,7 +31,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1'">
|
||||
<DefineConstants>$(DefineConstants);GRAPHQL;MIMEKIT</DefineConstants>
|
||||
<DefineConstants>$(DefineConstants);GRAPHQL;MIMEKIT;PROTOBUF</DefineConstants>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
Reference in New Issue
Block a user