Version 2.x (#1359)

* Version 2.x

* Setup .NET 9

* 12

* cleanup some #if for NETSTANDARD1_3

* cleanup + fix tests for net8

* openapi

* NO ConfigureAwait(false) + cleanup

* .

* #endif

* HashSet

* WireMock.Net.NUnit

* HttpContext

* Add WebSockets (#1423)

* Add WebSockets

* Add tests

* fix

* more tests

* Add tests

* ...

* remove IOwin

* -

* tests

* fluent

* ok

* match

* .

* byte[]

* x

* func

* func

* byte

* trans

* ...

* frameworks.........

* jmes

* xxx

* sc

* using var httpClient = new HttpClient();

* usings

* maxRetries

* up

* xunit v3

* ct

* ---

* ct

* ct2

* T Unit

* WireMock.Net.TUnitTests / 10

* t unit first

* --project

* no tunit

* t2

* --project

* --project

* ci -  --project

* publish ./test/wiremock-coverage.xml

* windows

* .

* log

* ...

* log

* goed

* BodyType

* .

* .

* --scenario

* ...

* pact

* ct

* .

* WireMock.Net.RestClient.AwesomeAssertions (#1427)

* WireMock.Net.RestClient.AwesomeAssertions

* ok

* atpath

* fix test

* sonar fixes

* ports

* proxy test

* FIX?

* ---

* await Task.Delay(100, _ct);

* ?

* --project

* Aspire: use IDistributedApplicationEventingSubscriber (#1428)

* broadcast

* ok

* more tsts

* .

* Collection

* up

* .

* 2

* remove nfluent

* <VersionPrefix>2.0.0-preview-02</VersionPrefix>

* ...

* .

* nuget icon

* .

* <PackageReference Include="JmesPath.Net" Version="1.1.0" />

* x

* 500

* .

* fix some warnings

* ws
This commit is contained in:
Stef Heyenrath
2026-03-11 17:02:47 +01:00
committed by GitHub
parent d6e19532bc
commit a292f28dda
521 changed files with 79740 additions and 5246 deletions

View File

@@ -1,7 +1,5 @@
// Copyright © WireMock.Net
using System.Collections.Generic;
namespace WireMock.Admin.Mappings;
/// <summary>

View File

@@ -1,26 +1,25 @@
// Copyright © WireMock.Net
namespace WireMock.Admin.Mappings
namespace WireMock.Admin.Mappings;
/// <summary>
/// EncodingModel
/// </summary>
[FluentBuilder.AutoGenerateBuilder]
public class EncodingModel
{
/// <summary>
/// EncodingModel
/// Encoding CodePage
/// </summary>
[FluentBuilder.AutoGenerateBuilder]
public class EncodingModel
{
/// <summary>
/// Encoding CodePage
/// </summary>
public int CodePage { get; set; }
public int CodePage { get; set; }
/// <summary>
/// Encoding EncodingName
/// </summary>
public string EncodingName { get; set; }
/// <summary>
/// Encoding EncodingName
/// </summary>
public required string EncodingName { get; set; }
/// <summary>
/// Encoding WebName
/// </summary>
public string WebName { get; set; }
}
/// <summary>
/// Encoding WebName
/// </summary>
public required string WebName { get; set; }
}

View File

@@ -1,7 +1,5 @@
// Copyright © WireMock.Net
using System.Collections.Generic;
namespace WireMock.Admin.Mappings;
/// <summary>

View File

@@ -1,6 +1,5 @@
// Copyright © WireMock.Net
using System;
using WireMock.Models;
namespace WireMock.Admin.Mappings;
@@ -65,12 +64,12 @@ public class MappingModel
/// <summary>
/// The request model.
/// </summary>
public RequestModel Request { get; set; }
public required RequestModel Request { get; set; }
/// <summary>
/// The response model.
/// </summary>
public ResponseModel Response { get; set; }
public required ResponseModel Response { get; set; }
/// <summary>
/// Saves this mapping as a static mapping file.

View File

@@ -1,8 +1,5 @@
// Copyright © WireMock.Net
using System.Collections.Generic;
using System;
namespace WireMock.Admin.Mappings;
/// <summary>

View File

@@ -1,7 +1,5 @@
// Copyright © WireMock.Net
using System.Collections.Generic;
namespace WireMock.Admin.Mappings;
/// <summary>

View File

@@ -1,6 +1,5 @@
// Copyright © WireMock.Net
using System.Collections.Generic;
using WireMock.Admin.Settings;
namespace WireMock.Admin.Mappings;

View File

@@ -1,7 +1,5 @@
// Copyright © WireMock.Net
using System;
namespace WireMock.Admin.Mappings;
/// <summary>

View File

@@ -1,7 +1,5 @@
// Copyright © WireMock.Net
using System;
namespace WireMock.Models
{
/// <summary>

View File

@@ -1,7 +1,5 @@
// Copyright © WireMock.Net
using System.Collections.Generic;
namespace WireMock.Admin.Mappings;
/// <summary>

View File

@@ -1,7 +1,5 @@
// Copyright © WireMock.Net
using System;
namespace WireMock.Admin.Requests;
/// <summary>
@@ -17,12 +15,12 @@ public class LogEntryModel
/// <summary>
/// The request.
/// </summary>
public required LogRequestModel Request { get; init; }
public LogRequestModel? Request { get; init; }
/// <summary>
/// The response.
/// </summary>
public required LogResponseModel Response { get; init; }
public LogResponseModel? Response { get; init; }
/// <summary>
/// The mapping unique identifier.

View File

@@ -1,6 +1,5 @@
// Copyright © WireMock.Net
using System.Collections.Generic;
using WireMock.Matchers.Request;
namespace WireMock.Admin.Requests;

View File

@@ -1,7 +1,5 @@
// Copyright © WireMock.Net
using System;
using System.Collections.Generic;
using WireMock.Admin.Mappings;
using WireMock.Types;
@@ -15,32 +13,32 @@ public class LogRequestModel
/// <summary>
/// The Client IP Address.
/// </summary>
public string ClientIP { get; set; }
public required string ClientIP { get; set; }
/// <summary>
/// The DateTime.
/// </summary>
public DateTime DateTime { get; set; }
public required DateTime DateTime { get; set; }
/// <summary>
/// The Path.
/// </summary>
public string Path { get; set; }
public required string Path { get; set; }
/// <summary>
/// The Absolute Path.
/// </summary>
public string AbsolutePath { get; set; }
public required string AbsolutePath { get; set; }
/// <summary>
/// Gets the url (relative).
/// </summary>
public string Url { get; set; }
public required string Url { get; set; }
/// <summary>
/// The absolute URL.
/// </summary>
public string AbsoluteUrl { get; set; }
public required string AbsoluteUrl { get; set; }
/// <summary>
/// The ProxyUrl (if a proxy is used).
@@ -55,12 +53,12 @@ public class LogRequestModel
/// <summary>
/// The method.
/// </summary>
public string Method { get; set; }
public required string Method { get; set; }
/// <summary>
/// The HTTP Version.
/// </summary>
public string HttpVersion { get; set; } = null!;
public string? HttpVersion { get; set; }
/// <summary>
/// The Headers.

View File

@@ -1,6 +1,5 @@
// Copyright © WireMock.Net
using System.Collections.Generic;
using WireMock.Admin.Mappings;
using WireMock.Types;
@@ -64,12 +63,12 @@ public class LogResponseModel
/// <summary>
/// The detected body type (detection based on body content).
/// </summary>
public BodyType? DetectedBodyType { get; set; }
public string? DetectedBodyType { get; set; }
/// <summary>
/// The detected body type (detection based on Content-Type).
/// </summary>
public BodyType? DetectedBodyTypeFromContentType { get; set; }
public string? DetectedBodyTypeFromContentType { get; set; }
/// <summary>
/// The FaultType.
@@ -80,4 +79,14 @@ public class LogResponseModel
/// Gets or sets the Fault percentage.
/// </summary>
public double? FaultPercentage { get; set; }
/// <summary>
/// The DateTime.
/// </summary>
public required DateTime DateTime { get; set; }
/// <summary>
/// The method.
/// </summary>
public string? Method { get; set; }
}

View File

@@ -1,36 +1,35 @@
// Copyright © WireMock.Net
namespace WireMock.Admin.Scenarios
namespace WireMock.Admin.Scenarios;
/// <summary>
/// ScenarioStateModel
/// </summary>
[FluentBuilder.AutoGenerateBuilder]
public class ScenarioStateModel
{
/// <summary>
/// ScenarioStateModel
/// Gets or sets the name.
/// </summary>
[FluentBuilder.AutoGenerateBuilder]
public class ScenarioStateModel
{
/// <summary>
/// Gets or sets the name.
/// </summary>
public string Name { get; set; }
public required string Name { get; set; }
/// <summary>
/// Gets or sets the NextState.
/// </summary>
public string? NextState { get; set; }
/// <summary>
/// Gets or sets the NextState.
/// </summary>
public string? NextState { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this <see cref="ScenarioStateModel"/> is started.
/// </summary>
public bool Started { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this <see cref="ScenarioStateModel"/> is started.
/// </summary>
public bool Started { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this <see cref="ScenarioStateModel"/> is finished.
/// </summary>
public bool Finished { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this <see cref="ScenarioStateModel"/> is finished.
/// </summary>
public bool Finished { get; set; }
/// <summary>
/// Gets or sets the state counter.
/// </summary>
public int Counter { get; set; }
}
/// <summary>
/// Gets or sets the state counter.
/// </summary>
public int Counter { get; set; }
}

View File

@@ -45,12 +45,12 @@ public class ProxyAndRecordSettingsModel
/// <summary>
/// Defines a list from headers which will be excluded from the saved mappings.
/// </summary>
public string[] ExcludedHeaders { get; set; }
public string[] ExcludedHeaders { get; set; } = [];
/// <summary>
/// Defines a list of cookies which will be excluded from the saved mappings.
/// </summary>
public string[] ExcludedCookies { get; set; }
public string[] ExcludedCookies { get; set; } = [];
/// <summary>
/// Prefer the Proxy Mapping over the saved Mapping (in case SaveMapping is set to <c>true</c>).

View File

@@ -1,8 +1,6 @@
// Copyright © WireMock.Net
using System.Collections.Generic;
using System.Text.RegularExpressions;
using JetBrains.Annotations;
using WireMock.Handlers;
using WireMock.Types;
@@ -123,7 +121,6 @@ public class SettingsModel
/// </summary>
public Dictionary<string, string[]>? ProtoDefinitions { get; set; }
#if NETSTANDARD1_3_OR_GREATER || NET461
/// <summary>
/// Server client certificate mode
/// </summary>
@@ -133,5 +130,9 @@ public class SettingsModel
/// Whether to accept any client certificate
/// </summary>
public bool AcceptAnyClientCertificate { get; set; }
#endif
/// <summary>
/// Gets or sets the WebSocket settings.
/// </summary>
public WebSocketSettingsModel? WebSocketSettings { get; set; }
}

View File

@@ -0,0 +1,40 @@
// Copyright © WireMock.Net
namespace WireMock.Admin.Settings;
/// <summary>
/// WebSocket Settings Model
/// </summary>
[FluentBuilder.AutoGenerateBuilder]
public class WebSocketSettingsModel
{
/// <summary>
/// Maximum number of concurrent WebSocket connections (default: 100)
/// </summary>
public int MaxConnections { get; set; } = 100;
/// <summary>
/// Default receive buffer size in bytes (default: 4096)
/// </summary>
public int ReceiveBufferSize { get; set; } = 4096;
/// <summary>
/// Default keep-alive interval in seconds (default: 30)
/// </summary>
public int KeepAliveIntervalSeconds { get; set; } = 30;
/// <summary>
/// Maximum message size in bytes (default: 1048576 - 1 MB)
/// </summary>
public int MaxMessageSize { get; set; } = 1048576;
/// <summary>
/// Enable WebSocket compression (default: true)
/// </summary>
public bool EnableCompression { get; set; } = true;
/// <summary>
/// Default close timeout in minutes (default: 10)
/// </summary>
public int CloseTimeoutMinutes { get; set; } = 10;
}

View File

@@ -1,8 +1,5 @@
// Copyright © WireMock.Net
using System;
using System.Collections.Generic;
// ReSharper disable once CheckNamespace
namespace WireMock.Admin.Mappings;

View File

@@ -1,6 +1,5 @@
// Copyright © WireMock.Net
using System;
using WireMock.Validators;
// ReSharper disable once CheckNamespace

View File

@@ -1,6 +1,5 @@
// Copyright © WireMock.Net
using System;
using System.Net;
// ReSharper disable once CheckNamespace

View File

@@ -0,0 +1,39 @@
// Copyright © WireMock.Net
namespace WireMock.Constants;
/// <summary>
/// WebSocket constants
/// </summary>
public static class WebSocketConstants
{
/// <summary>
/// Default receive buffer size for WebSocket messages (4 KB)
/// </summary>
public const int DefaultReceiveBufferSize = 4096;
/// <summary>
/// Default keep-alive interval in seconds
/// </summary>
public const int DefaultKeepAliveIntervalSeconds = 30;
/// <summary>
/// Default close timeout in minutes
/// </summary>
public const int DefaultCloseTimeoutMinutes = 10;
/// <summary>
/// Minimum buffer size for WebSocket operations (1 KB)
/// </summary>
public const int MinimumBufferSize = 1024;
/// <summary>
/// Default maximum message size (1 MB)
/// </summary>
public const int DefaultMaxMessageSize = 1024 * 1024;
/// <summary>
/// Proxy forward buffer size (4 KB)
/// </summary>
public const int ProxyForwardBufferSize = 4096;
}

View File

@@ -1,7 +1,5 @@
// Copyright © WireMock.Net
using System.Collections.Generic;
namespace WireMock.Handlers;
/// <summary>

View File

@@ -1,10 +1,6 @@
// Copyright © WireMock.Net
using System;
using System.Collections.Generic;
#if NETSTANDARD1_3_OR_GREATER || NET461
using System.Security.Cryptography.X509Certificates;
#endif
using WireMock.Types;
using WireMock.Util;
@@ -118,13 +114,11 @@ public interface IRequestMessage
/// </summary>
byte[]? BodyAsBytes { get; }
#if MIMEKIT
/// <summary>
/// The original body as MimeMessage.
/// Convenience getter for Handlebars and WireMockAssertions.
/// </summary>
Models.Mime.IMimeMessageData? BodyAsMimeMessage { get; }
#endif
/// <summary>
/// The detected body type. Convenience getter for Handlebars.
@@ -169,10 +163,8 @@ public interface IRequestMessage
/// <returns>The query parameter value as WireMockList or null when not found.</returns>
WireMockList<string>? GetParameter(string key, bool ignoreCase = false);
#if NETSTANDARD1_3_OR_GREATER || NET461
/// <summary>
/// Gets the connection's client certificate
/// </summary>
X509Certificate2? ClientCertificate { get; }
#endif
}

View File

@@ -1,6 +1,5 @@
// Copyright © WireMock.Net
using System.Collections.Generic;
using WireMock.ResponseBuilders;
using WireMock.Types;
using WireMock.Util;
@@ -52,6 +51,16 @@ public interface IResponseMessage
/// </summary>
object? StatusCode { get; set; }
/// <summary>
/// Gets the DateTime.
/// </summary>
DateTime DateTime { get; }
/// <summary>
/// Gets the method.
/// </summary>
string? Method { get; }
/// <summary>
/// Adds the header.
/// </summary>

View File

@@ -1,6 +1,5 @@
// Copyright © WireMock.Net
using System;
using WireMock.Matchers.Request;
namespace WireMock.Logging;
@@ -38,20 +37,20 @@ public interface ILogEntry
/// <summary>
/// Gets the partial match result.
/// </summary>
IRequestMatchResult PartialMatchResult { get; }
IRequestMatchResult? PartialMatchResult { get; }
/// <summary>
/// Gets the request match result.
/// </summary>
IRequestMatchResult RequestMatchResult { get; }
IRequestMatchResult? RequestMatchResult { get; }
/// <summary>
/// Gets the request message.
/// </summary>
IRequestMessage RequestMessage { get; }
IRequestMessage? RequestMessage { get; }
/// <summary>
/// Gets the response message.
/// </summary>
IResponseMessage ResponseMessage { get; }
IResponseMessage? ResponseMessage { get; }
}

View File

@@ -1,6 +1,5 @@
// Copyright © WireMock.Net
using System;
using JetBrains.Annotations;
using WireMock.Admin.Requests;

View File

@@ -1,8 +1,5 @@
// Copyright © WireMock.Net
using System;
using System.Collections.Generic;
namespace WireMock.Matchers.Request;
/// <summary>

View File

@@ -1,7 +1,5 @@
// Copyright © WireMock.Net
using System;
namespace WireMock.Matchers.Request;
/// <summary>

View File

@@ -1,9 +1,6 @@
// Copyright © WireMock.Net
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using WireMock.Models;
using WireMock.Types;

View File

@@ -1,7 +1,5 @@
// Copyright © WireMock.Net
using System;
namespace WireMock.Models;
/// <summary>

View File

@@ -1,6 +1,5 @@
// Copyright © WireMock.Net
using System.Collections.Generic;
using WireMock.Types;
using WireMock.Util;

View File

@@ -1,8 +1,5 @@
// Copyright © WireMock.Net
using System;
using System.Collections.Generic;
namespace WireMock.Models;
/// <summary>

View File

@@ -1,8 +1,5 @@
// Copyright © WireMock.Net
using System;
using System.Collections.Generic;
namespace WireMock.Models.Mime;
/// <summary>

View File

@@ -1,6 +1,5 @@
// Copyright © WireMock.Net
using System.Collections.Generic;
using System.Text;
namespace WireMock.Models.Mime;

View File

@@ -1,8 +1,5 @@
// Copyright © WireMock.Net
using System;
using System.Collections.Generic;
namespace WireMock.Models.Mime;
/// <summary>

View File

@@ -1,8 +1,5 @@
// Copyright © WireMock.Net
using System;
using System.Collections.Generic;
namespace WireMock.Models.Mime;
/// <summary>

View File

@@ -1,8 +1,5 @@
// Copyright © WireMock.Net
using System.Collections.Generic;
using System.IO;
namespace WireMock.Models.Mime;
/// <summary>

View File

@@ -1,7 +1,5 @@
// Copyright © WireMock.Net
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using WireMock.Admin.Mappings;
using WireMock.Logging;

View File

@@ -50,5 +50,20 @@ public enum BodyType
/// <summary>
/// Use Server-Sent Events (string)
/// </summary>
SseString
SseString,
/// <summary>
/// WebSocket message in clear text.
/// </summary>
WebSocketText,
/// <summary>
/// WebSocket message in binary format.
/// </summary>
WebSocketBinary,
/// <summary>
/// WebSocket close message.
/// </summary>
WebSocketClose
}

View File

@@ -2,7 +2,6 @@
namespace WireMock.Types;
#if NETSTANDARD1_3_OR_GREATER || NET461
/// <summary>
/// Describes the client certificate requirements for a HTTPS connection.
/// This enum is the same as https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.server.kestrel.https.clientcertificatemode
@@ -29,5 +28,4 @@ public enum ClientCertificateMode
/// It may be requested by the application later.
/// </summary>
DelayCertificate,
}
#endif
}

View File

@@ -1,7 +1,5 @@
// Copyright © WireMock.Net
using System;
namespace WireMock.Types
{
/// <summary>

View File

@@ -1,5 +1,3 @@
using System;
namespace WireMock.Types;
/// <summary>

View File

@@ -1,7 +1,5 @@
// Copyright © WireMock.Net
using System;
namespace WireMock.Types;
[Flags]
@@ -13,5 +11,11 @@ public enum HostingScheme
Https = 0x2,
HttpAndHttps = Http | Https
HttpAndHttps = Http | Https,
Ws = 0x4,
Wss = 0x8,
WsAndWss = Ws | Wss
}

View File

@@ -1,7 +1,5 @@
// Copyright © WireMock.Net
using System;
namespace WireMock.Types;
[Flags]

View File

@@ -1,6 +1,5 @@
// Copyright © WireMock.Net
using System.Collections.Generic;
using System.Linq;
namespace WireMock.Types;

View File

@@ -1,7 +1,5 @@
// Copyright © WireMock.Net
using System;
namespace WireMock.Validators;
public static class PathValidator

View File

@@ -4,7 +4,7 @@
<Description>Commonly used interfaces, models, enumerations and types.</Description>
<AssemblyTitle>WireMock.Net.Abstractions</AssemblyTitle>
<Authors>Stef Heyenrath</Authors>
<TargetFrameworks>net45;net451;net461;netstandard1.3;netstandard2.0;netstandard2.1</TargetFrameworks>
<TargetFrameworks>netstandard2.0;net8.0</TargetFrameworks>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<NoWarn>$(NoWarn);1591;8603</NoWarn>
<AssemblyName>WireMock.Net.Abstractions</AssemblyName>
@@ -33,32 +33,31 @@
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
</PropertyGroup>
<PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1'">
<DefineConstants>$(DefineConstants);GRAPHQL;MIMEKIT;PROTOBUF</DefineConstants>
</PropertyGroup>
<!--<ItemGroup Condition=" '$(TargetFramework)' == 'net48' ">
--><!-- CVE-2018-8292 / https://github.com/advisories/GHSA-7jgj-8wvc-jh57 --><!--
<PackageReference Include="System.Net.Http" Version="4.3.4" />
</ItemGroup>-->
<ItemGroup>
<!-- CVE-2018-8292 / https://github.com/advisories/GHSA-7jgj-8wvc-jh57 -->
<PackageReference Include="System.Net.Http " Version="4.3.4" />
<!-- See also https://mstack.nl/blog/20210801-source-generators -->
<PackageReference Include="FluentBuilder" Version="0.10.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="PolySharp" Version="1.15.0">
<PackageReference Include="FluentBuilder" Version="0.14.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<ItemGroup Condition="$(TargetFramework.StartsWith('netstandard')) and '$(TargetFramework)' != 'netstandard1.0'">
<PackageReference Include="System.Security.Cryptography.X509Certificates" Version="4.3.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard1.3' or '$(TargetFramework)' == 'net45' or '$(TargetFramework)' == 'net451' or '$(TargetFramework)' == 'net461'">
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1' ">
<PackageReference Include="Required" Version="1.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="IsExternalInit" Version="1.0.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Nullable" Version="1.3.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
</Project>