Skip to content

Commit

Permalink
Initial code for proxy and record #27
Browse files Browse the repository at this point in the history
  • Loading branch information
StefH committed May 9, 2017
1 parent b25371c commit 31261ec
Show file tree
Hide file tree
Showing 14 changed files with 160 additions and 10 deletions.
7 changes: 7 additions & 0 deletions WireMock.Net Solution.sln
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.StandAlone.NET
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.Console.NETCoreApp", "examples\WireMock.Net.Console.NETCoreApp\WireMock.Net.Console.NETCoreApp.csproj", "{FE281639-B014-4C8A-96FA-141164A74713}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.Console.Record.NETCoreApp", "examples\WireMock.Net.Console.Record.NETCoreApp\WireMock.Net.Console.Record.NETCoreApp.csproj", "{1995E414-F197-4AB4-90C2-68D806B5AF59}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -65,6 +67,10 @@ Global
{FE281639-B014-4C8A-96FA-141164A74713}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FE281639-B014-4C8A-96FA-141164A74713}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FE281639-B014-4C8A-96FA-141164A74713}.Release|Any CPU.Build.0 = Release|Any CPU
{1995E414-F197-4AB4-90C2-68D806B5AF59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1995E414-F197-4AB4-90C2-68D806B5AF59}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1995E414-F197-4AB4-90C2-68D806B5AF59}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1995E414-F197-4AB4-90C2-68D806B5AF59}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand All @@ -76,5 +82,6 @@ Global
{31DC2EF8-C3FE-467D-84BE-FB5D956E612E} = {890A1DED-C229-4FA1-969E-AAC3BBFC05E5}
{14D7298C-2BE5-42C3-A3D5-9433E77218F9} = {EF242EDF-7133-4277-9A0C-18744DE08707}
{FE281639-B014-4C8A-96FA-141164A74713} = {F0C22C47-DF71-463C-9B04-B4E0F3B8708A}
{1995E414-F197-4AB4-90C2-68D806B5AF59} = {F0C22C47-DF71-463C-9B04-B4E0F3B8708A}
EndGlobalSection
EndGlobal
1 change: 1 addition & 0 deletions examples/WireMock.Net.Console.NETCoreApp/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using WireMock.RequestBuilders;
using WireMock.ResponseBuilders;
using WireMock.Server;
using WireMock.Settings;

