mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-02-10 12:27:42 +01:00
Compare commits
46 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1d2b22545b | ||
|
|
f53afec823 | ||
|
|
2c1ab7e1d6 | ||
|
|
7cffd98cb6 | ||
|
|
39b09ccb44 | ||
|
|
dff55e175b | ||
|
|
88df9af9df | ||
|
|
f73bd5fc4f | ||
|
|
93ee9454a2 | ||
|
|
702e156ddc | ||
|
|
317fcb1b30 | ||
|
|
ff26f95ded | ||
|
|
4b602dd777 | ||
|
|
4525c61847 | ||
|
|
abe996671e | ||
|
|
9f819de696 | ||
|
|
276f329eed | ||
|
|
3b3f3604f7 | ||
|
|
d311813851 | ||
|
|
c8e1c66bf2 | ||
|
|
76d6f92be2 | ||
|
|
3f349cca4c | ||
|
|
19b85c7856 | ||
|
|
da912be37e | ||
|
|
ca9fceab67 | ||
|
|
c662bb7ad5 | ||
|
|
7d6fd35716 | ||
|
|
1b0b42d538 | ||
|
|
5f7b50a5b8 | ||
|
|
2e37e822a8 | ||
|
|
1bc693512f | ||
|
|
398dfe3eff | ||
|
|
02228e5f8a | ||
|
|
27d1a4b494 | ||
|
|
3e170778c8 | ||
|
|
9fa1f4081e | ||
|
|
37e140b342 | ||
|
|
4fd3ee1dfd | ||
|
|
5b43a4f341 | ||
|
|
0960d7cebd | ||
|
|
b111b019bc | ||
|
|
bb561c94d0 | ||
|
|
5c221ff4fa | ||
|
|
3077e7bee1 | ||
|
|
ec54599827 | ||
|
|
034766a2d6 |
5
.github/workflows/ci.yml
vendored
5
.github/workflows/ci.yml
vendored
@@ -19,6 +19,11 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Setup .NET 8
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
dotnet-version: '8.0.x'
|
||||
|
||||
- name: 'WireMock.Net.Tests'
|
||||
run: dotnet test './test/WireMock.Net.Tests/WireMock.Net.Tests.csproj' -c Release --framework net8.0
|
||||
|
||||
|
||||
36
.github/workflows/copilot-setup-steps.yml
vendored
Normal file
36
.github/workflows/copilot-setup-steps.yml
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
name: "Copilot Setup Steps"
|
||||
|
||||
# Automatically run the setup steps when they are changed to allow for easy validation, and
|
||||
# allow manual testing through the repository's "Actions" tab
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- .github/workflows/copilot-setup-steps.yml
|
||||
pull_request:
|
||||
paths:
|
||||
- .github/workflows/copilot-setup-steps.yml
|
||||
|
||||
jobs:
|
||||
# The job MUST be called `copilot-setup-steps` or it will not be picked up by Copilot.
|
||||
copilot-setup-steps:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
# Set the permissions to the lowest permissions possible needed for your steps.
|
||||
# Copilot will be given its own token for its operations.
|
||||
permissions:
|
||||
# If you want to clone the repository as part of your setup steps, for example to install dependencies, you'll need the `contents: read` permission. If you don't clone the repository in your setup steps, Copilot will do this for you automatically after the steps complete.
|
||||
contents: read
|
||||
|
||||
# You can define any steps you want, and they will run before the agent starts.
|
||||
# If you do not check out your code, Copilot will do this for you.
|
||||
steps:
|
||||
- name: Install .NET 10.x
|
||||
uses: actions/setup-dotnet@v5
|
||||
with:
|
||||
dotnet-version: |
|
||||
10.x
|
||||
dotnet-quality: preview
|
||||
|
||||
- name: dotnet --info
|
||||
run: dotnet --info
|
||||
@@ -1,3 +1,12 @@
|
||||
# 1.25.0 (25 January 2026)
|
||||
- [#1389](https://github.com/wiremock/WireMock.Net/pull/1389) - Fix MimePartMatcher and add more tests [bug] contributed by [StefH](https://github.com/StefH)
|
||||
- [#1371](https://github.com/wiremock/WireMock.Net/issues/1371) - MimePartMatcher does not match multipart/form-data request body (possible bug?) [bug]
|
||||
|
||||
# 1.24.0 (18 January 2026)
|
||||
- [#1417](https://github.com/wiremock/WireMock.Net/pull/1417) - Update aspire to 13.1 (examples + code) [feature] contributed by [petrroll](https://github.com/petrroll)
|
||||
- [#1418](https://github.com/wiremock/WireMock.Net/pull/1418) - Add OTEL tracing support for Wiremock + automatic OTEL for Aspire integration [feature] contributed by [petrroll](https://github.com/petrroll)
|
||||
- [#1214](https://github.com/wiremock/WireMock.Net/issues/1214) - OpenTelemetry Support for .NET Aspire [feature]
|
||||
|
||||
# 1.23.0 (05 January 2026)
|
||||
- [#1414](https://github.com/wiremock/WireMock.Net/pull/1414) - Pass the parameter matchOperator in Request.WithPath to its inner calls [bug] contributed by [gbamqzkdyg](https://github.com/gbamqzkdyg)
|
||||
- [#1416](https://github.com/wiremock/WireMock.Net/pull/1416) - Fix: Pass AllowedHandlebarsHelpers configuration to Handlebars.Net.Helpers library contributed by [samlatham](https://github.com/samlatham)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<VersionPrefix>1.23.0</VersionPrefix>
|
||||
<VersionPrefix>1.25.0</VersionPrefix>
|
||||
<PackageIcon>WireMock.Net-Logo.png</PackageIcon>
|
||||
<PackageProjectUrl>https://github.com/wiremock/WireMock.Net</PackageProjectUrl>
|
||||
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
|
||||
@@ -13,8 +13,9 @@
|
||||
<RepositoryUrl>https://github.com/wiremock/WireMock.Net</RepositoryUrl>
|
||||
<ApplicationIcon>../../resources/WireMock.Net-Logo.ico</ApplicationIcon>
|
||||
<PackageReadmeFile>PackageReadme.md</PackageReadmeFile>
|
||||
<LangVersion>12.0</LangVersion>
|
||||
<LangVersion>12</LangVersion>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(TF_BUILD)' == 'true'">
|
||||
@@ -51,17 +52,17 @@
|
||||
|
||||
<ItemGroup>
|
||||
<!-- CVE-2019-0820 -->
|
||||
<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />
|
||||
<!--<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" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup Condition=" '$(TargetFramework)' == 'net8.0' ">
|
||||
<PackageReference Include="SonarAnalyzer.CSharp" Version="10.15.0.120848">
|
||||
<!--<PackageReference Include="SonarAnalyzer.CSharp" Version="10.15.0.120848">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
</PackageReference>-->
|
||||
<!-- <PackageReference Include="StyleCop.Analyzers" Version="1.2.0-beta.556">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
rem https://github.com/StefH/GitHubReleaseNotes
|
||||
|
||||
SET version=1.23.0
|
||||
SET version=1.25.0
|
||||
|
||||
GitHubReleaseNotes --output CHANGELOG.md --skip-empty-releases --exclude-labels wontfix test question invalid doc duplicate example environment --version %version% --token %GH_TOKEN%
|
||||
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
# 1.23.0 (05 January 2026)
|
||||
- #1414 Pass the parameter matchOperator in Request.WithPath to its inner calls [bug]
|
||||
- #1416 Fix: Pass AllowedHandlebarsHelpers configuration to Handlebars.Net.Helpers library
|
||||
- #1413 Parameter `matchOperator` is not respected in the method Request.WithPath [bug]
|
||||
- #1415 HandlebarsSettings AllowedHandlebarsHelpers Configuration Not Applied [bug]
|
||||
# 1.25.0 (25 January 2026)
|
||||
- #1389 Fix MimePartMatcher and add more tests [bug]
|
||||
- #1371 MimePartMatcher does not match multipart/form-data request body (possible bug?) [bug]
|
||||
|
||||
The full release notes can be found here: https://github.com/wiremock/WireMock.Net/blob/master/CHANGELOG.md
|
||||
@@ -63,13 +63,14 @@ A C# .NET version based on [mock4net](https://github.com/alexvictoor/mock4net) w
|
||||
| **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.ProtoBuf** | [](https://www.nuget.org/packages/WireMock.Net.ProtoBuf) | [](https://www.myget.org/feed/wiremock-net/package/nuget/WireMock.Net.ProtoBuf)
|
||||
| **WireMock.Net.OpenTelemetry** | [](https://www.nuget.org/packages/WireMock.Net.ProtoBuf) | [](https://www.myget.org/feed/wiremock-net/package/nuget/WireMock.Net.OpenTelemetry)
|
||||
| | | |
|
||||
| **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)
|
||||
|
||||
<br />
|
||||
|
||||
🔺 **WireMock.Net.Minimal** does not include *WireMock.Net.MimePart*, *WireMock.Net.GraphQL* and *WireMock.Net.ProtoBuf*.
|
||||
🔺 **WireMock.Net.Minimal** does not include *WireMock.Net.MimePart*, *WireMock.Net.GraphQL*, *WireMock.Net.ProtoBuf* and *WireMock.Net.OpenTelemetry*.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -68,14 +68,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Org.RestClient", "
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Org.Abstractions", "src\WireMock.Org.Abstractions\WireMock.Org.Abstractions.csproj", "{3BA5109E-5F30-4CC2-B699-02EC82560AA6}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.WebApplication.NET6", "examples\WireMock.Net.WebApplication.NET6\WireMock.Net.WebApplication.NET6.csproj", "{3F7AA023-6833-4856-A08A-4B5717B592B8}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.Console.Proxy.NETCoreApp", "examples\WireMock.Net.Console.Proxy.NETCoreApp\WireMock.Net.Console.Proxy.NETCoreApp.csproj", "{670C7562-C154-442E-A249-7D26849BCD13}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.xUnit", "src\WireMock.Net.xUnit\WireMock.Net.xUnit.csproj", "{0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.Console.NET6.WithCertificate", "examples\WireMock.Net.Console.NET6.WithCertificate\WireMock.Net.Console.NET6.WithCertificate.csproj", "{7C2A9DE8-C89F-4841-9058-6B9BF81E5E34}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMockAzureQueueExample", "examples\WireMockAzureQueueExample\WireMockAzureQueueExample.csproj", "{BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.Testcontainers", "src\WireMock.Net.Testcontainers\WireMock.Net.Testcontainers.csproj", "{12B016A5-9D8B-4EFE-96C2-CA51BE43367D}"
|
||||
@@ -148,220 +144,700 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.xUnit.v3", "sr
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.NUnit", "src\WireMock.Net.NUnit\WireMock.Net.NUnit.csproj", "{2DBBD70D-8051-441F-92BB-FF9B8B4B4982}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.OpenTelemetry", "src\WireMock.Net.OpenTelemetry\WireMock.Net.OpenTelemetry.csproj", "{C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.OpenTelemetryDemo", "examples\WireMock.Net.OpenTelemetryDemo\WireMock.Net.OpenTelemetryDemo.csproj", "{9957038D-F9C3-CA5D-E8AE-BE188E512635}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.Console.MimePart", "examples\WireMock.Net.Console.MimePart\WireMock.Net.Console.MimePart.csproj", "{4005E20C-D42B-138A-79BE-B3F5420C563F}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.Console.NET8.WithCertificate", "examples\WireMock.Net.Console.NET8.WithCertificate\WireMock.Net.Console.NET8.WithCertificate.csproj", "{2D86546D-8A24-0A55-C962-2071BD299E05}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.WebApplication.IIS", "examples\WireMock.Net.WebApplication.IIS\WireMock.Net.WebApplication.IIS.csproj", "{5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.WebSocketExamples", "examples\WireMock.Net.WebSocketExamples\WireMock.Net.WebSocketExamples.csproj", "{2CE8E3A6-59CC-FE9C-9399-AD54E1FA862B}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{D3804228-91F4-4502-9595-39584E5A01AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A01AD}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A01AD}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A01AD}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A01AD}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A01AD}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A01AD}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A01AD}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A01AD}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A01AD}.Release|x64.Build.0 = Release|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A01AD}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A01AD}.Release|x86.Build.0 = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A94}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A94}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A94}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A94}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A94}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A94}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A94}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A94}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A94}.Release|x64.Build.0 = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A94}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A94}.Release|x86.Build.0 = Release|Any CPU
|
||||
{B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Release|x64.Build.0 = Release|Any CPU
|
||||
{B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Release|x86.Build.0 = Release|Any CPU
|
||||
{B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Release|x64.Build.0 = Release|Any CPU
|
||||
{B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Release|x86.Build.0 = Release|Any CPU
|
||||
{31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Release|x64.Build.0 = Release|Any CPU
|
||||
{31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Release|x86.Build.0 = Release|Any CPU
|
||||
{74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Release|x64.Build.0 = Release|Any CPU
|
||||
{74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Release|x86.Build.0 = Release|Any CPU
|
||||
{7F0B2446-0363-4720-AF46-F47F83B557DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{7F0B2446-0363-4720-AF46-F47F83B557DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{7F0B2446-0363-4720-AF46-F47F83B557DC}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{7F0B2446-0363-4720-AF46-F47F83B557DC}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{7F0B2446-0363-4720-AF46-F47F83B557DC}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{7F0B2446-0363-4720-AF46-F47F83B557DC}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{7F0B2446-0363-4720-AF46-F47F83B557DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{7F0B2446-0363-4720-AF46-F47F83B557DC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{7F0B2446-0363-4720-AF46-F47F83B557DC}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{7F0B2446-0363-4720-AF46-F47F83B557DC}.Release|x64.Build.0 = Release|Any CPU
|
||||
{7F0B2446-0363-4720-AF46-F47F83B557DC}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{7F0B2446-0363-4720-AF46-F47F83B557DC}.Release|x86.Build.0 = Release|Any CPU
|
||||
{A9D039B9-7509-4CF1-9EFD-87EB82998575}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{A9D039B9-7509-4CF1-9EFD-87EB82998575}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{A9D039B9-7509-4CF1-9EFD-87EB82998575}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{A9D039B9-7509-4CF1-9EFD-87EB82998575}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{A9D039B9-7509-4CF1-9EFD-87EB82998575}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{A9D039B9-7509-4CF1-9EFD-87EB82998575}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{A9D039B9-7509-4CF1-9EFD-87EB82998575}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{A9D039B9-7509-4CF1-9EFD-87EB82998575}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{A9D039B9-7509-4CF1-9EFD-87EB82998575}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{A9D039B9-7509-4CF1-9EFD-87EB82998575}.Release|x64.Build.0 = Release|Any CPU
|
||||
{A9D039B9-7509-4CF1-9EFD-87EB82998575}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{A9D039B9-7509-4CF1-9EFD-87EB82998575}.Release|x86.Build.0 = Release|Any CPU
|
||||
{5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Release|x64.Build.0 = Release|Any CPU
|
||||
{5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Release|x86.Build.0 = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A95}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A95}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A95}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A95}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A95}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A95}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A95}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A95}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A95}.Release|x64.Build.0 = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A95}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A95}.Release|x86.Build.0 = Release|Any CPU
|
||||
{40BF24B5-12E6-4610-9489-138798632E28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{40BF24B5-12E6-4610-9489-138798632E28}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{40BF24B5-12E6-4610-9489-138798632E28}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{40BF24B5-12E6-4610-9489-138798632E28}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{40BF24B5-12E6-4610-9489-138798632E28}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{40BF24B5-12E6-4610-9489-138798632E28}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{40BF24B5-12E6-4610-9489-138798632E28}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{40BF24B5-12E6-4610-9489-138798632E28}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{40BF24B5-12E6-4610-9489-138798632E28}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{40BF24B5-12E6-4610-9489-138798632E28}.Release|x64.Build.0 = Release|Any CPU
|
||||
{40BF24B5-12E6-4610-9489-138798632E28}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{40BF24B5-12E6-4610-9489-138798632E28}.Release|x86.Build.0 = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A44}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A44}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A44}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A44}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A44}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A44}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A44}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A44}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A44}.Release|x64.Build.0 = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A44}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A44}.Release|x86.Build.0 = Release|Any CPU
|
||||
{08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Release|x64.Build.0 = Release|Any CPU
|
||||
{08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Release|x86.Build.0 = Release|Any CPU
|
||||
{3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{3F7AA023-6833-4856-A08A-4B5717B592B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{3F7AA023-6833-4856-A08A-4B5717B592B8}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{3F7AA023-6833-4856-A08A-4B5717B592B8}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{3F7AA023-6833-4856-A08A-4B5717B592B8}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Release|x64.Build.0 = Release|Any CPU
|
||||
{3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Release|x86.Build.0 = Release|Any CPU
|
||||
{670C7562-C154-442E-A249-7D26849BCD13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{670C7562-C154-442E-A249-7D26849BCD13}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{670C7562-C154-442E-A249-7D26849BCD13}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{670C7562-C154-442E-A249-7D26849BCD13}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{670C7562-C154-442E-A249-7D26849BCD13}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{670C7562-C154-442E-A249-7D26849BCD13}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{670C7562-C154-442E-A249-7D26849BCD13}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{670C7562-C154-442E-A249-7D26849BCD13}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{670C7562-C154-442E-A249-7D26849BCD13}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{670C7562-C154-442E-A249-7D26849BCD13}.Release|x64.Build.0 = Release|Any CPU
|
||||
{670C7562-C154-442E-A249-7D26849BCD13}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{670C7562-C154-442E-A249-7D26849BCD13}.Release|x86.Build.0 = Release|Any CPU
|
||||
{0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{7C2A9DE8-C89F-4841-9058-6B9BF81E5E34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{7C2A9DE8-C89F-4841-9058-6B9BF81E5E34}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{7C2A9DE8-C89F-4841-9058-6B9BF81E5E34}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{7C2A9DE8-C89F-4841-9058-6B9BF81E5E34}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Release|x64.Build.0 = Release|Any CPU
|
||||
{0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Release|x86.Build.0 = Release|Any CPU
|
||||
{BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Release|x64.Build.0 = Release|Any CPU
|
||||
{BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Release|x86.Build.0 = Release|Any CPU
|
||||
{12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Release|x64.Build.0 = Release|Any CPU
|
||||
{12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Release|x86.Build.0 = Release|Any CPU
|
||||
{56A38798-C48B-4A4A-B805-071E05C02CE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{56A38798-C48B-4A4A-B805-071E05C02CE1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{56A38798-C48B-4A4A-B805-071E05C02CE1}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{56A38798-C48B-4A4A-B805-071E05C02CE1}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{56A38798-C48B-4A4A-B805-071E05C02CE1}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{56A38798-C48B-4A4A-B805-071E05C02CE1}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{56A38798-C48B-4A4A-B805-071E05C02CE1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{56A38798-C48B-4A4A-B805-071E05C02CE1}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{56A38798-C48B-4A4A-B805-071E05C02CE1}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{56A38798-C48B-4A4A-B805-071E05C02CE1}.Release|x64.Build.0 = Release|Any CPU
|
||||
{56A38798-C48B-4A4A-B805-071E05C02CE1}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{56A38798-C48B-4A4A-B805-071E05C02CE1}.Release|x86.Build.0 = Release|Any CPU
|
||||
{07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Release|x64.Build.0 = Release|Any CPU
|
||||
{07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Release|x86.Build.0 = Release|Any CPU
|
||||
{1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Release|x64.Build.0 = Release|Any CPU
|
||||
{1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Release|x86.Build.0 = Release|Any CPU
|
||||
{7FC0B409-2682-40EE-B3B9-3930D6769D01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{7FC0B409-2682-40EE-B3B9-3930D6769D01}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{7FC0B409-2682-40EE-B3B9-3930D6769D01}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{7FC0B409-2682-40EE-B3B9-3930D6769D01}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{7FC0B409-2682-40EE-B3B9-3930D6769D01}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{7FC0B409-2682-40EE-B3B9-3930D6769D01}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{7FC0B409-2682-40EE-B3B9-3930D6769D01}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{7FC0B409-2682-40EE-B3B9-3930D6769D01}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{7FC0B409-2682-40EE-B3B9-3930D6769D01}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{7FC0B409-2682-40EE-B3B9-3930D6769D01}.Release|x64.Build.0 = Release|Any CPU
|
||||
{7FC0B409-2682-40EE-B3B9-3930D6769D01}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{7FC0B409-2682-40EE-B3B9-3930D6769D01}.Release|x86.Build.0 = Release|Any CPU
|
||||
{B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Release|x64.Build.0 = Release|Any CPU
|
||||
{B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Release|x86.Build.0 = Release|Any CPU
|
||||
{CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Release|x64.Build.0 = Release|Any CPU
|
||||
{CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Release|x86.Build.0 = Release|Any CPU
|
||||
{42113E6B-DC43-4E80-9967-1E4233568E87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{42113E6B-DC43-4E80-9967-1E4233568E87}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{42113E6B-DC43-4E80-9967-1E4233568E87}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{42113E6B-DC43-4E80-9967-1E4233568E87}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{42113E6B-DC43-4E80-9967-1E4233568E87}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{42113E6B-DC43-4E80-9967-1E4233568E87}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{42113E6B-DC43-4E80-9967-1E4233568E87}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{42113E6B-DC43-4E80-9967-1E4233568E87}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{42113E6B-DC43-4E80-9967-1E4233568E87}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{42113E6B-DC43-4E80-9967-1E4233568E87}.Release|x64.Build.0 = Release|Any CPU
|
||||
{42113E6B-DC43-4E80-9967-1E4233568E87}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{42113E6B-DC43-4E80-9967-1E4233568E87}.Release|x86.Build.0 = Release|Any CPU
|
||||
{84624E1F-DF07-4315-89B0-51776BE99E13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{84624E1F-DF07-4315-89B0-51776BE99E13}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{84624E1F-DF07-4315-89B0-51776BE99E13}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{84624E1F-DF07-4315-89B0-51776BE99E13}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{84624E1F-DF07-4315-89B0-51776BE99E13}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{84624E1F-DF07-4315-89B0-51776BE99E13}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{84624E1F-DF07-4315-89B0-51776BE99E13}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{84624E1F-DF07-4315-89B0-51776BE99E13}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{84624E1F-DF07-4315-89B0-51776BE99E13}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{84624E1F-DF07-4315-89B0-51776BE99E13}.Release|x64.Build.0 = Release|Any CPU
|
||||
{84624E1F-DF07-4315-89B0-51776BE99E13}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{84624E1F-DF07-4315-89B0-51776BE99E13}.Release|x86.Build.0 = Release|Any CPU
|
||||
{A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Release|x64.Build.0 = Release|Any CPU
|
||||
{A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Release|x86.Build.0 = Release|Any CPU
|
||||
{7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Release|x64.Build.0 = Release|Any CPU
|
||||
{7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Release|x86.Build.0 = Release|Any CPU
|
||||
{CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Release|x64.Build.0 = Release|Any CPU
|
||||
{CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Release|x86.Build.0 = Release|Any CPU
|
||||
{F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Release|x64.Build.0 = Release|Any CPU
|
||||
{F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Release|x86.Build.0 = Release|Any CPU
|
||||
{C9210DA3-F390-4598-8512-349A473FE9C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{C9210DA3-F390-4598-8512-349A473FE9C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{C9210DA3-F390-4598-8512-349A473FE9C9}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{C9210DA3-F390-4598-8512-349A473FE9C9}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{C9210DA3-F390-4598-8512-349A473FE9C9}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{C9210DA3-F390-4598-8512-349A473FE9C9}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{C9210DA3-F390-4598-8512-349A473FE9C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{C9210DA3-F390-4598-8512-349A473FE9C9}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{C9210DA3-F390-4598-8512-349A473FE9C9}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{C9210DA3-F390-4598-8512-349A473FE9C9}.Release|x64.Build.0 = Release|Any CPU
|
||||
{C9210DA3-F390-4598-8512-349A473FE9C9}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{C9210DA3-F390-4598-8512-349A473FE9C9}.Release|x86.Build.0 = Release|Any CPU
|
||||
{91024A93-848F-4A02-AF53-5EBE5834E23C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{91024A93-848F-4A02-AF53-5EBE5834E23C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{91024A93-848F-4A02-AF53-5EBE5834E23C}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{91024A93-848F-4A02-AF53-5EBE5834E23C}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{91024A93-848F-4A02-AF53-5EBE5834E23C}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{91024A93-848F-4A02-AF53-5EBE5834E23C}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{91024A93-848F-4A02-AF53-5EBE5834E23C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{91024A93-848F-4A02-AF53-5EBE5834E23C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{91024A93-848F-4A02-AF53-5EBE5834E23C}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{91024A93-848F-4A02-AF53-5EBE5834E23C}.Release|x64.Build.0 = Release|Any CPU
|
||||
{91024A93-848F-4A02-AF53-5EBE5834E23C}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{91024A93-848F-4A02-AF53-5EBE5834E23C}.Release|x86.Build.0 = Release|Any CPU
|
||||
{4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Release|x64.Build.0 = Release|Any CPU
|
||||
{4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Release|x86.Build.0 = Release|Any CPU
|
||||
{E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Release|x64.Build.0 = Release|Any CPU
|
||||
{E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Release|x86.Build.0 = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A13}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A13}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A13}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A13}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A13}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A13}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A13}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A13}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A13}.Release|x64.Build.0 = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A13}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-579DED3D9A13}.Release|x86.Build.0 = Release|Any CPU
|
||||
{6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Release|x64.Build.0 = Release|Any CPU
|
||||
{6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Release|x86.Build.0 = Release|Any CPU
|
||||
{A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Release|x64.Build.0 = Release|Any CPU
|
||||
{A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Release|x86.Build.0 = Release|Any CPU
|
||||
{7753670F-7C7F-44BF-8BC7-08325588E60C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{7753670F-7C7F-44BF-8BC7-08325588E60C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{7753670F-7C7F-44BF-8BC7-08325588E60C}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{7753670F-7C7F-44BF-8BC7-08325588E60C}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{7753670F-7C7F-44BF-8BC7-08325588E60C}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{7753670F-7C7F-44BF-8BC7-08325588E60C}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{7753670F-7C7F-44BF-8BC7-08325588E60C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{7753670F-7C7F-44BF-8BC7-08325588E60C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{7753670F-7C7F-44BF-8BC7-08325588E60C}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{7753670F-7C7F-44BF-8BC7-08325588E60C}.Release|x64.Build.0 = Release|Any CPU
|
||||
{7753670F-7C7F-44BF-8BC7-08325588E60C}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{7753670F-7C7F-44BF-8BC7-08325588E60C}.Release|x86.Build.0 = Release|Any CPU
|
||||
{E5B03EEF-822C-4295-952B-4479AD30082B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{E5B03EEF-822C-4295-952B-4479AD30082B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E5B03EEF-822C-4295-952B-4479AD30082B}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{E5B03EEF-822C-4295-952B-4479AD30082B}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{E5B03EEF-822C-4295-952B-4479AD30082B}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{E5B03EEF-822C-4295-952B-4479AD30082B}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{E5B03EEF-822C-4295-952B-4479AD30082B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{E5B03EEF-822C-4295-952B-4479AD30082B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{E5B03EEF-822C-4295-952B-4479AD30082B}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{E5B03EEF-822C-4295-952B-4479AD30082B}.Release|x64.Build.0 = Release|Any CPU
|
||||
{E5B03EEF-822C-4295-952B-4479AD30082B}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{E5B03EEF-822C-4295-952B-4479AD30082B}.Release|x86.Build.0 = Release|Any CPU
|
||||
{F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Release|x64.Build.0 = Release|Any CPU
|
||||
{F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Release|x86.Build.0 = Release|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A0177}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A0177}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A0177}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A0177}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A0177}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A0177}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A0177}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A0177}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A0177}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A0177}.Release|x64.Build.0 = Release|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A0177}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{D3804228-91F4-4502-9595-39584E5A0177}.Release|x86.Build.0 = Release|Any CPU
|
||||
{BFEF8990-65B3-4274-310F-7355F0B84035}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{BFEF8990-65B3-4274-310F-7355F0B84035}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{BFEF8990-65B3-4274-310F-7355F0B84035}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{BFEF8990-65B3-4274-310F-7355F0B84035}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{BFEF8990-65B3-4274-310F-7355F0B84035}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{BFEF8990-65B3-4274-310F-7355F0B84035}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{BFEF8990-65B3-4274-310F-7355F0B84035}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{BFEF8990-65B3-4274-310F-7355F0B84035}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{BFEF8990-65B3-4274-310F-7355F0B84035}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{BFEF8990-65B3-4274-310F-7355F0B84035}.Release|x64.Build.0 = Release|Any CPU
|
||||
{BFEF8990-65B3-4274-310F-7355F0B84035}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{BFEF8990-65B3-4274-310F-7355F0B84035}.Release|x86.Build.0 = Release|Any CPU
|
||||
{1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Release|x64.Build.0 = Release|Any CPU
|
||||
{1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Release|x86.Build.0 = Release|Any CPU
|
||||
{BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Release|x64.Build.0 = Release|Any CPU
|
||||
{BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Release|x86.Build.0 = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A45}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A45}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A45}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A45}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A45}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A45}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A45}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A45}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A45}.Release|x64.Build.0 = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A45}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{B6269AAC-170A-4346-8B9A-444DED3D9A45}.Release|x86.Build.0 = Release|Any CPU
|
||||
{3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Release|x64.Build.0 = Release|Any CPU
|
||||
{3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Release|x86.Build.0 = Release|Any CPU
|
||||
{1E874C8F-08A2-493B-8421-619F9A6E9E77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{1E874C8F-08A2-493B-8421-619F9A6E9E77}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{1E874C8F-08A2-493B-8421-619F9A6E9E77}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{1E874C8F-08A2-493B-8421-619F9A6E9E77}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{1E874C8F-08A2-493B-8421-619F9A6E9E77}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{1E874C8F-08A2-493B-8421-619F9A6E9E77}.Debug|x86.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.Build.0 = Release|Any CPU
|
||||
{1E874C8F-08A2-493B-8421-619F9A6E9E77}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{1E874C8F-08A2-493B-8421-619F9A6E9E77}.Release|x64.Build.0 = Release|Any CPU
|
||||
{1E874C8F-08A2-493B-8421-619F9A6E9E77}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{1E874C8F-08A2-493B-8421-619F9A6E9E77}.Release|x86.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}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{B47413AA-55D3-49A7-896A-17ADBFF72407}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{B47413AA-55D3-49A7-896A-17ADBFF72407}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{B47413AA-55D3-49A7-896A-17ADBFF72407}.Debug|x86.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
|
||||
{B47413AA-55D3-49A7-896A-17ADBFF72407}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{B47413AA-55D3-49A7-896A-17ADBFF72407}.Release|x64.Build.0 = Release|Any CPU
|
||||
{B47413AA-55D3-49A7-896A-17ADBFF72407}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{B47413AA-55D3-49A7-896A-17ADBFF72407}.Release|x86.Build.0 = Release|Any CPU
|
||||
{4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Release|x64.Build.0 = Release|Any CPU
|
||||
{4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Release|x86.Build.0 = Release|Any CPU
|
||||
{2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Release|x64.Build.0 = Release|Any CPU
|
||||
{2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Release|x86.Build.0 = Release|Any CPU
|
||||
{C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Release|x64.Build.0 = Release|Any CPU
|
||||
{C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Release|x86.Build.0 = Release|Any CPU
|
||||
{9957038D-F9C3-CA5D-E8AE-BE188E512635}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{9957038D-F9C3-CA5D-E8AE-BE188E512635}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{9957038D-F9C3-CA5D-E8AE-BE188E512635}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{9957038D-F9C3-CA5D-E8AE-BE188E512635}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{9957038D-F9C3-CA5D-E8AE-BE188E512635}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{9957038D-F9C3-CA5D-E8AE-BE188E512635}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{9957038D-F9C3-CA5D-E8AE-BE188E512635}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{9957038D-F9C3-CA5D-E8AE-BE188E512635}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{9957038D-F9C3-CA5D-E8AE-BE188E512635}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{9957038D-F9C3-CA5D-E8AE-BE188E512635}.Release|x64.Build.0 = Release|Any CPU
|
||||
{9957038D-F9C3-CA5D-E8AE-BE188E512635}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{9957038D-F9C3-CA5D-E8AE-BE188E512635}.Release|x86.Build.0 = Release|Any CPU
|
||||
{4005E20C-D42B-138A-79BE-B3F5420C563F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{4005E20C-D42B-138A-79BE-B3F5420C563F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{4005E20C-D42B-138A-79BE-B3F5420C563F}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{4005E20C-D42B-138A-79BE-B3F5420C563F}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{4005E20C-D42B-138A-79BE-B3F5420C563F}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{4005E20C-D42B-138A-79BE-B3F5420C563F}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{4005E20C-D42B-138A-79BE-B3F5420C563F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{4005E20C-D42B-138A-79BE-B3F5420C563F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{4005E20C-D42B-138A-79BE-B3F5420C563F}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{4005E20C-D42B-138A-79BE-B3F5420C563F}.Release|x64.Build.0 = Release|Any CPU
|
||||
{4005E20C-D42B-138A-79BE-B3F5420C563F}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{4005E20C-D42B-138A-79BE-B3F5420C563F}.Release|x86.Build.0 = Release|Any CPU
|
||||
{2D86546D-8A24-0A55-C962-2071BD299E05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{2D86546D-8A24-0A55-C962-2071BD299E05}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{2D86546D-8A24-0A55-C962-2071BD299E05}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{2D86546D-8A24-0A55-C962-2071BD299E05}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{2D86546D-8A24-0A55-C962-2071BD299E05}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{2D86546D-8A24-0A55-C962-2071BD299E05}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{2D86546D-8A24-0A55-C962-2071BD299E05}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{2D86546D-8A24-0A55-C962-2071BD299E05}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{2D86546D-8A24-0A55-C962-2071BD299E05}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{2D86546D-8A24-0A55-C962-2071BD299E05}.Release|x64.Build.0 = Release|Any CPU
|
||||
{2D86546D-8A24-0A55-C962-2071BD299E05}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{2D86546D-8A24-0A55-C962-2071BD299E05}.Release|x86.Build.0 = Release|Any CPU
|
||||
{5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Release|x64.Build.0 = Release|Any CPU
|
||||
{5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Release|x86.Build.0 = Release|Any CPU
|
||||
{2CE8E3A6-59CC-FE9C-9399-AD54E1FA862B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{2CE8E3A6-59CC-FE9C-9399-AD54E1FA862B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{2CE8E3A6-59CC-FE9C-9399-AD54E1FA862B}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{2CE8E3A6-59CC-FE9C-9399-AD54E1FA862B}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{2CE8E3A6-59CC-FE9C-9399-AD54E1FA862B}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{2CE8E3A6-59CC-FE9C-9399-AD54E1FA862B}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{2CE8E3A6-59CC-FE9C-9399-AD54E1FA862B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{2CE8E3A6-59CC-FE9C-9399-AD54E1FA862B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{2CE8E3A6-59CC-FE9C-9399-AD54E1FA862B}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{2CE8E3A6-59CC-FE9C-9399-AD54E1FA862B}.Release|x64.Build.0 = Release|Any CPU
|
||||
{2CE8E3A6-59CC-FE9C-9399-AD54E1FA862B}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{2CE8E3A6-59CC-FE9C-9399-AD54E1FA862B}.Release|x86.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
@@ -383,10 +859,8 @@ Global
|
||||
{5B64F6CA-BF6B-4F67-BB2A-9C47E441703E} = {7EFB2C5B-1BB2-4AAF-BC9F-216ED80C594D}
|
||||
{08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2}
|
||||
{3BA5109E-5F30-4CC2-B699-02EC82560AA6} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2}
|
||||
{3F7AA023-6833-4856-A08A-4B5717B592B8} = {985E0ADB-D4B4-473A-AA40-567E279B7946}
|
||||
{670C7562-C154-442E-A249-7D26849BCD13} = {985E0ADB-D4B4-473A-AA40-567E279B7946}
|
||||
{0DE0954F-8C00-4E8D-B94A-4361FC1CBE44} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2}
|
||||
{7C2A9DE8-C89F-4841-9058-6B9BF81E5E34} = {985E0ADB-D4B4-473A-AA40-567E279B7946}
|
||||
{BAA9EC2A-874B-45CE-8E51-A73622DC7F3D} = {985E0ADB-D4B4-473A-AA40-567E279B7946}
|
||||
{12B016A5-9D8B-4EFE-96C2-CA51BE43367D} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2}
|
||||
{56A38798-C48B-4A4A-B805-071E05C02CE1} = {985E0ADB-D4B4-473A-AA40-567E279B7946}
|
||||
@@ -421,6 +895,12 @@ Global
|
||||
{B47413AA-55D3-49A7-896A-17ADBFF72407} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2}
|
||||
{4F46BD02-BEBC-4B2D-B857-4169AD1FB067} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2}
|
||||
{2DBBD70D-8051-441F-92BB-FF9B8B4B4982} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2}
|
||||
{C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2}
|
||||
{9957038D-F9C3-CA5D-E8AE-BE188E512635} = {985E0ADB-D4B4-473A-AA40-567E279B7946}
|
||||
{4005E20C-D42B-138A-79BE-B3F5420C563F} = {985E0ADB-D4B4-473A-AA40-567E279B7946}
|
||||
{2D86546D-8A24-0A55-C962-2071BD299E05} = {985E0ADB-D4B4-473A-AA40-567E279B7946}
|
||||
{5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C} = {985E0ADB-D4B4-473A-AA40-567E279B7946}
|
||||
{2CE8E3A6-59CC-FE9C-9399-AD54E1FA862B} = {985E0ADB-D4B4-473A-AA40-567E279B7946}
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {DC539027-9852-430C-B19F-FD035D018458}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<Sdk Name="Aspire.AppHost.Sdk" Version="9.2.0" />
|
||||
<Sdk Name="Aspire.AppHost.Sdk" Version="13.1.0" />
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
@@ -18,7 +18,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Aspire.Hosting.AppHost" Version="9.2.0" />
|
||||
<PackageReference Include="Aspire.Hosting.AppHost" Version="13.1.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -24,7 +24,8 @@ IResourceBuilder<WireMockServerResource> apiService2 = builder
|
||||
.AsHttp2Service()
|
||||
.WithMappingsPath(mappingsPath)
|
||||
.WithWatchStaticMappings()
|
||||
.WithApiMappingBuilder(WeatherForecastApiMock.BuildAsync);
|
||||
.WithApiMappingBuilder(WeatherForecastApiMock.BuildAsync)
|
||||
.WithOpenTelemetry(); // Enable OpenTelemetry tracing for Aspire dashboard
|
||||
|
||||
//var apiServiceUsedForDocs = builder
|
||||
// .AddWireMock("apiservice1", WireMockServerArguments.DefaultPort)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<Sdk Name="Aspire.AppHost.Sdk" Version="9.2.0" />
|
||||
<Sdk Name="Aspire.AppHost.Sdk" Version="13.1.0" />
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
@@ -15,7 +15,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Aspire.Hosting.AppHost" Version="9.2.0" />
|
||||
<PackageReference Include="Aspire.Hosting.AppHost" Version="13.1.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -6,4 +6,4 @@ builder.AddProject<Projects.AspireApp1_Web>("webfrontend")
|
||||
.WithExternalHttpEndpoints()
|
||||
.WithReference(apiService);
|
||||
|
||||
builder.Build().Run();
|
||||
await builder.Build().RunAsync();
|
||||
@@ -9,7 +9,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Aspire.Hosting.Testing" Version="8.0.0" />
|
||||
<PackageReference Include="Aspire.Hosting.Testing" Version="13.1.0" />
|
||||
<PackageReference Include="coverlet.collector" Version="6.0.0" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
|
||||
<PackageReference Include="xunit" Version="2.5.3" />
|
||||
|
||||
82
examples/WireMock.Net.Console.MimePart/MainApp.cs
Normal file
82
examples/WireMock.Net.Console.MimePart/MainApp.cs
Normal file
@@ -0,0 +1,82 @@
|
||||
// Copyright © WireMock.Net
|
||||
|
||||
using Newtonsoft.Json;
|
||||
using WireMock.Logging;
|
||||
using WireMock.Matchers;
|
||||
using WireMock.RequestBuilders;
|
||||
using WireMock.ResponseBuilders;
|
||||
using WireMock.Server;
|
||||
using WireMock.Settings;
|
||||
|
||||
namespace WireMock.Net.Console.MimePart;
|
||||
|
||||
// Test this CURL:
|
||||
// curl -X POST http://localhost:9091/multipart -F "plainText=This is some plain text;type=text/plain" -F "jsonData={ `"Key`": `"Value`" };type=application/json" -F "image=@image.png;type=image/png"
|
||||
//
|
||||
// curl -X POST http://localhost:9091/multipart2 -F "plainText=This is some plain text;type=text/plain" -F "jsonData={ `"Key`": `"Value`" };type=application/json" -F "image=@image.png;type=image/png"
|
||||
|
||||
public static class MainApp
|
||||
{
|
||||
public static async Task RunAsync()
|
||||
{
|
||||
using var server = WireMockServer.Start(new WireMockServerSettings
|
||||
{
|
||||
Port = 9091,
|
||||
StartAdminInterface = true,
|
||||
|
||||
ReadStaticMappings = true,
|
||||
//WatchStaticMappings = true,
|
||||
//WatchStaticMappingsInSubdirectories = true,
|
||||
|
||||
Logger = new WireMockConsoleLogger()
|
||||
});
|
||||
System.Console.WriteLine("WireMockServer listening at {0}", string.Join(",", server.Urls));
|
||||
|
||||
var textPlainContentTypeMatcher = new ContentTypeMatcher("text/plain");
|
||||
var textPlainContentMatcher = new ExactMatcher("This is some plain text");
|
||||
var textPlainMatcher = new MimePartMatcher(MatchBehaviour.AcceptOnMatch, textPlainContentTypeMatcher, null, null, textPlainContentMatcher);
|
||||
|
||||
var textJsonContentTypeMatcher = new ContentTypeMatcher("application/json");
|
||||
var textJsonContentMatcher = new JsonMatcher(new { Key = "Value" }, true);
|
||||
var textJsonMatcher = new MimePartMatcher(MatchBehaviour.AcceptOnMatch, textJsonContentTypeMatcher, null, null, textJsonContentMatcher);
|
||||
|
||||
var imagePngContentTypeMatcher = new ContentTypeMatcher("image/png");
|
||||
var imagePngContentDispositionMatcher = new ExactMatcher("form-data; name=\"image\"; filename=\"image.png\"");
|
||||
var imagePngContentTransferEncodingMatcher = new ExactMatcher("default");
|
||||
var imagePngContentMatcher = new ExactObjectMatcher(Convert.FromBase64String("iVBORw0KGgoAAAANSUhEUgAAAAIAAAACAgMAAAAP2OW3AAAADFBMVEX/tID/vpH/pWX/sHidUyjlAAAADElEQVR4XmMQYNgAAADkAMHebX3mAAAAAElFTkSuQmCC"));
|
||||
var imagePngMatcher = new MimePartMatcher(MatchBehaviour.AcceptOnMatch, imagePngContentTypeMatcher, imagePngContentDispositionMatcher, imagePngContentTransferEncodingMatcher, imagePngContentMatcher);
|
||||
|
||||
var matchers = new IMatcher[]
|
||||
{
|
||||
textPlainMatcher,
|
||||
textJsonMatcher,
|
||||
imagePngMatcher
|
||||
};
|
||||
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/multipart")
|
||||
.UsingPost()
|
||||
.WithMultiPart(matchers)
|
||||
)
|
||||
.WithGuid("b9c82182-e469-41da-bcaf-b6e3157fefdb")
|
||||
.RespondWith(Response.Create()
|
||||
.WithBody("MultiPart is ok")
|
||||
);
|
||||
|
||||
// server.SaveStaticMappings();
|
||||
|
||||
System.Console.WriteLine(JsonConvert.SerializeObject(server.MappingModels, Formatting.Indented));
|
||||
|
||||
System.Console.WriteLine("Press any key to stop the server");
|
||||
System.Console.ReadKey();
|
||||
server.Stop();
|
||||
|
||||
System.Console.WriteLine("Displaying all requests");
|
||||
var allRequests = server.LogEntries;
|
||||
System.Console.WriteLine(JsonConvert.SerializeObject(allRequests, Formatting.Indented));
|
||||
|
||||
System.Console.WriteLine("Press any key to quit");
|
||||
System.Console.ReadKey();
|
||||
}
|
||||
}
|
||||
23
examples/WireMock.Net.Console.MimePart/Program.cs
Normal file
23
examples/WireMock.Net.Console.MimePart/Program.cs
Normal file
@@ -0,0 +1,23 @@
|
||||
// Copyright © WireMock.Net
|
||||
|
||||
using System.Reflection;
|
||||
using log4net;
|
||||
using log4net.Config;
|
||||
using log4net.Repository;
|
||||
|
||||
namespace WireMock.Net.Console.MimePart;
|
||||
|
||||
static class Program
|
||||
{
|
||||
private static readonly ILoggerRepository LogRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
|
||||
private static readonly ILog Log = LogManager.GetLogger(typeof(Program));
|
||||
|
||||
static async Task Main(params string[] args)
|
||||
{
|
||||
Log.Info("Starting WireMock.Net.Console.MimePart...");
|
||||
|
||||
XmlConfigurator.Configure(LogRepository, new FileInfo("log4net.config"));
|
||||
|
||||
await MainApp.RunAsync();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<DefineConstants>$(DefineConstants);GRAPHQL;MIMEKIT;PROTOBUF</DefineConstants>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Content Include="__admin\mappings\*.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\src\WireMock.Net\WireMock.Net.csproj" />
|
||||
<PackageReference Include="log4net" Version="2.0.15" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="log4net.config">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,79 @@
|
||||
{
|
||||
"Guid": "b9c82182-e469-41da-bcaf-b6e3157fefdc",
|
||||
"UpdatedAt": "2025-12-18T17:21:57.3879723Z",
|
||||
"Request": {
|
||||
"Path": {
|
||||
"Matchers": [
|
||||
{
|
||||
"Name": "WildcardMatcher",
|
||||
"Pattern": "/multipart2",
|
||||
"IgnoreCase": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"Methods": [
|
||||
"POST"
|
||||
],
|
||||
"Body": {
|
||||
"MatcherName": "MultiPartMatcher",
|
||||
"Matchers": [
|
||||
{
|
||||
"Name": "MimePartMatcher",
|
||||
"ContentTypeMatcher": {
|
||||
"Name": "ContentTypeMatcher",
|
||||
"Pattern": "text/plain",
|
||||
"IgnoreCase": false
|
||||
},
|
||||
"ContentMatcher": {
|
||||
"Name": "ExactMatcher",
|
||||
"Pattern": "This is some plain text",
|
||||
"IgnoreCase": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"Name": "MimePartMatcher",
|
||||
"ContentTypeMatcher": {
|
||||
"Name": "ContentTypeMatcher",
|
||||
"Pattern": "application/json",
|
||||
"IgnoreCase": false
|
||||
},
|
||||
"ContentMatcher": {
|
||||
"Name": "JsonMatcher",
|
||||
"Pattern": {
|
||||
"Key": "Value"
|
||||
},
|
||||
"IgnoreCase": true,
|
||||
"Regex": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"Name": "MimePartMatcher",
|
||||
"ContentTypeMatcher": {
|
||||
"Name": "ContentTypeMatcher",
|
||||
"Pattern": "image/png",
|
||||
"IgnoreCase": false
|
||||
},
|
||||
"ContentDispositionMatcher": {
|
||||
"Name": "ExactMatcher",
|
||||
"Pattern": "form-data; name=\"image\"; filename=\"image.png\"",
|
||||
"IgnoreCase": false
|
||||
},
|
||||
"ContentTransferEncodingMatcher": {
|
||||
"Name": "ExactMatcher",
|
||||
"Pattern": "default",
|
||||
"IgnoreCase": false
|
||||
},
|
||||
"ContentMatcher": {
|
||||
"Name": "ExactObjectMatcher",
|
||||
"Pattern": "iVBORw0KGgoAAAANSUhEUgAAAAIAAAACAgMAAAAP2OW3AAAADFBMVEX/tID/vpH/pWX/sHidUyjlAAAADElEQVR4XmMQYNgAAADkAMHebX3mAAAAAElFTkSuQmCC"
|
||||
}
|
||||
}
|
||||
],
|
||||
"MatchOperator": "Or"
|
||||
}
|
||||
},
|
||||
"Response": {
|
||||
"BodyDestination": "SameAsSource",
|
||||
"Body": "MultiPart2 is ok"
|
||||
}
|
||||
}
|
||||
20
examples/WireMock.Net.Console.MimePart/log4net.config
Normal file
20
examples/WireMock.Net.Console.MimePart/log4net.config
Normal file
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<configuration>
|
||||
<configSections>
|
||||
<section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
|
||||
</configSections>
|
||||
<appSettings>
|
||||
<add key="log4net.Internal.Debug" value="true"/>
|
||||
</appSettings>
|
||||
<log4net>
|
||||
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
|
||||
<layout type="log4net.Layout.PatternLayout">
|
||||
<conversionPattern value="%date [%thread] %-5level %logger{1} - %message%newline" />
|
||||
</layout>
|
||||
</appender>
|
||||
<root>
|
||||
<level value="DEBUG" />
|
||||
<appender-ref ref="ConsoleAppender" />
|
||||
</root>
|
||||
</log4net>
|
||||
</configuration>
|
||||
@@ -7,7 +7,6 @@
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\src\WireMock.Net\WireMock.Net.csproj" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
@@ -339,7 +339,7 @@ namespace WireMock.Net.ConsoleApplication
|
||||
}
|
||||
}
|
||||
System.Console.WriteLine("X = {0} ; default = {1} ; pX = {2:0.00} ; valueX = {3:0.00}", xCount, defaultCount, pX, 1.0 * xCount / tot);
|
||||
return;
|
||||
|
||||
using var httpAndHttpsWithPort = WireMockServer.Start(new WireMockServerSettings
|
||||
{
|
||||
HostingScheme = HostingScheme.HttpAndHttps,
|
||||
@@ -376,9 +376,9 @@ namespace WireMock.Net.ConsoleApplication
|
||||
PreWireMockMiddlewareInit = app => { System.Console.WriteLine($"PreWireMockMiddlewareInit : {app.GetType()}"); },
|
||||
PostWireMockMiddlewareInit = app => { System.Console.WriteLine($"PostWireMockMiddlewareInit : {app.GetType()}"); },
|
||||
|
||||
#if USE_ASPNETCORE
|
||||
//#if USE_ASPNETCORE
|
||||
AdditionalServiceRegistration = services => { System.Console.WriteLine($"AdditionalServiceRegistration : {services.GetType()}"); },
|
||||
#endif
|
||||
//#endif
|
||||
Logger = new WireMockConsoleLogger(),
|
||||
|
||||
HandlebarsRegistrationCallback = (handlebarsContext, fileSystemHandler) =>
|
||||
@@ -399,7 +399,7 @@ namespace WireMock.Net.ConsoleApplication
|
||||
//var response = await http.GetAsync($"{_wireMockServer.Url}/pricing");
|
||||
//var value = await response.Content.ReadAsStringAsync();
|
||||
|
||||
#if PROTOBUF
|
||||
//#if PROTOBUF
|
||||
var protoBufJsonMatcher = new JsonPartialWildcardMatcher(new { name = "*" });
|
||||
server
|
||||
.Given(Request.Create()
|
||||
@@ -478,9 +478,9 @@ namespace WireMock.Net.ConsoleApplication
|
||||
.WithTrailingHeader("grpc-status", "0")
|
||||
.WithTransformer()
|
||||
);
|
||||
#endif
|
||||
//#endif
|
||||
|
||||
#if GRAPHQL
|
||||
//#if GRAPHQL
|
||||
var customScalars = new Dictionary<string, Type> { { "MyCustomScalar", typeof(int) } };
|
||||
server
|
||||
.Given(Request.Create()
|
||||
@@ -554,41 +554,8 @@ namespace WireMock.Net.ConsoleApplication
|
||||
}
|
||||
""")
|
||||
);
|
||||
#endif
|
||||
//#endif
|
||||
|
||||
#if MIMEKIT
|
||||
var textPlainContentTypeMatcher = new ContentTypeMatcher("text/plain");
|
||||
var textPlainContentMatcher = new ExactMatcher("This is some plain text");
|
||||
var textPlainMatcher = new MimePartMatcher(MatchBehaviour.AcceptOnMatch, textPlainContentTypeMatcher, null, null, textPlainContentMatcher);
|
||||
|
||||
var textJsonContentTypeMatcher = new ContentTypeMatcher("text/json");
|
||||
var textJsonContentMatcher = new JsonMatcher(new { Key = "Value" }, true);
|
||||
var textJsonMatcher = new MimePartMatcher(MatchBehaviour.AcceptOnMatch, textJsonContentTypeMatcher, null, null, textJsonContentMatcher);
|
||||
|
||||
var imagePngContentTypeMatcher = new ContentTypeMatcher("image/png");
|
||||
var imagePngContentDispositionMatcher = new ExactMatcher("attachment; filename=\"image.png\"");
|
||||
var imagePngContentTransferEncodingMatcher = new ExactMatcher("base64");
|
||||
var imagePngContentMatcher = new ExactObjectMatcher(Convert.FromBase64String("iVBORw0KGgoAAAANSUhEUgAAAAIAAAACAgMAAAAP2OW3AAAADFBMVEX/tID/vpH/pWX/sHidUyjlAAAADElEQVR4XmMQYNgAAADkAMHebX3mAAAAAElFTkSuQmCC"));
|
||||
var imagePngMatcher = new MimePartMatcher(MatchBehaviour.AcceptOnMatch, imagePngContentTypeMatcher, imagePngContentDispositionMatcher, imagePngContentTransferEncodingMatcher, imagePngContentMatcher);
|
||||
|
||||
var matchers = new IMatcher[]
|
||||
{
|
||||
textPlainMatcher,
|
||||
textJsonMatcher,
|
||||
imagePngMatcher
|
||||
};
|
||||
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/multipart")
|
||||
.UsingPost()
|
||||
.WithMultiPart(matchers)
|
||||
)
|
||||
.WithGuid("b9c82182-e469-41da-bcaf-b6e3157fefdb")
|
||||
.RespondWith(Response.Create()
|
||||
.WithBody("MultiPart is ok")
|
||||
);
|
||||
#endif
|
||||
// 400 ms
|
||||
server
|
||||
.Given(Request.Create()
|
||||
|
||||
@@ -1,34 +1,34 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<DefineConstants>$(DefineConstants);GRAPHQL;MIMEKIT;PROTOBUF</DefineConstants>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<!--<DefineConstants>$(DefineConstants);GRAPHQL;MIMEKIT;PROTOBUF</DefineConstants>-->
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Content Include="__admin\mappings\*.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="__admin\mappings\*.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Remove="__admin\mappings\1.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Remove="__admin\mappings\1.cs" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\src\WireMock.Net\WireMock.Net.csproj" />
|
||||
<PackageReference Include="log4net" Version="2.0.15" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\src\WireMock.Net\WireMock.Net.csproj" />
|
||||
<PackageReference Include="log4net" Version="2.0.15" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="log4net.config">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Update="nlog.config">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Update="log4net.config">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Update="nlog.config">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ApplicationIcon>../../resources/WireMock.Net-Logo.ico</ApplicationIcon>
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
@@ -7,16 +7,16 @@
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<!--<ItemGroup>
|
||||
<ProjectReference Include="..\..\src\WireMock.Net\WireMock.Net.csproj" />
|
||||
</ItemGroup>
|
||||
</ItemGroup>-->
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Update="SonarAnalyzer.CSharp" Version="10.12.0.118525" />
|
||||
</ItemGroup>
|
||||
|
||||
<!--<ItemGroup>
|
||||
<PackageReference Include="WireMock.Net" Version="1.8.11" />
|
||||
</ItemGroup>-->
|
||||
<ItemGroup>
|
||||
<PackageReference Include="WireMock.Net" Version="1.12.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -6,6 +6,8 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.OpenApi.YamlReader" Version="2.3.0" />
|
||||
|
||||
<ProjectReference Include="..\..\src\WireMock.Net.Abstractions\WireMock.Net.Abstractions.csproj" />
|
||||
<ProjectReference Include="..\..\src\WireMock.Net.OpenApiParser\WireMock.Net.OpenApiParser.csproj" />
|
||||
<ProjectReference Include="..\..\src\WireMock.Net\WireMock.Net.csproj" />
|
||||
|
||||
142
examples/WireMock.Net.OpenTelemetryDemo/Program.cs
Normal file
142
examples/WireMock.Net.OpenTelemetryDemo/Program.cs
Normal file
@@ -0,0 +1,142 @@
|
||||
// Copyright © WireMock.Net
|
||||
// OpenTelemetry Tracing Demo for WireMock.Net
|
||||
// This demo uses the Console Exporter to visualize traces in the terminal.
|
||||
|
||||
using OpenTelemetry;
|
||||
using OpenTelemetry.Trace;
|
||||
using WireMock.OpenTelemetry;
|
||||
using WireMock.Server;
|
||||
using WireMock.Settings;
|
||||
using WireMock.RequestBuilders;
|
||||
using WireMock.ResponseBuilders;
|
||||
|
||||
Console.WriteLine("=== WireMock.Net OpenTelemetry Tracing Demo ===\n");
|
||||
|
||||
// WireMock.Net creates Activity objects using System.Diagnostics.Activity (built into .NET).
|
||||
// These activities are automatically created when ActivityTracingEnabled is set to true.
|
||||
//
|
||||
// To export these traces, you have two options:
|
||||
//
|
||||
// Option 1: Configure your own TracerProvider (shown below)
|
||||
// - Full control over exporters (Console, OTLP, Jaeger, etc.)
|
||||
// - Add additional instrumentation (HttpClient, database, etc.)
|
||||
// - Recommended for most applications
|
||||
//
|
||||
// Option 2: Use WireMock.Net.OpenTelemetry package
|
||||
// - Reference the WireMock.Net.OpenTelemetry NuGet package
|
||||
// - Use services.AddWireMockOpenTelemetry(openTelemetryOptions)
|
||||
// - Adds WireMock + ASP.NET Core instrumentation and OTLP exporter
|
||||
// - Good for quick setup with all-in-one configuration
|
||||
|
||||
// Option 1: Custom TracerProvider with Console exporter for this demo
|
||||
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
|
||||
.AddWireMockInstrumentation(new OpenTelemetryOptions() { ExcludeAdminRequests = true })
|
||||
.AddHttpClientInstrumentation() // HTTP client traces (for our test requests)
|
||||
.AddConsoleExporter() // Export traces to console for demo purposes
|
||||
.AddOtlpExporter() // Export to real OTLP collector (e.g. Jaeger, Tempo, etc.)
|
||||
.Build();
|
||||
|
||||
Console.WriteLine("Console Exporter configured to visualize:");
|
||||
Console.WriteLine(" - WireMock.Net traces (wiremock.* tags)");
|
||||
Console.WriteLine(" - ASP.NET Core server traces");
|
||||
Console.WriteLine(" - HTTP client traces\n");
|
||||
|
||||
// Start WireMock server with OpenTelemetry enabled (ActivityTracingOptions != null enables tracing)
|
||||
var server = WireMockServer.Start(new WireMockServerSettings
|
||||
{
|
||||
StartAdminInterface = true,
|
||||
ActivityTracingOptions = new ActivityTracingOptions
|
||||
{
|
||||
ExcludeAdminRequests = true
|
||||
}
|
||||
});
|
||||
|
||||
Console.WriteLine($"WireMock server started at: {string.Join(", ", server.Urls)}\n");
|
||||
|
||||
// Configure some mock mappings
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/api/hello")
|
||||
.UsingGet())
|
||||
.RespondWith(Response.Create()
|
||||
.WithStatusCode(200)
|
||||
.WithBody("Hello from WireMock!"));
|
||||
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/api/user/*")
|
||||
.UsingGet())
|
||||
.RespondWith(Response.Create()
|
||||
.WithStatusCode(200)
|
||||
.WithHeader("Content-Type", "application/json")
|
||||
.WithBody(@"{""name"": ""John Doe"", ""email"": ""john@example.com""}"));
|
||||
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/api/error")
|
||||
.UsingGet())
|
||||
.RespondWith(Response.Create()
|
||||
.WithStatusCode(500)
|
||||
.WithBody("Internal Server Error"));
|
||||
|
||||
Console.WriteLine("Mock mappings configured:");
|
||||
Console.WriteLine(" GET /api/hello -> 200 OK");
|
||||
Console.WriteLine(" GET /api/user/* -> 200 OK (JSON)");
|
||||
Console.WriteLine(" GET /api/error -> 500 Error");
|
||||
Console.WriteLine();
|
||||
|
||||
// Make some test requests to generate traces
|
||||
using var httpClient = server.CreateClient();
|
||||
|
||||
Console.WriteLine("Making test requests to generate traces...\n");
|
||||
Console.WriteLine("─────────────────────────────────────────────────────────────────");
|
||||
|
||||
// Request 1: Successful request
|
||||
Console.WriteLine("\n>>> Request 1: GET /api/hello");
|
||||
var response1 = await httpClient.GetAsync("/api/hello");
|
||||
Console.WriteLine($"<<< Response: {(int)response1.StatusCode} {response1.StatusCode}");
|
||||
Console.WriteLine($" Body: {await response1.Content.ReadAsStringAsync()}");
|
||||
|
||||
await Task.Delay(500); // Small delay to let trace export complete
|
||||
|
||||
// Request 2: Another successful request with path parameter
|
||||
Console.WriteLine("\n>>> Request 2: GET /api/user/123");
|
||||
var response2 = await httpClient.GetAsync("/api/user/123");
|
||||
Console.WriteLine($"<<< Response: {(int)response2.StatusCode} {response2.StatusCode}");
|
||||
Console.WriteLine($" Body: {await response2.Content.ReadAsStringAsync()}");
|
||||
|
||||
await Task.Delay(500);
|
||||
|
||||
// Request 3: Error response
|
||||
Console.WriteLine("\n>>> Request 3: GET /api/error");
|
||||
var response3 = await httpClient.GetAsync("/api/error");
|
||||
Console.WriteLine($"<<< Response: {(int)response3.StatusCode} {response3.StatusCode}");
|
||||
Console.WriteLine($" Body: {await response3.Content.ReadAsStringAsync()}");
|
||||
|
||||
await Task.Delay(500);
|
||||
|
||||
// Request 4: No matching mapping (404)
|
||||
Console.WriteLine("\n>>> Request 4: GET /api/notfound");
|
||||
var response4 = await httpClient.GetAsync("/api/notfound");
|
||||
Console.WriteLine($"<<< Response: {(int)response4.StatusCode} {response4.StatusCode}");
|
||||
|
||||
await Task.Delay(500);
|
||||
|
||||
// Request 5: Admin API request (should be excluded from tracing)
|
||||
Console.WriteLine("\n>>> Request 5: GET /__admin/health");
|
||||
var response5 = await httpClient.GetAsync("/__admin/health");
|
||||
Console.WriteLine($"<<< Admin Health Status: {response5.StatusCode}");
|
||||
|
||||
Console.WriteLine("\n─────────────────────────────────────────────────────────────────");
|
||||
Console.WriteLine("\nTraces above show OpenTelemetry activities from WireMock.Net!");
|
||||
Console.WriteLine("Look for 'Activity.TraceId', 'Activity.SpanId', and custom tags like:");
|
||||
Console.WriteLine(" - http.request.method");
|
||||
Console.WriteLine(" - url.path");
|
||||
Console.WriteLine(" - http.response.status_code");
|
||||
Console.WriteLine(" - wiremock.mapping.matched");
|
||||
Console.WriteLine(" - wiremock.mapping.guid");
|
||||
Console.WriteLine();
|
||||
|
||||
// Cleanup
|
||||
server.Stop();
|
||||
Console.WriteLine("WireMock server stopped. Demo complete!");
|
||||
@@ -0,0 +1,21 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.14.0" />
|
||||
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.14.0" />
|
||||
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.14.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\src\WireMock.Net.OpenTelemetry\WireMock.Net.OpenTelemetry.csproj" />
|
||||
<ProjectReference Include="..\..\src\WireMock.Net\WireMock.Net.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -115,10 +115,10 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="log4net">
|
||||
<Version>3.0.3</Version>
|
||||
<Version>3.2.0</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="WireMock.Net">
|
||||
<Version>1.8.11</Version>
|
||||
<Version>1.12.0</Version>
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6</TargetFramework>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<!--<RuntimeIdentifiers>win10-x64</RuntimeIdentifiers>-->
|
||||
<StartupObject>WireMock.Net.WebApplication.Program</StartupObject>
|
||||
<AssemblyName>WireMock.Net.WebApplication</AssemblyName>
|
||||
@@ -11,7 +11,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="6.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
</ItemGroup>
|
||||
|
||||
725
examples/WireMock.Net.WebSocketExamples/Program.cs
Normal file
725
examples/WireMock.Net.WebSocketExamples/Program.cs
Normal file
@@ -0,0 +1,725 @@
|
||||
// Copyright © WireMock.Net
|
||||
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Net.WebSockets;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using WireMock.Logging;
|
||||
using WireMock.RequestBuilders;
|
||||
using WireMock.ResponseBuilders;
|
||||
using WireMock.Server;
|
||||
using WireMock.Settings;
|
||||
|
||||
namespace WireMock.Net.WebSocketExamples;
|
||||
|
||||
public static class Program
|
||||
{
|
||||
public static async Task Main(string[] args)
|
||||
{
|
||||
Console.WriteLine("WireMock.Net WebSocket Examples");
|
||||
Console.WriteLine("================================\n");
|
||||
|
||||
Console.WriteLine("Choose an example to run:");
|
||||
Console.WriteLine("1. Echo Server");
|
||||
Console.WriteLine("2. Custom Message Handler");
|
||||
Console.WriteLine("3. Broadcast Server");
|
||||
Console.WriteLine("4. Scenario/State Machine");
|
||||
Console.WriteLine("5. WebSocket Proxy");
|
||||
Console.WriteLine("6. Multiple WebSocket Endpoints");
|
||||
Console.WriteLine("7. All Examples (runs all endpoints)");
|
||||
Console.WriteLine("0. Exit\n");
|
||||
|
||||
Console.Write("Enter choice: ");
|
||||
var choice = Console.ReadLine();
|
||||
|
||||
switch (choice)
|
||||
{
|
||||
case "1":
|
||||
await RunEchoServerExample();
|
||||
break;
|
||||
case "2":
|
||||
await RunCustomMessageHandlerExample();
|
||||
break;
|
||||
case "3":
|
||||
await RunBroadcastExample();
|
||||
break;
|
||||
case "4":
|
||||
await RunScenarioExample();
|
||||
break;
|
||||
case "5":
|
||||
await RunProxyExample();
|
||||
break;
|
||||
case "6":
|
||||
await RunMultipleEndpointsExample();
|
||||
break;
|
||||
case "7":
|
||||
await RunAllExamples();
|
||||
break;
|
||||
case "0":
|
||||
return;
|
||||
default:
|
||||
Console.WriteLine("Invalid choice");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Example 1: Simple Echo Server
|
||||
/// Echoes back all messages received from the client
|
||||
/// </summary>
|
||||
private static async Task RunEchoServerExample()
|
||||
{
|
||||
Console.WriteLine("\n=== Echo Server Example ===");
|
||||
Console.WriteLine("Starting WebSocket echo server...\n");
|
||||
|
||||
var server = WireMockServer.Start(new WireMockServerSettings
|
||||
{
|
||||
Port = 9091,
|
||||
Logger = new WireMockConsoleLogger()
|
||||
});
|
||||
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/ws/echo")
|
||||
.WithWebSocketUpgrade()
|
||||
)
|
||||
.RespondWith(Response.Create()
|
||||
.WithWebSocket(ws => ws
|
||||
.WithEcho()
|
||||
)
|
||||
);
|
||||
|
||||
Console.WriteLine($"Echo server listening at: {server.Urls[0]}/ws/echo");
|
||||
Console.WriteLine("\nTest with a WebSocket client:");
|
||||
Console.WriteLine(" wscat -c ws://localhost:9091/ws/echo");
|
||||
Console.WriteLine("\nPress any key to test or CTRL+C to exit...");
|
||||
Console.ReadKey();
|
||||
|
||||
// Test the echo server
|
||||
await TestWebSocketEcho(server.Urls[0]);
|
||||
|
||||
Console.WriteLine("\nPress any key to stop server...");
|
||||
Console.ReadKey();
|
||||
server.Stop();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Example 2: Custom Message Handler
|
||||
/// Processes messages and sends custom responses
|
||||
/// </summary>
|
||||
private static async Task RunCustomMessageHandlerExample()
|
||||
{
|
||||
Console.WriteLine("\n=== Custom Message Handler Example ===");
|
||||
Console.WriteLine("Starting WebSocket server with custom message handler...\n");
|
||||
|
||||
var server = WireMockServer.Start(new WireMockServerSettings
|
||||
{
|
||||
Port = 9091,
|
||||
Logger = new WireMockConsoleLogger()
|
||||
});
|
||||
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/ws/chat")
|
||||
.WithWebSocketUpgrade()
|
||||
)
|
||||
.RespondWith(Response.Create()
|
||||
.WithWebSocket(ws => ws
|
||||
.WithMessageHandler(async (message, context) =>
|
||||
{
|
||||
if (message.MessageType == WebSocketMessageType.Text)
|
||||
{
|
||||
var text = message.Text ?? string.Empty;
|
||||
|
||||
// Handle different commands
|
||||
if (text.StartsWith("/help"))
|
||||
{
|
||||
await context.SendTextAsync("Available commands: /help, /time, /echo <text>, /upper <text>, /reverse <text>");
|
||||
}
|
||||
else if (text.StartsWith("/time"))
|
||||
{
|
||||
await context.SendTextAsync($"Server time: {DateTime.UtcNow:yyyy-MM-dd HH:mm:ss} UTC");
|
||||
}
|
||||
else if (text.StartsWith("/echo "))
|
||||
{
|
||||
await context.SendTextAsync(text.Substring(6));
|
||||
}
|
||||
else if (text.StartsWith("/upper "))
|
||||
{
|
||||
await context.SendTextAsync(text.Substring(7).ToUpper());
|
||||
}
|
||||
else if (text.StartsWith("/reverse "))
|
||||
{
|
||||
var toReverse = text.Substring(9);
|
||||
var reversed = new string(toReverse.Reverse().ToArray());
|
||||
await context.SendTextAsync(reversed);
|
||||
}
|
||||
else if (text == "/quit")
|
||||
{
|
||||
await context.SendTextAsync("Goodbye!");
|
||||
await context.CloseAsync(WebSocketCloseStatus.NormalClosure, "Client requested disconnect");
|
||||
}
|
||||
else
|
||||
{
|
||||
await context.SendTextAsync($"Unknown command: {text}. Type /help for available commands.");
|
||||
}
|
||||
}
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
Console.WriteLine($"Chat server listening at: {server.Urls[0]}/ws/chat");
|
||||
Console.WriteLine("\nTest with:");
|
||||
Console.WriteLine(" wscat -c ws://localhost:9091/ws/chat");
|
||||
Console.WriteLine("\nThen try commands: /help, /time, /echo hello, /upper hello, /reverse hello");
|
||||
Console.WriteLine("\nPress any key to test or CTRL+C to exit...");
|
||||
Console.ReadKey();
|
||||
|
||||
await TestWebSocketChat(server.Urls[0]);
|
||||
|
||||
Console.WriteLine("\nPress any key to stop server...");
|
||||
Console.ReadKey();
|
||||
server.Stop();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Example 3: Broadcast Server
|
||||
/// Broadcasts messages to all connected clients
|
||||
/// </summary>
|
||||
private static async Task RunBroadcastExample()
|
||||
{
|
||||
Console.WriteLine("\n=== Broadcast Server Example ===");
|
||||
Console.WriteLine("Starting WebSocket broadcast server...\n");
|
||||
|
||||
var server = WireMockServer.Start(new WireMockServerSettings
|
||||
{
|
||||
Port = 9091,
|
||||
Logger = new WireMockConsoleLogger()
|
||||
});
|
||||
|
||||
var broadcastMappingGuid = Guid.NewGuid();
|
||||
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/ws/broadcast")
|
||||
.WithWebSocketUpgrade()
|
||||
)
|
||||
.WithGuid(broadcastMappingGuid)
|
||||
.RespondWith(Response.Create()
|
||||
.WithWebSocket(ws => ws
|
||||
.WithBroadcast()
|
||||
.WithMessageHandler(async (message, context) =>
|
||||
{
|
||||
if (message.MessageType == WebSocketMessageType.Text)
|
||||
{
|
||||
var text = message.Text ?? string.Empty;
|
||||
var timestamp = DateTime.UtcNow.ToString("HH:mm:ss");
|
||||
var broadcastMessage = $"[{timestamp}] Broadcast: {text}";
|
||||
|
||||
// Broadcast to all connected clients
|
||||
await context.BroadcastTextAsync(broadcastMessage);
|
||||
|
||||
Console.WriteLine($"Broadcasted to {server.GetWebSocketConnections(broadcastMappingGuid).Count} clients: {text}");
|
||||
}
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
Console.WriteLine($"Broadcast server listening at: {server.Urls[0]}/ws/broadcast");
|
||||
Console.WriteLine("\nConnect multiple clients:");
|
||||
Console.WriteLine(" wscat -c ws://localhost:9091/ws/broadcast");
|
||||
Console.WriteLine("\nMessages sent from any client will be broadcast to all clients");
|
||||
Console.WriteLine("\nPress any key to stop server...");
|
||||
Console.ReadKey();
|
||||
server.Stop();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Example 4: Scenario/State Machine
|
||||
/// Demonstrates state transitions during WebSocket session
|
||||
/// </summary>
|
||||
private static async Task RunScenarioExample()
|
||||
{
|
||||
Console.WriteLine("\n=== Scenario/State Machine Example ===");
|
||||
Console.WriteLine("Starting WebSocket server with scenario support...\n");
|
||||
|
||||
var server = WireMockServer.Start(new WireMockServerSettings
|
||||
{
|
||||
Port = 9091,
|
||||
Logger = new WireMockConsoleLogger()
|
||||
});
|
||||
|
||||
// Initial state: Waiting for players
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/ws/game")
|
||||
.WithWebSocketUpgrade()
|
||||
)
|
||||
.InScenario("GameSession")
|
||||
.WillSetStateTo("Lobby")
|
||||
.RespondWith(Response.Create()
|
||||
.WithWebSocket(ws => ws
|
||||
.WithMessageHandler(async (msg, ctx) =>
|
||||
{
|
||||
await ctx.SendTextAsync("Welcome to the game lobby! Type 'ready' to start or 'quit' to leave.");
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
// Lobby state: Waiting for ready
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/ws/game")
|
||||
.WithWebSocketUpgrade()
|
||||
)
|
||||
.InScenario("GameSession")
|
||||
.WhenStateIs("Lobby")
|
||||
.RespondWith(Response.Create()
|
||||
.WithWebSocket(ws => ws
|
||||
.WithMessageHandler(async (msg, ctx) =>
|
||||
{
|
||||
var text = msg.Text?.ToLower() ?? string.Empty;
|
||||
|
||||
if (text == "ready")
|
||||
{
|
||||
ctx.SetScenarioState("Playing");
|
||||
await ctx.SendTextAsync("Game started! Type 'attack' to attack, 'defend' to defend, or 'quit' to exit.");
|
||||
}
|
||||
else if (text == "quit")
|
||||
{
|
||||
await ctx.SendTextAsync("You left the lobby. Goodbye!");
|
||||
await ctx.CloseAsync(WebSocketCloseStatus.NormalClosure, "Player quit");
|
||||
}
|
||||
else
|
||||
{
|
||||
await ctx.SendTextAsync("In lobby. Type 'ready' to start or 'quit' to leave.");
|
||||
}
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
// Playing state: Game is active
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/ws/game")
|
||||
.WithWebSocketUpgrade()
|
||||
)
|
||||
.InScenario("GameSession")
|
||||
.WhenStateIs("Playing")
|
||||
.RespondWith(Response.Create()
|
||||
.WithWebSocket(ws => ws
|
||||
.WithMessageHandler(async (msg, ctx) =>
|
||||
{
|
||||
var text = msg.Text?.ToLower() ?? string.Empty;
|
||||
|
||||
if (text == "attack")
|
||||
{
|
||||
await ctx.SendTextAsync("You attacked! Critical hit! 💥");
|
||||
}
|
||||
else if (text == "defend")
|
||||
{
|
||||
await ctx.SendTextAsync("You defended! Shield up! 🛡️");
|
||||
}
|
||||
else if (text == "quit")
|
||||
{
|
||||
ctx.SetScenarioState("GameOver");
|
||||
await ctx.SendTextAsync("Game over! Thanks for playing.");
|
||||
await ctx.CloseAsync(WebSocketCloseStatus.NormalClosure, "Game ended");
|
||||
}
|
||||
else
|
||||
{
|
||||
await ctx.SendTextAsync("Unknown action. Type 'attack', 'defend', or 'quit'.");
|
||||
}
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
Console.WriteLine($"Game server listening at: {server.Urls[0]}/ws/game");
|
||||
Console.WriteLine("\nConnect and follow the game flow:");
|
||||
Console.WriteLine(" wscat -c ws://localhost:9091/ws/game");
|
||||
Console.WriteLine("\nGame flow: Lobby -> Type 'ready' -> Playing -> Type 'attack'/'defend' -> Type 'quit'");
|
||||
Console.WriteLine("\nPress any key to stop server...");
|
||||
Console.ReadKey();
|
||||
server.Stop();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Example 5: WebSocket Proxy
|
||||
/// Proxies WebSocket connections to another server
|
||||
/// </summary>
|
||||
private static async Task RunProxyExample()
|
||||
{
|
||||
Console.WriteLine("\n=== WebSocket Proxy Example ===");
|
||||
Console.WriteLine("Starting WebSocket proxy server...\n");
|
||||
|
||||
var server = WireMockServer.Start(new WireMockServerSettings
|
||||
{
|
||||
Port = 9091,
|
||||
Logger = new WireMockConsoleLogger()
|
||||
});
|
||||
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/ws/proxy")
|
||||
.WithWebSocketUpgrade()
|
||||
)
|
||||
.RespondWith(Response.Create()
|
||||
.WithWebSocketProxy("ws://echo.websocket.org")
|
||||
);
|
||||
|
||||
Console.WriteLine($"Proxy server listening at: {server.Urls[0]}/ws/proxy");
|
||||
Console.WriteLine("Proxying to: ws://echo.websocket.org");
|
||||
Console.WriteLine("\nTest with:");
|
||||
Console.WriteLine(" wscat -c ws://localhost:9091/ws/proxy");
|
||||
Console.WriteLine("\nPress any key to stop server...");
|
||||
Console.ReadKey();
|
||||
server.Stop();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Example 6: Multiple WebSocket Endpoints
|
||||
/// Demonstrates running multiple WebSocket endpoints simultaneously
|
||||
/// </summary>
|
||||
private static async Task RunMultipleEndpointsExample()
|
||||
{
|
||||
Console.WriteLine("\n=== Multiple WebSocket Endpoints Example ===");
|
||||
Console.WriteLine("Starting server with multiple WebSocket endpoints...\n");
|
||||
|
||||
var server = WireMockServer.Start(new WireMockServerSettings
|
||||
{
|
||||
Port = 9091,
|
||||
Logger = new WireMockConsoleLogger(),
|
||||
WebSocketSettings = new WebSocketSettings
|
||||
{
|
||||
MaxConnections = 100,
|
||||
KeepAliveIntervalSeconds = 30
|
||||
}
|
||||
});
|
||||
|
||||
// Endpoint 1: Echo
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/ws/echo")
|
||||
.WithWebSocketUpgrade()
|
||||
)
|
||||
.RespondWith(Response.Create()
|
||||
.WithWebSocket(ws => ws.WithEcho())
|
||||
);
|
||||
|
||||
// Endpoint 2: Time service
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/ws/time")
|
||||
.WithWebSocketUpgrade()
|
||||
)
|
||||
.RespondWith(Response.Create()
|
||||
.WithWebSocket(ws => ws
|
||||
.WithMessageHandler(async (msg, ctx) =>
|
||||
{
|
||||
await ctx.SendTextAsync($"Server time: {DateTime.UtcNow:yyyy-MM-dd HH:mm:ss} UTC");
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
// Endpoint 3: JSON service
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/ws/json")
|
||||
.WithWebSocketUpgrade()
|
||||
)
|
||||
.RespondWith(Response.Create()
|
||||
.WithWebSocket(ws => ws
|
||||
.WithMessageHandler(async (msg, ctx) =>
|
||||
{
|
||||
var response = new
|
||||
{
|
||||
timestamp = DateTime.UtcNow,
|
||||
message = msg.Text,
|
||||
length = msg.Text?.Length ?? 0,
|
||||
type = msg.MessageType.ToString()
|
||||
};
|
||||
await ctx.SendJsonAsync(response);
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
// Endpoint 4: Protocol-specific
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/ws/protocol")
|
||||
.WithWebSocketUpgrade("chat", "superchat")
|
||||
)
|
||||
.RespondWith(Response.Create()
|
||||
.WithWebSocket(ws => ws
|
||||
.WithAcceptProtocol("chat")
|
||||
.WithMessageHandler(async (msg, ctx) =>
|
||||
{
|
||||
await ctx.SendTextAsync($"Using protocol: chat. Message: {msg.Text}");
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
Console.WriteLine("Available WebSocket endpoints:");
|
||||
Console.WriteLine($" 1. Echo: {server.Urls[0]}/ws/echo");
|
||||
Console.WriteLine($" 2. Time: {server.Urls[0]}/ws/time");
|
||||
Console.WriteLine($" 3. JSON: {server.Urls[0]}/ws/json");
|
||||
Console.WriteLine($" 4. Protocol: {server.Urls[0]}/ws/protocol");
|
||||
Console.WriteLine("\nTest with wscat:");
|
||||
Console.WriteLine(" wscat -c ws://localhost:9091/ws/echo");
|
||||
Console.WriteLine(" wscat -c ws://localhost:9091/ws/time");
|
||||
Console.WriteLine(" wscat -c ws://localhost:9091/ws/json");
|
||||
Console.WriteLine(" wscat -c ws://localhost:9091/ws/protocol -s chat");
|
||||
Console.WriteLine("\nPress any key to stop server...");
|
||||
Console.ReadKey();
|
||||
server.Stop();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Example 7: Run All Examples
|
||||
/// Starts a server with all example endpoints
|
||||
/// </summary>
|
||||
private static async Task RunAllExamples()
|
||||
{
|
||||
Console.WriteLine("\n=== All Examples Running ===");
|
||||
Console.WriteLine("Starting server with all WebSocket endpoints...\n");
|
||||
|
||||
var server = WireMockServer.Start(new WireMockServerSettings
|
||||
{
|
||||
Port = 9091,
|
||||
Logger = new WireMockConsoleLogger(),
|
||||
WebSocketSettings = new WebSocketSettings
|
||||
{
|
||||
MaxConnections = 200
|
||||
}
|
||||
});
|
||||
|
||||
SetupAllEndpoints(server);
|
||||
|
||||
Console.WriteLine("All WebSocket endpoints are running:");
|
||||
Console.WriteLine($" Echo: {server.Urls[0]}/ws/echo");
|
||||
Console.WriteLine($" Chat: {server.Urls[0]}/ws/chat");
|
||||
Console.WriteLine($" Broadcast: {server.Urls[0]}/ws/broadcast");
|
||||
Console.WriteLine($" Game: {server.Urls[0]}/ws/game");
|
||||
Console.WriteLine($" Time: {server.Urls[0]}/ws/time");
|
||||
Console.WriteLine($" JSON: {server.Urls[0]}/ws/json");
|
||||
Console.WriteLine("\nServer statistics:");
|
||||
Console.WriteLine($" Total mappings: {server.Mappings.Count}");
|
||||
|
||||
Console.WriteLine("\nPress any key to view connection stats or CTRL+C to exit...");
|
||||
|
||||
while (true)
|
||||
{
|
||||
Console.ReadKey(true);
|
||||
var connections = server.GetWebSocketConnections();
|
||||
Console.WriteLine($"\nActive WebSocket connections: {connections.Count}");
|
||||
foreach (var conn in connections)
|
||||
{
|
||||
Console.WriteLine($" - {conn.ConnectionId}: {conn.RequestMessage.Path} (State: {conn.WebSocket.State})");
|
||||
}
|
||||
Console.WriteLine("\nPress any key to refresh or CTRL+C to exit...");
|
||||
}
|
||||
}
|
||||
|
||||
private static void SetupAllEndpoints(WireMockServer server)
|
||||
{
|
||||
// Echo endpoint
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/ws/echo")
|
||||
.WithWebSocketUpgrade()
|
||||
)
|
||||
.RespondWith(Response.Create()
|
||||
.WithWebSocket(ws => ws.WithEcho())
|
||||
);
|
||||
|
||||
// Chat endpoint
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/ws/chat")
|
||||
.WithWebSocketUpgrade()
|
||||
)
|
||||
.RespondWith(Response.Create()
|
||||
.WithWebSocket(ws => ws
|
||||
.WithMessageHandler(async (message, context) =>
|
||||
{
|
||||
if (message.MessageType == WebSocketMessageType.Text)
|
||||
{
|
||||
await context.SendTextAsync($"Echo: {message.Text}");
|
||||
}
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
// Broadcast endpoint
|
||||
var broadcastGuid = Guid.NewGuid();
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/ws/broadcast")
|
||||
.WithWebSocketUpgrade()
|
||||
)
|
||||
.WithGuid(broadcastGuid)
|
||||
.RespondWith(Response.Create()
|
||||
.WithWebSocket(ws => ws
|
||||
.WithBroadcast()
|
||||
.WithMessageHandler(async (message, context) =>
|
||||
{
|
||||
if (message.MessageType == WebSocketMessageType.Text)
|
||||
{
|
||||
await context.BroadcastTextAsync($"[Broadcast] {message.Text}");
|
||||
}
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
// Game scenario endpoint
|
||||
SetupGameScenario(server);
|
||||
|
||||
// Time endpoint
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/ws/time")
|
||||
.WithWebSocketUpgrade()
|
||||
)
|
||||
.RespondWith(Response.Create()
|
||||
.WithWebSocket(ws => ws
|
||||
.WithMessageHandler(async (msg, ctx) =>
|
||||
{
|
||||
await ctx.SendTextAsync($"Server time: {DateTime.UtcNow:yyyy-MM-dd HH:mm:ss} UTC");
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
// JSON endpoint
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/ws/json")
|
||||
.WithWebSocketUpgrade()
|
||||
)
|
||||
.RespondWith(Response.Create()
|
||||
.WithWebSocket(ws => ws
|
||||
.WithMessageHandler(async (msg, ctx) =>
|
||||
{
|
||||
var response = new
|
||||
{
|
||||
timestamp = DateTime.UtcNow,
|
||||
message = msg.Text,
|
||||
connectionId = ctx.ConnectionId
|
||||
};
|
||||
await ctx.SendJsonAsync(response);
|
||||
})
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
private static void SetupGameScenario(WireMockServer server)
|
||||
{
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/ws/game")
|
||||
.WithWebSocketUpgrade()
|
||||
)
|
||||
.InScenario("GameSession")
|
||||
.WillSetStateTo("Lobby")
|
||||
.RespondWith(Response.Create()
|
||||
.WithWebSocket(ws => ws
|
||||
.WithMessageHandler(async (msg, ctx) =>
|
||||
{
|
||||
await ctx.SendTextAsync("Welcome! Type 'ready' to start.");
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
server
|
||||
.Given(Request.Create()
|
||||
.WithPath("/ws/game")
|
||||
.WithWebSocketUpgrade()
|
||||
)
|
||||
.InScenario("GameSession")
|
||||
.WhenStateIs("Lobby")
|
||||
.RespondWith(Response.Create()
|
||||
.WithWebSocket(ws => ws
|
||||
.WithMessageHandler(async (msg, ctx) =>
|
||||
{
|
||||
if (msg.Text?.ToLower() == "ready")
|
||||
{
|
||||
ctx.SetScenarioState("Playing");
|
||||
await ctx.SendTextAsync("Game started!");
|
||||
}
|
||||
})
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
// Helper methods for testing
|
||||
private static async Task TestWebSocketEcho(string baseUrl)
|
||||
{
|
||||
try
|
||||
{
|
||||
using var client = new ClientWebSocket();
|
||||
var uri = new Uri($"{baseUrl.Replace("http://", "ws://")}/ws/echo");
|
||||
|
||||
Console.WriteLine($"\nConnecting to {uri}...");
|
||||
await client.ConnectAsync(uri, CancellationToken.None);
|
||||
Console.WriteLine("Connected!");
|
||||
|
||||
var testMessages = new[] { "Hello", "World", "WebSocket", "Test" };
|
||||
|
||||
foreach (var testMessage in testMessages)
|
||||
{
|
||||
Console.WriteLine($"\nSending: {testMessage}");
|
||||
var bytes = Encoding.UTF8.GetBytes(testMessage);
|
||||
await client.SendAsync(new ArraySegment<byte>(bytes), WebSocketMessageType.Text, true, CancellationToken.None);
|
||||
|
||||
var buffer = new byte[1024];
|
||||
var result = await client.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
|
||||
var received = Encoding.UTF8.GetString(buffer, 0, result.Count);
|
||||
Console.WriteLine($"Received: {received}");
|
||||
}
|
||||
|
||||
await client.CloseAsync(WebSocketCloseStatus.NormalClosure, "Test complete", CancellationToken.None);
|
||||
Console.WriteLine("\nTest completed successfully!");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"\nTest failed: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task TestWebSocketChat(string baseUrl)
|
||||
{
|
||||
try
|
||||
{
|
||||
using var client = new ClientWebSocket();
|
||||
var uri = new Uri($"{baseUrl.Replace("http://", "ws://")}/ws/chat");
|
||||
|
||||
Console.WriteLine($"\nConnecting to {uri}...");
|
||||
await client.ConnectAsync(uri, CancellationToken.None);
|
||||
Console.WriteLine("Connected!");
|
||||
|
||||
var commands = new[] { "/help", "/time", "/echo Hello", "/upper test", "/reverse hello" };
|
||||
|
||||
foreach (var command in commands)
|
||||
{
|
||||
Console.WriteLine($"\nSending: {command}");
|
||||
var bytes = Encoding.UTF8.GetBytes(command);
|
||||
await client.SendAsync(new ArraySegment<byte>(bytes), WebSocketMessageType.Text, true, CancellationToken.None);
|
||||
|
||||
var buffer = new byte[1024];
|
||||
var result = await client.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
|
||||
var received = Encoding.UTF8.GetString(buffer, 0, result.Count);
|
||||
Console.WriteLine($"Received: {received}");
|
||||
|
||||
await Task.Delay(500);
|
||||
}
|
||||
|
||||
await client.CloseAsync(WebSocketCloseStatus.NormalClosure, "Test complete", CancellationToken.None);
|
||||
Console.WriteLine("\nTest completed successfully!");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"\nTest failed: {ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
156
examples/WireMock.Net.WebSocketExamples/README.md
Normal file
156
examples/WireMock.Net.WebSocketExamples/README.md
Normal file
@@ -0,0 +1,156 @@
|
||||
# WireMock.Net WebSocket Examples
|
||||
|
||||
This project demonstrates all the WebSocket capabilities of WireMock.Net.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- .NET 8.0 SDK
|
||||
- Optional: `wscat` for manual testing (`npm install -g wscat`)
|
||||
|
||||
## Running the Examples
|
||||
|
||||
```bash
|
||||
cd examples/WireMock.Net.WebSocketExamples
|
||||
dotnet run
|
||||
```
|
||||
|
||||
## Available Examples
|
||||
|
||||
### 1. Echo Server
|
||||
Simple WebSocket echo server that returns all messages back to the client.
|
||||
|
||||
**Test with:**
|
||||
```bash
|
||||
wscat -c ws://localhost:9091/ws/echo
|
||||
```
|
||||
|
||||
### 2. Custom Message Handler
|
||||
Chat server with commands: `/help`, `/time`, `/echo`, `/upper`, `/reverse`, `/quit`
|
||||
|
||||
**Test with:**
|
||||
```bash
|
||||
wscat -c ws://localhost:9091/ws/chat
|
||||
> /help
|
||||
> /time
|
||||
> /echo Hello World
|
||||
> /upper test
|
||||
> /reverse hello
|
||||
```
|
||||
|
||||
### 3. Broadcast Server
|
||||
Messages sent by any client are broadcast to all connected clients.
|
||||
|
||||
**Test with multiple terminals:**
|
||||
```bash
|
||||
# Terminal 1
|
||||
wscat -c ws://localhost:9091/ws/broadcast
|
||||
|
||||
# Terminal 2
|
||||
wscat -c ws://localhost:9091/ws/broadcast
|
||||
|
||||
# Terminal 3
|
||||
wscat -c ws://localhost:9091/ws/broadcast
|
||||
```
|
||||
|
||||
Type messages in any terminal and see them appear in all terminals.
|
||||
|
||||
### 4. Scenario/State Machine
|
||||
Game server with state transitions: Lobby -> Playing -> GameOver
|
||||
|
||||
**Test with:**
|
||||
```bash
|
||||
wscat -c ws://localhost:9091/ws/game
|
||||
> ready
|
||||
> attack
|
||||
> defend
|
||||
> quit
|
||||
```
|
||||
|
||||
### 5. WebSocket Proxy
|
||||
Proxies WebSocket connections to echo.websocket.org
|
||||
|
||||
**Test with:**
|
||||
```bash
|
||||
wscat -c ws://localhost:9091/ws/proxy
|
||||
```
|
||||
|
||||
### 6. Multiple Endpoints
|
||||
Runs multiple WebSocket endpoints simultaneously:
|
||||
- `/ws/echo` - Echo server
|
||||
- `/ws/time` - Returns server time
|
||||
- `/ws/json` - Returns JSON responses
|
||||
- `/ws/protocol` - Protocol-specific endpoint
|
||||
|
||||
### 7. All Examples
|
||||
Runs all endpoints at once with connection statistics.
|
||||
|
||||
## Features Demonstrated
|
||||
|
||||
- ✅ **Echo Server** - Simple message echo
|
||||
- ✅ **Custom Handlers** - Complex message processing
|
||||
- ✅ **Broadcast** - Multi-client communication
|
||||
- ✅ **Scenarios** - State machine patterns
|
||||
- ✅ **Proxy** - Forwarding to real WebSocket servers
|
||||
- ✅ **Protocol Negotiation** - Sec-WebSocket-Protocol support
|
||||
- ✅ **JSON Messaging** - Structured data exchange
|
||||
- ✅ **Connection Management** - Track and manage connections
|
||||
- ✅ **Configuration** - Custom WebSocket settings
|
||||
|
||||
## Testing with wscat
|
||||
|
||||
Install wscat globally:
|
||||
```bash
|
||||
npm install -g wscat
|
||||
```
|
||||
|
||||
Basic usage:
|
||||
```bash
|
||||
# Connect to endpoint
|
||||
wscat -c ws://localhost:9091/ws/echo
|
||||
|
||||
# Connect with protocol
|
||||
wscat -c ws://localhost:9091/ws/protocol -s chat
|
||||
|
||||
# Connect with headers
|
||||
wscat -c ws://localhost:9091/ws/echo -H "X-Custom-Header: value"
|
||||
```
|
||||
|
||||
## Testing with C# Client
|
||||
|
||||
The examples include built-in C# WebSocket clients for automated testing.
|
||||
Select options 1 or 2 and press any key to run the automated tests.
|
||||
|
||||
## Configuration
|
||||
|
||||
WebSocket settings can be configured:
|
||||
|
||||
```csharp
|
||||
var server = WireMockServer.Start(new WireMockServerSettings
|
||||
{
|
||||
Port = 9091,
|
||||
WebSocketSettings = new WebSocketSettings
|
||||
{
|
||||
MaxConnections = 100,
|
||||
ReceiveBufferSize = 8192,
|
||||
MaxMessageSize = 1048576,
|
||||
KeepAliveInterval = TimeSpan.FromSeconds(30),
|
||||
CloseTimeout = TimeSpan.FromMinutes(10),
|
||||
EnableCompression = true
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
## Monitoring
|
||||
|
||||
When running "All Examples" (option 7), press any key to view:
|
||||
- Active connection count
|
||||
- Connection IDs
|
||||
- Request paths
|
||||
- WebSocket states
|
||||
|
||||
## Notes
|
||||
|
||||
- All examples run on port 9091 by default
|
||||
- Press CTRL+C to stop the server
|
||||
- Multiple clients can connect simultaneously
|
||||
- Connection states are tracked and can be queried
|
||||
@@ -0,0 +1,18 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<AssemblyName>WireMock.Net.WebSocketExamples</AssemblyName>
|
||||
<RootNamespace>WireMock.Net.WebSocketExamples</RootNamespace>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\src\WireMock.Net\WireMock.Net.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -1,25 +1,25 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<AzureFunctionsVersion>v4</AzureFunctionsVersion>
|
||||
<UserSecretsId>bb7d8355-68c4-4f81-8c2d-6cdd80cd7602</UserSecretsId>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Azure.Storage.Blobs" Version="12.14.1" />
|
||||
<PackageReference Include="Azure.Storage.Files.Shares" Version="12.12.1" />
|
||||
<PackageReference Include="Azure.Storage.Queues" Version="12.12.0" />
|
||||
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Storage" Version="4.0.5" />
|
||||
<PackageReference Include="Microsoft.Extensions.Azure" Version="1.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="6.0.1" />
|
||||
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.1.3" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Update="host.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Update="local.settings.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<AzureFunctionsVersion>v4</AzureFunctionsVersion>
|
||||
<UserSecretsId>bb7d8355-68c4-4f81-8c2d-6cdd80cd7602</UserSecretsId>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Azure.Storage.Blobs" Version="12.14.1" />
|
||||
<PackageReference Include="Azure.Storage.Files.Shares" Version="12.12.1" />
|
||||
<PackageReference Include="Azure.Storage.Queues" Version="12.12.0" />
|
||||
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Storage" Version="4.0.5" />
|
||||
<PackageReference Include="Microsoft.Extensions.Azure" Version="1.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="6.0.1" />
|
||||
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.1.3" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Update="host.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Update="local.settings.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -8,6 +8,12 @@ namespace WireMock.Admin.Mappings;
|
||||
[FluentBuilder.AutoGenerateBuilder]
|
||||
public class BodyModel
|
||||
{
|
||||
/// <summary>
|
||||
/// The name of the body matcher.
|
||||
/// Currently only "MultiPartMatcher" is supported.
|
||||
/// </summary>
|
||||
public string? MatcherName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the matcher.
|
||||
/// </summary>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// Copyright © WireMock.Net
|
||||
|
||||
using System.Collections.Generic;
|
||||
using WireMock.Matchers.Request;
|
||||
|
||||
namespace WireMock.Admin.Requests;
|
||||
|
||||
@@ -47,5 +48,5 @@ public class LogRequestMatchModel
|
||||
/// <value>
|
||||
/// The match details.
|
||||
/// </value>
|
||||
public IList<object> MatchDetails { get; set; }
|
||||
public IList<MatchDetail> MatchDetails { get; set; } = [];
|
||||
}
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Text.RegularExpressions;
|
||||
using JetBrains.Annotations;
|
||||
using WireMock.Handlers;
|
||||
using WireMock.Types;
|
||||
|
||||
@@ -123,7 +122,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 +131,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; }
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -2,9 +2,7 @@
|
||||
|
||||
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 +116,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 +165,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
|
||||
}
|
||||
@@ -55,4 +55,11 @@ public interface IRequestMatchResult : IComparable
|
||||
/// <param name="exception">The exception [Optional].</param>
|
||||
/// <returns>The score.</returns>
|
||||
double AddScore(Type matcherType, double score, Exception? exception);
|
||||
|
||||
/// <summary>
|
||||
/// Adds the score.
|
||||
/// </summary>
|
||||
/// <param name="matchDetail">The matchDetail.</param>
|
||||
/// <returns>The score.</returns>
|
||||
double AddMatchDetail(MatchDetail matchDetail);
|
||||
}
|
||||
@@ -12,7 +12,12 @@ public class MatchDetail
|
||||
/// <summary>
|
||||
/// Gets or sets the type of the matcher.
|
||||
/// </summary>
|
||||
public Type MatcherType { get; set; } = null!;
|
||||
public required Type MatcherType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the type of the matcher.
|
||||
/// </summary>
|
||||
public required string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the score between 0.0 and 1.0
|
||||
@@ -24,4 +29,9 @@ public class MatchDetail
|
||||
/// [Optional]
|
||||
/// </summary>
|
||||
public Exception? Exception { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The child MatchResults in case of multiple matchers.
|
||||
/// </summary>
|
||||
public MatchDetail[]? MatchDetails { get; set; }
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -4,7 +4,8 @@
|
||||
<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>net45;net451;net461;netstandard1.3;netstandard2.0;netstandard2.1</TargetFrameworks>-->
|
||||
<TargetFrameworks>net48;net8.0</TargetFrameworks>
|
||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||
<NoWarn>$(NoWarn);1591;8603</NoWarn>
|
||||
<AssemblyName>WireMock.Net.Abstractions</AssemblyName>
|
||||
@@ -33,32 +34,22 @@
|
||||
<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">
|
||||
<PackageReference Include="FluentBuilder" Version="0.13.0">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="PolySharp" Version="1.15.0">
|
||||
|
||||
<!-- Keep at 6.14.0 -->
|
||||
<PackageReference Include="Polyfill" Version="6.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>
|
||||
|
||||
</Project>
|
||||
@@ -38,7 +38,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.2" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Aspire.Hosting" Version="9.2.0" />
|
||||
<PackageReference Include="Aspire.Hosting" Version="13.1.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -79,6 +79,22 @@ public class WireMockServerArguments
|
||||
/// </summary>
|
||||
public Dictionary<string, string[]> ProtoDefinitions { get; set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether OpenTelemetry tracing is enabled.
|
||||
/// When enabled, WireMock.Net will emit distributed traces for request processing.
|
||||
/// Default value is <c>false</c>.
|
||||
/// </summary>
|
||||
public bool OpenTelemetryEnabled { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the OTLP exporter endpoint URL.
|
||||
/// When set, traces will be exported to this endpoint using the OTLP protocol.
|
||||
/// Example: "http://localhost:4317" for gRPC or "http://localhost:4318" for HTTP.
|
||||
/// If not set, the OTLP exporter will use the <c>OTEL_EXPORTER_OTLP_ENDPOINT</c> environment variable,
|
||||
/// or fall back to the default endpoint (<c>http://localhost:4317</c> for gRPC).
|
||||
/// </summary>
|
||||
public string? OpenTelemetryOtlpExporterEndpoint { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Add an additional Urls on which WireMock should listen.
|
||||
/// </summary>
|
||||
@@ -138,6 +154,20 @@ public class WireMockServerArguments
|
||||
Add(args, "--WatchStaticMappingsInSubdirectories", "true");
|
||||
}
|
||||
|
||||
if (OpenTelemetryEnabled)
|
||||
{
|
||||
// Enable activity tracing (creates System.Diagnostics.Activity objects)
|
||||
Add(args, "--ActivityTracingEnabled", "true");
|
||||
|
||||
// Enable OpenTelemetry exporter
|
||||
Add(args, "--OpenTelemetryEnabled", "true");
|
||||
|
||||
if (!string.IsNullOrEmpty(OpenTelemetryOtlpExporterEndpoint))
|
||||
{
|
||||
Add(args, "--OpenTelemetryOtlpExporterEndpoint", OpenTelemetryOtlpExporterEndpoint);
|
||||
}
|
||||
}
|
||||
|
||||
if (AdditionalUrls.Count > 0)
|
||||
{
|
||||
Add(args, "--Urls", $"http://*:{HttpContainerPort} {string.Join(' ', AdditionalUrls)}");
|
||||
|
||||
@@ -287,6 +287,40 @@ public static class WireMockServerBuilderExtensions
|
||||
return wiremock;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Configures OpenTelemetry distributed tracing for the WireMock.Net server.
|
||||
/// This enables automatic trace export to the Aspire dashboard.
|
||||
/// </summary>
|
||||
/// <param name="wiremock">The <see cref="IResourceBuilder{WireMockServerResource}"/>.</param>
|
||||
/// <returns>A reference to the <see cref="IResourceBuilder{WireMockServerResource}"/>.</returns>
|
||||
/// <remarks>
|
||||
/// When enabled, WireMock.Net will emit distributed traces for each request processed,
|
||||
/// including information about:
|
||||
/// <list type="bullet">
|
||||
/// <item>HTTP method, URL, and status code</item>
|
||||
/// <item>Mapping match results and scores</item>
|
||||
/// <item>Request processing duration</item>
|
||||
/// </list>
|
||||
/// The traces will automatically appear in the Aspire dashboard.
|
||||
/// </remarks>
|
||||
public static IResourceBuilder<WireMockServerResource> WithOpenTelemetry(this IResourceBuilder<WireMockServerResource> wiremock)
|
||||
{
|
||||
Guard.NotNull(wiremock);
|
||||
|
||||
// Enable OpenTelemetry in WireMock server arguments
|
||||
wiremock.Resource.Arguments.OpenTelemetryEnabled = true;
|
||||
|
||||
// Use Aspire's standard WithOtlpExporter to configure OTEL environment variables for the container
|
||||
// This sets OTEL_EXPORTER_OTLP_ENDPOINT which the OTLP exporter reads automatically
|
||||
var containerBuilder = wiremock as IResourceBuilder<ContainerResource>;
|
||||
if (containerBuilder != null)
|
||||
{
|
||||
containerBuilder.WithOtlpExporter();
|
||||
}
|
||||
|
||||
return wiremock;
|
||||
}
|
||||
|
||||
private static Task<ExecuteCommandResult> OnRunOpenInspectorCommandAsync(IResourceBuilder<WireMockServerResource> builder)
|
||||
{
|
||||
WireMockInspector.Inspect(builder.Resource.GetEndpoint().Url);
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<Description>AwesomeAssertions extensions for WireMock.Net</Description>
|
||||
<AssemblyTitle>WireMock.Net.AwesomeAssertions</AssemblyTitle>
|
||||
<Authors>Francesco Venturoli;Mahmoud Ali;Stef Heyenrath</Authors>
|
||||
<TargetFrameworks>net47;netstandard2.0;netstandard2.1</TargetFrameworks>
|
||||
<!--<TargetFrameworks>net47;netstandard2.0;netstandard2.1</TargetFrameworks>-->
|
||||
<TargetFrameworks>net48;net8.0</TargetFrameworks>
|
||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||
<AssemblyName>WireMock.Net.AwesomeAssertions</AssemblyName>
|
||||
<PackageId>WireMock.Net.AwesomeAssertions</PackageId>
|
||||
@@ -32,7 +33,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="AwesomeAssertions" Version="9.0.0" />
|
||||
<PackageReference Include="AwesomeAssertions" Version="9.1.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -21,4 +21,4 @@ public sealed class WireMockRequestInfo<TBody> : WireMockRequestInfo
|
||||
/// Gets or initializes the deserialized request body.
|
||||
/// </summary>
|
||||
public TBody? Body { get; init; }
|
||||
}
|
||||
}
|
||||
@@ -25,10 +25,10 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="JsonConverter.Newtonsoft.Json" Version="0.7.0" />
|
||||
<PackageReference Include="JsonConverter.Newtonsoft.Json" Version="0.7.2" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\WireMock.Net.Minimal\WireMock.Net.Minimal.csproj" />
|
||||
<ProjectReference Include="..\WireMock.Net.Minimal\WireMock.Net.Minimal.csproj" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -1,10 +1,11 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<Description>FluentAssertions extensions for WireMock.Net</Description>
|
||||
<AssemblyTitle>WireMock.Net.FluentAssertions</AssemblyTitle>
|
||||
<Authors>Mahmoud Ali;Stef Heyenrath</Authors>
|
||||
<TargetFrameworks>net451;net47;netstandard1.3;netstandard2.0;netstandard2.1</TargetFrameworks>
|
||||
<!--<TargetFrameworks>net451;net47;netstandard1.3;netstandard2.0;netstandard2.1</TargetFrameworks>-->
|
||||
<TargetFrameworks>net48;net8.0</TargetFrameworks>
|
||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||
<AssemblyName>WireMock.Net.FluentAssertions</AssemblyName>
|
||||
<PackageId>WireMock.Net.FluentAssertions</PackageId>
|
||||
@@ -31,12 +32,8 @@
|
||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup Condition="'$(TargetFramework)' == 'net451' or '$(TargetFramework)' == 'netstandard1.3'">
|
||||
<PackageReference Include="FluentAssertions" Version="5.10.3" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup Condition="'$(TargetFramework)' != 'net451' and '$(TargetFramework)' != 'netstandard1.3'">
|
||||
<PackageReference Include="FluentAssertions" Version="6.5.1" />
|
||||
<ItemGroup>
|
||||
<PackageReference Include="FluentAssertions" Version="7.2.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -140,7 +140,7 @@ public class GraphQLMatcher : IGraphQLMatcher
|
||||
}
|
||||
}
|
||||
|
||||
return new MatchResult(MatchBehaviourHelper.Convert(MatchBehaviour, score), exception);
|
||||
return MatchResult.From(Name, MatchBehaviourHelper.Convert(MatchBehaviour, score), exception);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
<Description>GraphQL support for WireMock.Net</Description>
|
||||
<AssemblyTitle>WireMock.Net.Matchers.GraphQL</AssemblyTitle>
|
||||
<Authors>Stef Heyenrath</Authors>
|
||||
<TargetFrameworks>netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0;net6.0;net8.0</TargetFrameworks>
|
||||
<!--<TargetFrameworks>netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0;net6.0;net8.0</TargetFrameworks>-->
|
||||
<TargetFrameworks>net48;net8.0</TargetFrameworks>
|
||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||
<PackageTags>wiremock;matchers;matcher;graphql</PackageTags>
|
||||
<RootNamespace>WireMock</RootNamespace>
|
||||
@@ -26,22 +27,11 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="GraphQL.NewtonsoftJson" Version="8.2.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
|
||||
<PackageReference Include="System.Reflection.Emit" Version="4.3.0" />
|
||||
<PackageReference Include="GraphQL.NewtonsoftJson" Version="8.5.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\WireMock.Net.Shared\WireMock.Net.Shared.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
|
||||
<PackageReference Include="Nullable" Version="1.3.1">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -97,7 +97,7 @@ public class CSharpCodeMatcher : ICSharpCodeMatcher
|
||||
}
|
||||
}
|
||||
|
||||
return new MatchResult(MatchBehaviourHelper.Convert(MatchBehaviour, score), exception);
|
||||
return MatchResult.From(Name, MatchBehaviourHelper.Convert(MatchBehaviour, score), exception);
|
||||
}
|
||||
|
||||
private bool IsMatch(dynamic input, string pattern)
|
||||
@@ -108,72 +108,72 @@ public class CSharpCodeMatcher : ICSharpCodeMatcher
|
||||
|
||||
object? result;
|
||||
|
||||
#if (NET451 || NET452)
|
||||
var compilerParams = new System.CodeDom.Compiler.CompilerParameters
|
||||
{
|
||||
GenerateInMemory = true,
|
||||
GenerateExecutable = false,
|
||||
ReferencedAssemblies =
|
||||
{
|
||||
"System.dll",
|
||||
"System.Core.dll",
|
||||
"Microsoft.CSharp.dll",
|
||||
"Newtonsoft.Json.dll"
|
||||
}
|
||||
};
|
||||
//#if (NET451 || NET452)
|
||||
// var compilerParams = new System.CodeDom.Compiler.CompilerParameters
|
||||
// {
|
||||
// GenerateInMemory = true,
|
||||
// GenerateExecutable = false,
|
||||
// ReferencedAssemblies =
|
||||
// {
|
||||
// "System.dll",
|
||||
// "System.Core.dll",
|
||||
// "Microsoft.CSharp.dll",
|
||||
// "Newtonsoft.Json.dll"
|
||||
// }
|
||||
// };
|
||||
|
||||
using (var codeProvider = new Microsoft.CSharp.CSharpCodeProvider())
|
||||
{
|
||||
var compilerResults = codeProvider.CompileAssemblyFromSource(compilerParams, source);
|
||||
// using (var codeProvider = new Microsoft.CSharp.CSharpCodeProvider())
|
||||
// {
|
||||
// var compilerResults = codeProvider.CompileAssemblyFromSource(compilerParams, source);
|
||||
|
||||
if (compilerResults.Errors.Count != 0)
|
||||
{
|
||||
var errors = from System.CodeDom.Compiler.CompilerError er in compilerResults.Errors select er.ToString();
|
||||
throw new WireMockException(string.Join(", ", errors));
|
||||
}
|
||||
// if (compilerResults.Errors.Count != 0)
|
||||
// {
|
||||
// var errors = from System.CodeDom.Compiler.CompilerError er in compilerResults.Errors select er.ToString();
|
||||
// throw new WireMockException(string.Join(", ", errors));
|
||||
// }
|
||||
|
||||
var helper = compilerResults.CompiledAssembly?.CreateInstance("CodeHelper");
|
||||
if (helper == null)
|
||||
{
|
||||
throw new WireMockException("CSharpCodeMatcher: Unable to create instance from WireMock.CodeHelper");
|
||||
}
|
||||
// var helper = compilerResults.CompiledAssembly?.CreateInstance("CodeHelper");
|
||||
// if (helper == null)
|
||||
// {
|
||||
// throw new WireMockException("CSharpCodeMatcher: Unable to create instance from WireMock.CodeHelper");
|
||||
// }
|
||||
|
||||
var methodInfo = helper.GetType().GetMethod("IsMatch");
|
||||
if (methodInfo == null)
|
||||
{
|
||||
throw new WireMockException("CSharpCodeMatcher: Unable to find method 'IsMatch' in WireMock.CodeHelper");
|
||||
}
|
||||
// var methodInfo = helper.GetType().GetMethod("IsMatch");
|
||||
// if (methodInfo == null)
|
||||
// {
|
||||
// throw new WireMockException("CSharpCodeMatcher: Unable to find method 'IsMatch' in WireMock.CodeHelper");
|
||||
// }
|
||||
|
||||
try
|
||||
{
|
||||
result = methodInfo.Invoke(helper, new[] { inputValue });
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new WireMockException("CSharpCodeMatcher: Unable to call method 'IsMatch' in WireMock.CodeHelper", ex);
|
||||
}
|
||||
}
|
||||
#elif (NET46 || NET461)
|
||||
dynamic script;
|
||||
try
|
||||
{
|
||||
script = CSScriptLibrary.CSScript.Evaluator.CompileCode(source).CreateObject("*");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new WireMockException("CSharpCodeMatcher: Unable to create compiler for WireMock.CodeHelper", ex);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
result = script.IsMatch(inputValue);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new WireMockException("CSharpCodeMatcher: Problem calling method 'IsMatch' in WireMock.CodeHelper", ex);
|
||||
}
|
||||
// try
|
||||
// {
|
||||
// result = methodInfo.Invoke(helper, new[] { inputValue });
|
||||
// }
|
||||
// catch (Exception ex)
|
||||
// {
|
||||
// throw new WireMockException("CSharpCodeMatcher: Unable to call method 'IsMatch' in WireMock.CodeHelper", ex);
|
||||
// }
|
||||
// }
|
||||
//#elif (NET46 || NET461)
|
||||
// dynamic script;
|
||||
// try
|
||||
// {
|
||||
// script = CSScriptLibrary.CSScript.Evaluator.CompileCode(source).CreateObject("*");
|
||||
// }
|
||||
// catch (Exception ex)
|
||||
// {
|
||||
// throw new WireMockException("CSharpCodeMatcher: Unable to create compiler for WireMock.CodeHelper", ex);
|
||||
// }
|
||||
|
||||
#elif (NETSTANDARD2_0 || NETSTANDARD2_1 || NETCOREAPP3_1 || NET5_0_OR_GREATER)
|
||||
// try
|
||||
// {
|
||||
// result = script.IsMatch(inputValue);
|
||||
// }
|
||||
// catch (Exception ex)
|
||||
// {
|
||||
// throw new WireMockException("CSharpCodeMatcher: Problem calling method 'IsMatch' in WireMock.CodeHelper", ex);
|
||||
// }
|
||||
|
||||
//#elif (NETSTANDARD2_0 || NETSTANDARD2_1 || NETCOREAPP3_1 || NET5_0_OR_GREATER || NET48)
|
||||
Assembly assembly;
|
||||
try
|
||||
{
|
||||
@@ -202,9 +202,9 @@ public class CSharpCodeMatcher : ICSharpCodeMatcher
|
||||
{
|
||||
throw new WireMockException("CSharpCodeMatcher: Problem calling method 'IsMatch' in WireMock.CodeHelper", ex);
|
||||
}
|
||||
#else
|
||||
throw new NotSupportedException("The 'CSharpCodeMatcher' cannot be used in netstandard 1.3");
|
||||
#endif
|
||||
//#else
|
||||
// throw new NotSupportedException("The 'CSharpCodeMatcher' cannot be used in netstandard 1.3");
|
||||
//#endif
|
||||
try
|
||||
{
|
||||
return (bool)result;
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
<Description>A CSharpCodeMatcher which can be used to match WireMock.Net Requests using C# code.</Description>
|
||||
<AssemblyTitle>WireMock.Net.Matchers.CSharpCode</AssemblyTitle>
|
||||
<Authors>Stef Heyenrath</Authors>
|
||||
<TargetFrameworks>net451;net452;net46;net461;netstandard1.3;netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0</TargetFrameworks>
|
||||
<!--<TargetFrameworks>net451;net452;net46;net461;netstandard1.3;netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0</TargetFrameworks>-->
|
||||
<TargetFrameworks>net48;net8.0</TargetFrameworks>
|
||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||
<PackageTags>wiremock;matchers;matcher;csharp;csharpcode</PackageTags>
|
||||
<RootNamespace>WireMock</RootNamespace>
|
||||
@@ -37,16 +38,8 @@
|
||||
<ProjectReference Include="..\WireMock.Net.Minimal\WireMock.Net.Minimal.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup Condition=" '$(TargetFramework)' == 'net451' or '$(TargetFramework)' == 'net452' ">
|
||||
<PackageReference Include="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" Version="3.6.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup Condition=" '$(TargetFramework)' == 'net46' or '$(TargetFramework)' == 'net461' ">
|
||||
<PackageReference Include="CS-Script" Version="3.30.3" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1' or '$(TargetFramework)' == 'netcoreapp3.1' or '$(TargetFramework)' == 'net5.0' or '$(TargetFramework)' == 'net6.0' or '$(TargetFramework)' == 'net7.0' or '$(TargetFramework)' == 'net8.0'">
|
||||
<PackageReference Include="CS-Script" Version="4.8.17" />
|
||||
<ItemGroup>
|
||||
<PackageReference Include="CS-Script" Version="4.11.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -1,6 +1,7 @@
|
||||
// Copyright © WireMock.Net
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using WireMock.Matchers.Helpers;
|
||||
using WireMock.Models.Mime;
|
||||
using WireMock.Util;
|
||||
@@ -12,7 +13,7 @@ namespace WireMock.Matchers;
|
||||
/// </summary>
|
||||
public class MimePartMatcher : IMimePartMatcher
|
||||
{
|
||||
private readonly Func<IMimePartData, MatchResult>[] _funcs;
|
||||
private readonly IList<(string Name, Func<IMimePartData, MatchResult> func)> _matcherFunctions;
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => nameof(MimePartMatcher);
|
||||
@@ -49,34 +50,47 @@ public class MimePartMatcher : IMimePartMatcher
|
||||
ContentTransferEncodingMatcher = contentTransferEncodingMatcher;
|
||||
ContentMatcher = contentMatcher;
|
||||
|
||||
_funcs =
|
||||
[
|
||||
mp => ContentTypeMatcher?.IsMatch(GetContentTypeAsString(mp.ContentType)) ?? MatchScores.Perfect,
|
||||
mp => ContentDispositionMatcher?.IsMatch(mp.ContentDisposition?.ToString()?.Replace("Content-Disposition: ", string.Empty)) ?? MatchScores.Perfect,
|
||||
mp => ContentTransferEncodingMatcher?.IsMatch(mp.ContentTransferEncoding.ToLowerInvariant()) ?? MatchScores.Perfect,
|
||||
MatchOnContent
|
||||
];
|
||||
_matcherFunctions = [];
|
||||
if (ContentTypeMatcher != null)
|
||||
{
|
||||
_matcherFunctions.Add((nameof(ContentTypeMatcher), mp => ContentTypeMatcher.IsMatch(GetContentTypeAsString(mp.ContentType))));
|
||||
}
|
||||
|
||||
if (ContentDispositionMatcher != null)
|
||||
{
|
||||
_matcherFunctions.Add((nameof(ContentDispositionMatcher), mp => ContentDispositionMatcher.IsMatch(mp.ContentDisposition?.ToString()?.Replace("Content-Disposition: ", string.Empty))));
|
||||
}
|
||||
|
||||
if (ContentTransferEncodingMatcher != null)
|
||||
{
|
||||
_matcherFunctions.Add((nameof(ContentTransferEncodingMatcher), mp => ContentTransferEncodingMatcher.IsMatch(mp.ContentTransferEncoding.ToLowerInvariant())));
|
||||
}
|
||||
|
||||
if (ContentMatcher != null)
|
||||
{
|
||||
_matcherFunctions.Add((ContentMatcher.Name, MatchOnContent));
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public MatchResult IsMatch(IMimePartData value)
|
||||
{
|
||||
var score = MatchScores.Mismatch;
|
||||
Exception? exception = null;
|
||||
var results = new List<MatchResult>();
|
||||
|
||||
try
|
||||
foreach (var matcherFunction in _matcherFunctions)
|
||||
{
|
||||
if (Array.TrueForAll(_funcs, func => func(value).IsPerfect()))
|
||||
try
|
||||
{
|
||||
score = MatchScores.Perfect;
|
||||
var matchResult = matcherFunction.func(value);
|
||||
results.Add(MatchResult.From(matcherFunction.Name, matchResult.Score));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
results.Add(MatchResult.From(matcherFunction.Name, MatchScores.Mismatch, ex));
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
exception = ex;
|
||||
}
|
||||
|
||||
return new MatchResult(MatchBehaviourHelper.Convert(MatchBehaviour, score), exception);
|
||||
return MatchResult.From(nameof(MimePartMatcher), results, MatchOperator.And);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
@@ -87,11 +101,6 @@ public class MimePartMatcher : IMimePartMatcher
|
||||
|
||||
private MatchResult MatchOnContent(IMimePartData mimePart)
|
||||
{
|
||||
if (ContentMatcher == null)
|
||||
{
|
||||
return MatchScores.Perfect;
|
||||
}
|
||||
|
||||
var bodyParserSettings = new BodyParserSettings
|
||||
{
|
||||
Stream = mimePart.Open(),
|
||||
@@ -102,7 +111,7 @@ public class MimePartMatcher : IMimePartMatcher
|
||||
};
|
||||
|
||||
var bodyData = BodyParser.ParseAsync(bodyParserSettings).ConfigureAwait(false).GetAwaiter().GetResult();
|
||||
return BodyDataMatchScoreCalculator.CalculateMatchScore(bodyData, ContentMatcher);
|
||||
return BodyDataMatchScoreCalculator.CalculateMatchScore(bodyData, ContentMatcher!);
|
||||
}
|
||||
|
||||
private static string? GetContentTypeAsString(IContentTypeData? contentType)
|
||||
|
||||
@@ -135,6 +135,6 @@ internal class MimeMessageDataWrapper : IMimeMessageData
|
||||
/// <inheritdoc/>
|
||||
public override string ToString()
|
||||
{
|
||||
return _message.ToString();
|
||||
return _message.ToString() ?? string.Empty;
|
||||
}
|
||||
}
|
||||
@@ -52,7 +52,7 @@ internal class MimeKitUtils : IMimeKitUtils
|
||||
return false;
|
||||
}
|
||||
|
||||
var fixedBytes = FixBytes(bytes, contentTypeHeader[0]);
|
||||
var fixedBytes = PrependContentTypeHeader(bytes, contentTypeHeader[0]);
|
||||
|
||||
mimeMessageData = LoadFromStream(new MemoryStream(fixedBytes));
|
||||
return true;
|
||||
@@ -68,7 +68,10 @@ internal class MimeKitUtils : IMimeKitUtils
|
||||
return contentTypeHeader.Any(ct => ct.TrimStart().StartsWith("multipart/", StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
private static byte[] FixBytes(byte[] bytes, WireMockList<string> contentType)
|
||||
/// <summary>
|
||||
/// Prepends the Content-Type header to the byte array to make it a valid MIME message for MimeKit.
|
||||
/// </summary>
|
||||
private static byte[] PrependContentTypeHeader(byte[] bytes, WireMockList<string> contentType)
|
||||
{
|
||||
var contentTypeBytes = Encoding.UTF8.GetBytes($"{HttpKnownHeaderNames.ContentType}: {contentType}\r\n\r\n");
|
||||
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
<Description>MultiPart Mime support for WireMock.Net using MimeKitLite</Description>
|
||||
<AssemblyTitle>WireMock.Net.MimePart</AssemblyTitle>
|
||||
<Authors>Stef Heyenrath</Authors>
|
||||
<TargetFrameworks>netstandard2.0;netstandard2.1;net462;net47;net48;net6.0;net8.0</TargetFrameworks>
|
||||
<!--<TargetFrameworks>netstandard2.0;netstandard2.1;net462;net47;net48;net6.0;net8.0</TargetFrameworks>-->
|
||||
<TargetFrameworks>net48;net8.0</TargetFrameworks>
|
||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||
<PackageTags>wiremock;matchers;matcher;mime;multipart;mimekit</PackageTags>
|
||||
<RootNamespace>WireMock</RootNamespace>
|
||||
@@ -36,24 +37,16 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Nullable" Version="1.3.1">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Stef.Validation" Version="0.1.1" />
|
||||
<PackageReference Include="Stef.Validation" Version="0.2.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<!--<ItemGroup>
|
||||
<PackageReference Include="MimeKitLite" Version="4.12.0" />
|
||||
</ItemGroup>-->
|
||||
|
||||
<ItemGroup Condition="'$(Configuration)' == 'Debug'">
|
||||
<PackageReference Include="MimeKitLite" Version="4.12.0" />
|
||||
<PackageReference Include="MimeKitLite" Version="4.13.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup Condition="'$(Configuration)' == 'Release'">
|
||||
<PackageReference Include="ILRepack.Lib.MSBuild.Task" Version="2.0.40" PrivateAssets="All" />
|
||||
<PackageReference Include="MimeKitLite" Version="4.12.0" PrivateAssets="All" />
|
||||
<PackageReference Include="ILRepack.Lib.MSBuild.Task" Version="2.0.43" PrivateAssets="All" />
|
||||
<PackageReference Include="MimeKitLite" Version="4.13.0" PrivateAssets="All" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
// Copyright © WireMock.Net
|
||||
|
||||
#if !NETSTANDARD1_3
|
||||
using System;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.IdentityModel.Tokens.Jwt;
|
||||
@@ -54,7 +53,7 @@ internal class AzureADAuthenticationMatcher : IStringMatcher
|
||||
{
|
||||
if (string.IsNullOrEmpty(input))
|
||||
{
|
||||
return MatchScores.Mismatch;
|
||||
return MatchResult.From(Name);
|
||||
}
|
||||
|
||||
var token = Regex.Replace(input, BearerPrefix, string.Empty, RegexOptions.IgnoreCase, RegexConstants.DefaultTimeout);
|
||||
@@ -83,11 +82,11 @@ internal class AzureADAuthenticationMatcher : IStringMatcher
|
||||
// Throws an Exception as the token is invalid (expired, invalid-formatted, tenant mismatch, etc.)
|
||||
_jwtSecurityTokenHandler.ValidateToken(token, validationParameters, out _);
|
||||
|
||||
return MatchScores.Perfect;
|
||||
return MatchResult.From(Name, MatchScores.Perfect);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return new MatchResult(MatchScores.Mismatch, ex);
|
||||
return MatchResult.From(Name, ex);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,5 +110,4 @@ internal class AzureADAuthenticationMatcher : IStringMatcher
|
||||
tenant = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
// Copyright © WireMock.Net
|
||||
|
||||
#if NET451 || NET452 || NET46 || NET451 || NET461 || NETSTANDARD1_3 || NETSTANDARD2_0
|
||||
#if NET48
|
||||
using System.Text.RegularExpressions;
|
||||
using WireMock.Constants;
|
||||
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
// Copyright © WireMock.Net
|
||||
|
||||
#if NETSTANDARD1_3
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace System.Net;
|
||||
|
||||
internal class WebProxy : IWebProxy
|
||||
{
|
||||
private readonly string _proxy;
|
||||
public ICredentials? Credentials { get; set; }
|
||||
|
||||
public WebProxy(string proxy)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
|
||||
public Uri GetProxy(Uri destination)
|
||||
{
|
||||
return new Uri(_proxy);
|
||||
}
|
||||
|
||||
public bool IsBypassed(Uri host)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -11,29 +11,18 @@ internal static class HttpClientBuilder
|
||||
{
|
||||
public static HttpClient Build(HttpClientSettings settings)
|
||||
{
|
||||
#if NETSTANDARD || NETCOREAPP3_1 || NET5_0_OR_GREATER
|
||||
#if NET8_0_OR_GREATER
|
||||
var handler = new HttpClientHandler
|
||||
{
|
||||
CheckCertificateRevocationList = false,
|
||||
#if NET5_0_OR_GREATER
|
||||
SslProtocols = System.Security.Authentication.SslProtocols.Tls13 | System.Security.Authentication.SslProtocols.Tls12 | System.Security.Authentication.SslProtocols.Tls11 | System.Security.Authentication.SslProtocols.Tls,
|
||||
#else
|
||||
SslProtocols = System.Security.Authentication.SslProtocols.Tls12 | System.Security.Authentication.SslProtocols.Tls11 | System.Security.Authentication.SslProtocols.Tls,
|
||||
#endif
|
||||
ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true,
|
||||
|
||||
ServerCertificateCustomValidationCallback = (_, _, _, _) => true,
|
||||
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
|
||||
};
|
||||
#elif NET46
|
||||
#else
|
||||
var handler = new HttpClientHandler
|
||||
{
|
||||
ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true,
|
||||
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
|
||||
};
|
||||
#else
|
||||
var handler = new WebRequestHandler
|
||||
{
|
||||
ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true,
|
||||
ServerCertificateCustomValidationCallback = (_, _, _, _) => true,
|
||||
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
|
||||
};
|
||||
#endif
|
||||
@@ -67,13 +56,8 @@ internal static class HttpClientBuilder
|
||||
}
|
||||
}
|
||||
|
||||
#if NET5_0_OR_GREATER
|
||||
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
|
||||
ServicePointManager.ServerCertificateValidationCallback = (message, cert, chain, errors) => true;
|
||||
#elif !NETSTANDARD1_3
|
||||
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
|
||||
ServicePointManager.ServerCertificateValidationCallback = (message, cert, chain, errors) => true;
|
||||
#endif
|
||||
|
||||
return HttpClientFactory2.Create(handler);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// Copyright © WireMock.Net
|
||||
#if NET5_0_OR_GREATER
|
||||
|
||||
#if NET8_0_OR_GREATER
|
||||
using System;
|
||||
using System.Net.Http;
|
||||
using WireMock.Server;
|
||||
|
||||
@@ -43,11 +43,8 @@ internal static class CertificateLoader
|
||||
}
|
||||
finally
|
||||
{
|
||||
#if NETSTANDARD || NET46
|
||||
certStore.Dispose();
|
||||
#else
|
||||
certStore.Close();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,7 +53,7 @@ internal static class CertificateLoader
|
||||
if (options.X509CertificateFilePath.EndsWith(ExtensionPem, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
// PEM logic based on: https://www.scottbrady91.com/c-sharp/pem-loading-in-dotnet-core-and-dotnet
|
||||
#if NET5_0_OR_GREATER
|
||||
#if NET8_0_OR_GREATER
|
||||
if (!string.IsNullOrEmpty(options.X509CertificatePassword))
|
||||
{
|
||||
var certPem = File.ReadAllText(options.X509CertificateFilePath);
|
||||
@@ -66,18 +63,8 @@ internal static class CertificateLoader
|
||||
return new X509Certificate2(cert.Export(X509ContentType.Pfx, defaultPasswordPem), defaultPasswordPem);
|
||||
}
|
||||
return X509Certificate2.CreateFromPemFile(options.X509CertificateFilePath);
|
||||
|
||||
#elif NETCOREAPP3_1
|
||||
var cert = new X509Certificate2(options.X509CertificateFilePath);
|
||||
if (!string.IsNullOrEmpty(options.X509CertificatePassword))
|
||||
{
|
||||
var key = System.Security.Cryptography.ECDsa.Create()!;
|
||||
key.ImportECPrivateKey(System.Text.Encoding.UTF8.GetBytes(options.X509CertificatePassword), out _);
|
||||
return cert.CopyWithPrivateKey(key);
|
||||
}
|
||||
return cert;
|
||||
#else
|
||||
throw new InvalidOperationException("Loading a PEM Certificate is only supported for .NET Core App 3.1, .NET 5.0 and higher.");
|
||||
throw new InvalidOperationException("Loading a PEM Certificate is only supported for .NET 8.0 and higher.");
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -123,11 +110,8 @@ internal static class CertificateLoader
|
||||
}
|
||||
finally
|
||||
{
|
||||
#if NETSTANDARD || NET46
|
||||
certStore.Dispose();
|
||||
#else
|
||||
certStore.Close();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -69,7 +69,7 @@ public class WireMockConsoleLogger : IWireMockLogger
|
||||
/// <see cref="IWireMockLogger.DebugRequestResponse"/>
|
||||
public void DebugRequestResponse(LogEntryModel logEntryModel, bool isAdminRequest)
|
||||
{
|
||||
string message = JsonConvert.SerializeObject(logEntryModel, Formatting.Indented);
|
||||
string message = JsonConvert.SerializeObject(logEntryModel, Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
|
||||
Console.WriteLine(Format("DebugRequestResponse", "Admin[{0}] {1}", isAdminRequest, message));
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Stef.Validation;
|
||||
using WireMock.Matchers.Request;
|
||||
using WireMock.Models;
|
||||
@@ -145,9 +146,9 @@ public class Mapping : IMapping
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<(IResponseMessage Message, IMapping? Mapping)> ProvideResponseAsync(IRequestMessage requestMessage)
|
||||
public Task<(IResponseMessage Message, IMapping? Mapping)> ProvideResponseAsync(HttpContext context, IRequestMessage requestMessage)
|
||||
{
|
||||
return Provider.ProvideResponseAsync(this, requestMessage, Settings);
|
||||
return Provider.ProvideResponseAsync(this, context, requestMessage, Settings);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
46
src/WireMock.Net.Minimal/Matchers/CompositeMatcher.cs
Normal file
46
src/WireMock.Net.Minimal/Matchers/CompositeMatcher.cs
Normal file
@@ -0,0 +1,46 @@
|
||||
// Copyright © WireMock.Net
|
||||
|
||||
using System;
|
||||
|
||||
namespace WireMock.Matchers;
|
||||
|
||||
/// <summary>
|
||||
/// Represents a matcher that combines multiple matching strategies into a single composite operation.
|
||||
/// </summary>
|
||||
public class CompositeMatcher : IMatcher
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public string Name => nameof(CompositeMatcher);
|
||||
|
||||
/// <summary>
|
||||
/// The logical operator used to combine the results of the matchers.
|
||||
/// </summary>
|
||||
public MatchOperator MatchOperator { get; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public MatchBehaviour MatchBehaviour { get; }
|
||||
|
||||
/// <summary>
|
||||
/// All matchers.
|
||||
/// </summary>
|
||||
public IMatcher[] Matchers { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the CompositeMatcher class with the specified matchers, operator, and match behaviour.
|
||||
/// </summary>
|
||||
/// <param name="matchers">An array of matchers to be combined. Cannot be null or contain null elements.</param>
|
||||
/// <param name="matchOperator">The logical operator used to combine the results of the matchers.</param>
|
||||
/// <param name="matchBehaviour">The behaviour that determines how the composite matcher interprets the combined results.</param>
|
||||
public CompositeMatcher(IMatcher[] matchers, MatchOperator matchOperator, MatchBehaviour matchBehaviour)
|
||||
{
|
||||
Matchers = matchers;
|
||||
MatchOperator = matchOperator;
|
||||
MatchBehaviour = matchBehaviour;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public string GetCSharpCodeArguments()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
@@ -62,7 +62,7 @@ public class ContentTypeMatcher : WildcardMatcher
|
||||
{
|
||||
if (string.IsNullOrEmpty(input) || !MediaTypeHeaderValue.TryParse(input, out var contentType))
|
||||
{
|
||||
return MatchBehaviourHelper.Convert(MatchBehaviour, MatchScores.Mismatch);
|
||||
return MatchResult.From(Name, MatchBehaviourHelper.Convert(MatchBehaviour, MatchScores.Mismatch));
|
||||
}
|
||||
|
||||
return base.IsMatch(contentType.MediaType);
|
||||
|
||||
@@ -75,7 +75,7 @@ public class ExactMatcher : IStringMatcher, IIgnoreCaseMatcher
|
||||
: pattern => pattern == input;
|
||||
|
||||
var score = MatchScores.ToScore(_values.Select(v => equals(v)).ToArray(), MatchOperator);
|
||||
return new MatchResult(MatchBehaviourHelper.Convert(MatchBehaviour, score));
|
||||
return MatchResult.From(Name, MatchBehaviourHelper.Convert(MatchBehaviour, score));
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
@@ -106,18 +106,18 @@ public class FormUrlEncodedMatcher : IStringMatcher, IIgnoreCaseMatcher
|
||||
// Input is null or empty and if no patterns defined, return Perfect match.
|
||||
if (string.IsNullOrEmpty(input) && _patterns.Length == 0)
|
||||
{
|
||||
return new MatchResult(MatchScores.Perfect);
|
||||
return MatchResult.From(Name, MatchScores.Perfect);
|
||||
}
|
||||
|
||||
if (!QueryStringParser.TryParse(input, IgnoreCase, out var inputNameValueCollection))
|
||||
{
|
||||
return new MatchResult(MatchScores.Mismatch);
|
||||
return MatchResult.From(Name, MatchScores.Mismatch);
|
||||
}
|
||||
|
||||
var matches = GetMatches(inputNameValueCollection);
|
||||
|
||||
var score = MatchScores.ToScore(matches, MatchOperator);
|
||||
return new MatchResult(MatchBehaviourHelper.Convert(MatchBehaviour, score));
|
||||
return MatchResult.From(Name, MatchBehaviourHelper.Convert(MatchBehaviour, score));
|
||||
}
|
||||
|
||||
private bool[] GetMatches(IDictionary<string, string> inputNameValueCollection)
|
||||
|
||||
@@ -80,7 +80,7 @@ public class JsonPathMatcher : IStringMatcher, IObjectMatcher
|
||||
}
|
||||
}
|
||||
|
||||
return new MatchResult(MatchBehaviourHelper.Convert(MatchBehaviour, score), exception);
|
||||
return MatchResult.From(Name, MatchBehaviourHelper.Convert(MatchBehaviour, score), exception);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
@@ -104,7 +104,7 @@ public class JsonPathMatcher : IStringMatcher, IObjectMatcher
|
||||
}
|
||||
}
|
||||
|
||||
return new MatchResult(MatchBehaviourHelper.Convert(MatchBehaviour, score), exception);
|
||||
return MatchResult.From(Name, MatchBehaviourHelper.Convert(MatchBehaviour, score), exception);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
@@ -87,7 +87,7 @@ public class JmesPathMatcher : IStringMatcher, IObjectMatcher
|
||||
}
|
||||
}
|
||||
|
||||
return new MatchResult(MatchBehaviourHelper.Convert(MatchBehaviour, score), exception);
|
||||
return MatchResult.From(Name, MatchBehaviourHelper.Convert(MatchBehaviour, score), exception);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
@@ -102,7 +102,7 @@ public class JmesPathMatcher : IStringMatcher, IObjectMatcher
|
||||
return IsMatch(inputAsString);
|
||||
}
|
||||
|
||||
return MatchBehaviourHelper.Convert(MatchBehaviour, score);
|
||||
return MatchResult.From(Name, MatchBehaviourHelper.Convert(MatchBehaviour, score));
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
@@ -96,7 +96,7 @@ public class JsonMatcher : IJsonMatcher
|
||||
}
|
||||
}
|
||||
|
||||
return new MatchResult(MatchBehaviourHelper.Convert(MatchBehaviour, score), error);
|
||||
return MatchResult.From(Name, MatchBehaviourHelper.Convert(MatchBehaviour, score), error);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
@@ -24,14 +24,26 @@ public class RequestMatchResult : IRequestMatchResult
|
||||
public double AverageTotalScore => TotalNumber == 0 ? MatchScores.Mismatch : TotalScore / TotalNumber;
|
||||
|
||||
/// <inheritdoc />
|
||||
public IList<MatchDetail> MatchDetails { get; } = new List<MatchDetail>();
|
||||
public IList<MatchDetail> MatchDetails { get; } = [];
|
||||
|
||||
/// <inheritdoc />
|
||||
public double AddScore(Type matcherType, double score, Exception? exception)
|
||||
{
|
||||
MatchDetails.Add(new MatchDetail { MatcherType = matcherType, Score = score, Exception = exception });
|
||||
return AddMatchDetail(new MatchDetail
|
||||
{
|
||||
Name = matcherType.Name.Replace("RequestMessage", string.Empty),
|
||||
MatcherType = matcherType,
|
||||
Score = score,
|
||||
Exception = exception
|
||||
});
|
||||
}
|
||||
|
||||
return score;
|
||||
/// <inheritdoc />
|
||||
public double AddMatchDetail(MatchDetail matchDetail)
|
||||
{
|
||||
MatchDetails.Add(matchDetail);
|
||||
|
||||
return matchDetail.Score;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -17,27 +17,27 @@ public class RequestMessageBodyMatcher : IRequestMatcher
|
||||
/// <summary>
|
||||
/// The body function
|
||||
/// </summary>
|
||||
public Func<string?, bool>? Func { get; }
|
||||
public Func<string?, bool>? MatchOnBodyAsStringFunc { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The body data function for byte[]
|
||||
/// </summary>
|
||||
public Func<byte[]?, bool>? DataFunc { get; }
|
||||
public Func<byte[]?, bool>? MatchOnBodyAsBytesFunc { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The body data function for json
|
||||
/// </summary>
|
||||
public Func<object?, bool>? JsonFunc { get; }
|
||||
public Func<object?, bool>? MatchOnBodyAsJsonFunc { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The body data function for BodyData
|
||||
/// </summary>
|
||||
public Func<IBodyData?, bool>? BodyDataFunc { get; }
|
||||
public Func<IBodyData?, bool>? MatchOnBodyAsBodyDataFunc { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The body data function for FormUrlEncoded
|
||||
/// </summary>
|
||||
public Func<IDictionary<string, string>?, bool>? FormUrlEncodedFunc { get; }
|
||||
public Func<IDictionary<string, string>?, bool>? MatchOnBodyAsFormUrlEncodedFunc { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The matchers.
|
||||
@@ -85,7 +85,7 @@ public class RequestMessageBodyMatcher : IRequestMatcher
|
||||
/// <param name="func">The function.</param>
|
||||
public RequestMessageBodyMatcher(Func<string?, bool> func)
|
||||
{
|
||||
Func = Guard.NotNull(func);
|
||||
MatchOnBodyAsStringFunc = Guard.NotNull(func);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -94,7 +94,7 @@ public class RequestMessageBodyMatcher : IRequestMatcher
|
||||
/// <param name="func">The function.</param>
|
||||
public RequestMessageBodyMatcher(Func<byte[]?, bool> func)
|
||||
{
|
||||
DataFunc = Guard.NotNull(func);
|
||||
MatchOnBodyAsBytesFunc = Guard.NotNull(func);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -103,7 +103,7 @@ public class RequestMessageBodyMatcher : IRequestMatcher
|
||||
/// <param name="func">The function.</param>
|
||||
public RequestMessageBodyMatcher(Func<object?, bool> func)
|
||||
{
|
||||
JsonFunc = Guard.NotNull(func);
|
||||
MatchOnBodyAsJsonFunc = Guard.NotNull(func);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -112,7 +112,7 @@ public class RequestMessageBodyMatcher : IRequestMatcher
|
||||
/// <param name="func">The function.</param>
|
||||
public RequestMessageBodyMatcher(Func<IBodyData?, bool> func)
|
||||
{
|
||||
BodyDataFunc = Guard.NotNull(func);
|
||||
MatchOnBodyAsBodyDataFunc = Guard.NotNull(func);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -121,7 +121,7 @@ public class RequestMessageBodyMatcher : IRequestMatcher
|
||||
/// <param name="func">The function.</param>
|
||||
public RequestMessageBodyMatcher(Func<IDictionary<string, string>?, bool> func)
|
||||
{
|
||||
FormUrlEncodedFunc = Guard.NotNull(func);
|
||||
MatchOnBodyAsFormUrlEncodedFunc = Guard.NotNull(func);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -147,43 +147,43 @@ public class RequestMessageBodyMatcher : IRequestMatcher
|
||||
/// <inheritdoc />
|
||||
public double GetMatchingScore(IRequestMessage requestMessage, IRequestMatchResult requestMatchResult)
|
||||
{
|
||||
var (score, exception) = CalculateMatchScore(requestMessage).Expand();
|
||||
var (score, exception) = CalculateMatchResult(requestMessage).Expand();
|
||||
return requestMatchResult.AddScore(GetType(), score, exception);
|
||||
}
|
||||
|
||||
private MatchResult CalculateMatchScore(IRequestMessage requestMessage)
|
||||
private MatchResult CalculateMatchResult(IRequestMessage requestMessage)
|
||||
{
|
||||
if (Matchers != null && Matchers.Any())
|
||||
{
|
||||
var results = Matchers.Select(matcher => BodyDataMatchScoreCalculator.CalculateMatchScore(requestMessage.BodyData, matcher)).ToArray();
|
||||
return MatchResult.From(results, MatchOperator);
|
||||
return MatchResult.From(nameof(RequestMessageBodyMatcher), results, MatchOperator);
|
||||
}
|
||||
|
||||
if (Func != null)
|
||||
if (MatchOnBodyAsStringFunc != null)
|
||||
{
|
||||
return MatchScores.ToScore(Func(requestMessage.BodyData?.BodyAsString));
|
||||
return MatchResult.From($"{nameof(RequestMessageBodyMatcher)}:{nameof(MatchOnBodyAsStringFunc)}", MatchScores.ToScore(MatchOnBodyAsStringFunc(requestMessage.BodyData?.BodyAsString)));
|
||||
}
|
||||
|
||||
if (FormUrlEncodedFunc != null)
|
||||
if (MatchOnBodyAsFormUrlEncodedFunc != null)
|
||||
{
|
||||
return MatchScores.ToScore(FormUrlEncodedFunc(requestMessage.BodyData?.BodyAsFormUrlEncoded));
|
||||
return MatchResult.From($"{nameof(RequestMessageBodyMatcher)}:{nameof(MatchOnBodyAsFormUrlEncodedFunc)}", MatchScores.ToScore(MatchOnBodyAsFormUrlEncodedFunc(requestMessage.BodyData?.BodyAsFormUrlEncoded)));
|
||||
}
|
||||
|
||||
if (JsonFunc != null)
|
||||
if (MatchOnBodyAsJsonFunc != null)
|
||||
{
|
||||
return MatchScores.ToScore(JsonFunc(requestMessage.BodyData?.BodyAsJson));
|
||||
return MatchResult.From($"{nameof(RequestMessageBodyMatcher)}:{nameof(MatchOnBodyAsJsonFunc)}", MatchScores.ToScore(MatchOnBodyAsJsonFunc(requestMessage.BodyData?.BodyAsJson)));
|
||||
}
|
||||
|
||||
if (DataFunc != null)
|
||||
if (MatchOnBodyAsBytesFunc != null)
|
||||
{
|
||||
return MatchScores.ToScore(DataFunc(requestMessage.BodyData?.BodyAsBytes));
|
||||
return MatchResult.From($"{nameof(RequestMessageBodyMatcher)}:{nameof(MatchOnBodyAsBytesFunc)}", MatchScores.ToScore(MatchOnBodyAsBytesFunc(requestMessage.BodyData?.BodyAsBytes)));
|
||||
}
|
||||
|
||||
if (BodyDataFunc != null)
|
||||
if (MatchOnBodyAsBodyDataFunc != null)
|
||||
{
|
||||
return MatchScores.ToScore(BodyDataFunc(requestMessage.BodyData));
|
||||
return MatchResult.From($"{nameof(RequestMessageBodyMatcher)}:{nameof(MatchOnBodyAsBodyDataFunc)}", MatchScores.ToScore(MatchOnBodyAsBodyDataFunc(requestMessage.BodyData)));
|
||||
}
|
||||
|
||||
return default;
|
||||
return MatchResult.From(nameof(RequestMessageBodyMatcher));
|
||||
}
|
||||
}
|
||||
@@ -11,6 +11,8 @@ namespace WireMock.Matchers.Request;
|
||||
/// </summary>
|
||||
public class RequestMessageBodyMatcher<T> : IRequestMatcher
|
||||
{
|
||||
private const string _name = nameof(RequestMessageBodyMatcher<T>);
|
||||
|
||||
/// <summary>
|
||||
/// The body data function for type T
|
||||
/// </summary>
|
||||
@@ -46,15 +48,15 @@ public class RequestMessageBodyMatcher<T> : IRequestMatcher
|
||||
try
|
||||
{
|
||||
var bodyAsT = jsonObject.ToObject<T>();
|
||||
return MatchScores.ToScore(Func(bodyAsT));
|
||||
return MatchResult.From(_name, MatchScores.ToScore(Func(bodyAsT)));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return new MatchResult(ex);
|
||||
return MatchResult.From(_name, ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return default;
|
||||
return MatchResult.From(_name);
|
||||
}
|
||||
}
|
||||
@@ -14,6 +14,8 @@ namespace WireMock.Matchers.Request;
|
||||
/// </summary>
|
||||
public class RequestMessageClientIPMatcher : IRequestMatcher
|
||||
{
|
||||
private const string _name = nameof(RequestMessageClientIPMatcher);
|
||||
|
||||
/// <summary>
|
||||
/// The matchers
|
||||
/// </summary>
|
||||
@@ -77,8 +79,8 @@ public class RequestMessageClientIPMatcher : IRequestMatcher
|
||||
/// <inheritdoc />
|
||||
public double GetMatchingScore(IRequestMessage requestMessage, IRequestMatchResult requestMatchResult)
|
||||
{
|
||||
var (score, exception) = GetMatchResult(requestMessage).Expand();
|
||||
return requestMatchResult.AddScore(GetType(), score, exception);
|
||||
var matchDetail = GetMatchResult(requestMessage).ToMatchDetail();
|
||||
return requestMatchResult.AddMatchDetail(matchDetail);
|
||||
}
|
||||
|
||||
private MatchResult GetMatchResult(IRequestMessage requestMessage)
|
||||
@@ -86,15 +88,15 @@ public class RequestMessageClientIPMatcher : IRequestMatcher
|
||||
if (Matchers != null)
|
||||
{
|
||||
var results = Matchers.Select(m => m.IsMatch(requestMessage.ClientIP)).ToArray();
|
||||
return MatchResult.From(results, MatchOperator);
|
||||
return MatchResult.From(_name, results, MatchOperator);
|
||||
}
|
||||
|
||||
if (Funcs != null)
|
||||
{
|
||||
var results = Funcs.Select(func => func(requestMessage.ClientIP)).ToArray();
|
||||
return MatchScores.ToScore(results, MatchOperator);
|
||||
return MatchResult.From(_name, MatchScores.ToScore(results, MatchOperator));
|
||||
}
|
||||
|
||||
return default;
|
||||
return MatchResult.From(_name);
|
||||
}
|
||||
}
|
||||
@@ -13,6 +13,8 @@ namespace WireMock.Matchers.Request;
|
||||
/// <inheritdoc cref="IRequestMatcher"/>
|
||||
public class RequestMessageCookieMatcher : IRequestMatcher
|
||||
{
|
||||
private const string _name = nameof(RequestMessageCookieMatcher);
|
||||
|
||||
/// <summary>
|
||||
/// MatchBehaviour
|
||||
/// </summary>
|
||||
@@ -104,7 +106,7 @@ public class RequestMessageCookieMatcher : IRequestMatcher
|
||||
{
|
||||
if (requestMessage.Cookies == null)
|
||||
{
|
||||
return MatchBehaviourHelper.Convert(MatchBehaviour, MatchScores.Mismatch);
|
||||
return MatchResult.From(_name, MatchBehaviourHelper.Convert(MatchBehaviour, MatchScores.Mismatch));
|
||||
}
|
||||
|
||||
// Check if we want to use IgnoreCase to compare the Cookie-Name and Cookie-Value
|
||||
@@ -112,19 +114,19 @@ public class RequestMessageCookieMatcher : IRequestMatcher
|
||||
|
||||
if (Funcs != null)
|
||||
{
|
||||
return MatchScores.ToScore(Funcs.Any(f => f(cookies)));
|
||||
return MatchResult.From(_name, MatchScores.ToScore(Funcs.Any(f => f(cookies))));
|
||||
}
|
||||
|
||||
if (Matchers == null)
|
||||
{
|
||||
return default;
|
||||
return MatchResult.From(_name);
|
||||
}
|
||||
|
||||
if (!cookies.ContainsKey(Name))
|
||||
{
|
||||
return MatchBehaviourHelper.Convert(MatchBehaviour, MatchScores.Mismatch);
|
||||
return MatchResult.From(_name, MatchBehaviourHelper.Convert(MatchBehaviour, MatchScores.Mismatch));
|
||||
}
|
||||
|
||||
return Matchers.Max(m => m.IsMatch(cookies[Name]));
|
||||
return MatchResult.From(_name, Matchers.Max(m => m.IsMatch(cookies[Name]))?.Score ?? MatchScores.Mismatch);
|
||||
}
|
||||
}
|
||||
@@ -14,6 +14,8 @@ namespace WireMock.Matchers.Request;
|
||||
/// <inheritdoc cref="IRequestMatcher"/>
|
||||
public class RequestMessageHeaderMatcher : IRequestMatcher
|
||||
{
|
||||
private const string _name = nameof(RequestMessageCookieMatcher);
|
||||
|
||||
/// <summary>
|
||||
/// MatchBehaviour
|
||||
/// </summary>
|
||||
@@ -117,7 +119,7 @@ public class RequestMessageHeaderMatcher : IRequestMatcher
|
||||
{
|
||||
if (requestMessage.Headers == null)
|
||||
{
|
||||
return MatchBehaviourHelper.Convert(MatchBehaviour, MatchScores.Mismatch);
|
||||
return MatchResult.From(_name, MatchBehaviourHelper.Convert(MatchBehaviour, MatchScores.Mismatch));
|
||||
}
|
||||
|
||||
// Check if we want to use IgnoreCase to compare the Header-Name and Header-Value(s)
|
||||
@@ -126,14 +128,14 @@ public class RequestMessageHeaderMatcher : IRequestMatcher
|
||||
if (Funcs != null)
|
||||
{
|
||||
var funcResults = Funcs.Select(f => f(headers.ToDictionary(entry => entry.Key, entry => entry.Value.ToArray()))).ToArray();
|
||||
return MatchScores.ToScore(funcResults, MatchOperator);
|
||||
return MatchResult.From(_name, MatchScores.ToScore(funcResults, MatchOperator));
|
||||
}
|
||||
|
||||
if (Matchers != null)
|
||||
{
|
||||
if (!headers.ContainsKey(Name))
|
||||
{
|
||||
return MatchBehaviourHelper.Convert(MatchBehaviour, MatchScores.Mismatch);
|
||||
return MatchResult.From(_name, MatchBehaviourHelper.Convert(MatchBehaviour, MatchScores.Mismatch));
|
||||
}
|
||||
|
||||
var results = new List<MatchResult>();
|
||||
@@ -141,12 +143,12 @@ public class RequestMessageHeaderMatcher : IRequestMatcher
|
||||
{
|
||||
var resultsPerMatcher = headers[Name].Select(matcher.IsMatch).ToArray();
|
||||
|
||||
results.Add(MatchResult.From(resultsPerMatcher, MatchOperator.And));
|
||||
results.Add(MatchResult.From(_name, resultsPerMatcher, MatchOperator.And));
|
||||
}
|
||||
|
||||
return MatchResult.From(results, MatchOperator);
|
||||
return MatchResult.From(_name, results, MatchOperator);
|
||||
}
|
||||
|
||||
return MatchBehaviourHelper.Convert(MatchBehaviour, MatchScores.Mismatch);
|
||||
return MatchResult.From(_name, MatchBehaviourHelper.Convert(MatchBehaviour, MatchScores.Mismatch));
|
||||
}
|
||||
}
|
||||
@@ -11,6 +11,8 @@ namespace WireMock.Matchers.Request;
|
||||
/// </summary>
|
||||
public class RequestMessageHttpVersionMatcher : IRequestMatcher
|
||||
{
|
||||
private const string _name = nameof(RequestMessageHttpVersionMatcher);
|
||||
|
||||
/// <summary>
|
||||
/// The matcher.
|
||||
/// </summary>
|
||||
@@ -19,7 +21,7 @@ public class RequestMessageHttpVersionMatcher : IRequestMatcher
|
||||
/// <summary>
|
||||
/// The func.
|
||||
/// </summary>
|
||||
public Func<string, bool>? Func { get; }
|
||||
public Func<string, bool>? MatcherOnStringFunc { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The <see cref="MatchBehaviour"/>
|
||||
@@ -61,7 +63,7 @@ public class RequestMessageHttpVersionMatcher : IRequestMatcher
|
||||
/// <param name="func">The function.</param>
|
||||
public RequestMessageHttpVersionMatcher(Func<string, bool> func)
|
||||
{
|
||||
Func = Guard.NotNull(func);
|
||||
MatcherOnStringFunc = Guard.NotNull(func);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
@@ -78,11 +80,11 @@ public class RequestMessageHttpVersionMatcher : IRequestMatcher
|
||||
return Matcher.IsMatch(requestMessage.HttpVersion);
|
||||
}
|
||||
|
||||
if (Func != null)
|
||||
if (MatcherOnStringFunc != null)
|
||||
{
|
||||
return MatchScores.ToScore(Func(requestMessage.HttpVersion));
|
||||
return MatchResult.From($"{_name}:{nameof(MatcherOnStringFunc)}", MatchScores.ToScore(MatcherOnStringFunc(requestMessage.HttpVersion)));
|
||||
}
|
||||
|
||||
return default;
|
||||
return MatchResult.From(_name);
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user