namespace WireMock.Net.Console.NETCoreApp
{
Expand Down
32 changes: 32 additions & 0 deletions examples/WireMock.Net.Console.Record.NETCoreApp/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using Newtonsoft.Json;
using WireMock.Server;
using WireMock.Settings;

namespace WireMock.Net.Console.NETCoreApp
{
static class Program
{
static void Main(params string[] args)
{
string url1 = "http://localhost:9095/";

var server = FluentMockServer.Start(new FluentMockServerSettings
{
Urls = new[] { url1 },
StartAdminInterface = true,
ProxyAndRecordSettings = new ProxyAndRecordSettings { Url = "http://www.bbc.com" }
});

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();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp1.1</TargetFramework>
<ApplicationIcon>../../WireMock.Net-Logo.ico</ApplicationIcon>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="CommandLineArgumentsParser" Version="3.0.9" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\WireMock.Net\WireMock.Net.csproj" />
<!--<ProjectReference Include="..\WireMock.Net\WireMock.Net.csproj" />-->
<PackageReference Include="Newtonsoft.Json" Version="9.0.1" />
</ItemGroup>

</Project>
1 change: 1 addition & 0 deletions examples/WireMock.Net.ConsoleApplication/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using WireMock.RequestBuilders;
using WireMock.ResponseBuilders;
using WireMock.Server;
using WireMock.Settings;

namespace WireMock.Net.ConsoleApplication
{
Expand Down
1 change: 1 addition & 0 deletions src/WireMock.Net.StandAlone.NETCoreApp/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using CommandLineParser.Arguments;
using CommandLineParser.Exceptions;
using WireMock.Server;
using WireMock.Settings;

namespace WireMock.Net.StandAlone.NETCoreApp
{
Expand Down
1 change: 1 addition & 0 deletions src/WireMock.Net.StandAlone/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using CommandLineParser.Arguments;
using CommandLineParser.Exceptions;
using WireMock.Server;
using WireMock.Settings;

namespace WireMock.Net.StandAlone
{
Expand Down
38 changes: 38 additions & 0 deletions src/WireMock.Net/DynamicResponseProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Threading.Tasks;
using JetBrains.Annotations;
using WireMock.Validation;
using WireMock.Settings;

namespace WireMock
{
Expand All @@ -21,4 +22,41 @@ public Task<ResponseMessage> ProvideResponseAsync(RequestMessage requestMessage)
return Task.FromResult(_responseMessageFunc(requestMessage));
}
}

internal class DynamicAsyncResponseProvider : IResponseProvider
{
private readonly Func<RequestMessage, Task<ResponseMessage>> _responseMessageFunc;

public DynamicAsyncResponseProvider([NotNull] Func<RequestMessage, Task<ResponseMessage>> responseMessageFunc)
{
Check.NotNull(responseMessageFunc, nameof(responseMessageFunc));

_responseMessageFunc = responseMessageFunc;
}

public Task<ResponseMessage> ProvideResponseAsync(RequestMessage requestMessage)
{
return _responseMessageFunc(requestMessage);
}
}

internal class ProxyAsyncResponseProvider : IResponseProvider
{
private readonly Func<RequestMessage, ProxyAndRecordSettings, Task<ResponseMessage>> _responseMessageFunc;
private readonly ProxyAndRecordSettings _settings;

public ProxyAsyncResponseProvider([NotNull] Func<RequestMessage, ProxyAndRecordSettings, Task<ResponseMessage>> responseMessageFunc, [NotNull] ProxyAndRecordSettings settings)
{
Check.NotNull(responseMessageFunc, nameof(responseMessageFunc));
Check.NotNull(settings, nameof(settings));

_responseMessageFunc = responseMessageFunc;
_settings = settings;
}

public Task<ResponseMessage> ProvideResponseAsync(RequestMessage requestMessage)
{
return _responseMessageFunc(requestMessage, _settings);
}
}
}
2 changes: 1 addition & 1 deletion src/WireMock.Net/Mapping.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,6 @@ public RequestMatchResult IsRequestHandled(RequestMessage requestMessage)
/// <value>
/// <c>true</c> if this mapping is an Admin Interface; otherwise, <c>false</c>.
/// </value>
public bool IsAdminInterface => Provider is DynamicResponseProvider;
public bool IsAdminInterface => Provider is DynamicResponseProvider || Provider is DynamicAsyncResponseProvider || Provider is ProxyAsyncResponseProvider;
}
}
17 changes: 17 additions & 0 deletions src/WireMock.Net/Server/FluentMockServer.Admin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
using WireMock.ResponseBuilders;
using WireMock.Util;
using WireMock.Validation;
using WireMock.Http;
using System.Threading.Tasks;
using WireMock.Settings;

namespace WireMock.Server
{
Expand Down Expand Up @@ -117,6 +120,20 @@ private void InitAdmin()
Given(Request.Create().WithPath(AdminRequests + "/find").UsingPost()).RespondWith(new DynamicResponseProvider(RequestsFind));
}

private void InitProxyAndRecord(ProxyAndRecordSettings settings)
{
Given(Request.Create().WithPath("/*").UsingAnyVerb()).RespondWith(new ProxyAsyncResponseProvider(ProxyAndRecordAsync, settings));
}

#region Proxy and Record
private async Task<ResponseMessage> ProxyAndRecordAsync(RequestMessage requestMessage, ProxyAndRecordSettings settings)
{
var responseMessage = await HttpClientHelper.SendAsync(requestMessage, settings.Url);

return responseMessage;
}
#endregion

#region Settings
private ResponseMessage SettingsGet(RequestMessage requestMessage)
{
Expand Down
8 changes: 7 additions & 1 deletion src/WireMock.Net/Server/FluentMockServer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
using WireMock.Matchers;
using WireMock.Matchers.Request;
using WireMock.RequestBuilders;
using WireMock.Settings;
using WireMock.Validation;
using WireMock.Owin;

Expand Down Expand Up @@ -181,6 +182,11 @@ private FluentMockServer(FluentMockServerSettings settings)
{
ReadStaticMappings();
}

if (settings.ProxyAndRecordSettings != null)
{
InitProxyAndRecord(settings.ProxyAndRecordSettings);
}
}

/// <summary>
Expand Down Expand Up @@ -235,7 +241,7 @@ public void ResetMappings()
{
lock (((ICollection)_options.Mappings).SyncRoot)
{
_options.Mappings = _options.Mappings.Where(m => m.Provider is DynamicResponseProvider).ToList();
_options.Mappings = _options.Mappings.Where(m => m.IsAdminInterface).ToList();
}
}

Expand Down
11 changes: 8 additions & 3 deletions src/WireMock.Net/Server/IRespondWithAProvider.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Threading.Tasks;

namespace WireMock.Server
{
Expand Down Expand Up @@ -38,9 +39,13 @@ public interface IRespondWithAProvider
/// <summary>
/// The respond with.
/// </summary>
/// <param name="provider">
/// The provider.
/// </param>
/// <param name="provider">The provider.</param>
void RespondWith(IResponseProvider provider);

///// <summary>
///// The respond with.
///// </summary>
///// <param name="provider">The provider.</param>
//Task RespondWithAsync(IResponseProvider provider);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace WireMock.Server
namespace WireMock.Settings
{
/// <summary>
/// FluentMockServerSettings
Expand Down Expand Up @@ -31,13 +31,17 @@ public class FluentMockServerSettings
public bool? StartAdminInterface { get; set; }

/// <summary>
/// Gets or sets the read static mappings.
/// Gets or sets if the static mappings should be read at startup.
/// </summary>
/// <value>
/// The read static mappings.
/// </value>
/// <value>true/false</value>
public bool? ReadStaticMappings { get; set; }

/// <summary>
/// Gets or sets if the server should record and save requests and responses.
/// </summary>
/// <value>true/false</value>
public ProxyAndRecordSettings ProxyAndRecordSettings { get; set; }

/// <summary>
/// Gets or sets the urls.
/// </summary>
Expand Down
18 changes: 18 additions & 0 deletions src/WireMock.Net/Settings/ProxyAndRecordSettings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
namespace WireMock.Settings
{
/// <summary>
/// RecordAndSaveSettings
/// </summary>
public class ProxyAndRecordSettings
{
/// <summary>
/// The URL to proxy.
/// </summary>
public string Url { get; set; }

/// <summary>
/// Save the mapping for each request/response.
/// </summary>
public bool SaveMapping { get; set; } = true;
}
}

0 comments on commit 31261ec

Please sign in to comment.