diff --git a/Directory.Build.props b/Directory.Build.props index f35456164..a1fc5f0e7 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -4,7 +4,7 @@ - 1.0.21 + 1.0.22 diff --git a/GitHubReleaseNotes.txt b/GitHubReleaseNotes.txt index 822d051f9..c07cf8394 100644 --- a/GitHubReleaseNotes.txt +++ b/GitHubReleaseNotes.txt @@ -1,3 +1,3 @@ https://github.com/StefH/GitHubReleaseNotes -GitHubReleaseNotes.exe --output CHANGELOG.md --skip-empty-releases --version 1.0.21.0 \ No newline at end of file +GitHubReleaseNotes.exe --output CHANGELOG.md --skip-empty-releases --version 1.0.22.0 \ No newline at end of file diff --git a/src/WireMock.Net/Server/FluentMockServer.Admin.cs b/src/WireMock.Net/Server/FluentMockServer.Admin.cs index 7380eccac..176c3d4db 100644 --- a/src/WireMock.Net/Server/FluentMockServer.Admin.cs +++ b/src/WireMock.Net/Server/FluentMockServer.Admin.cs @@ -131,18 +131,18 @@ public void ReadStaticMappings([CanBeNull] string folder = null) { if (folder == null) { - folder = _fileSystemHandler.GetMappingFolder(); + folder = _settings.FileSystemHandler.GetMappingFolder(); } - if (!_fileSystemHandler.FolderExists(folder)) + if (!_settings.FileSystemHandler.FolderExists(folder)) { - _logger.Info("The Static Mapping folder '{0}' does not exist, reading Static MappingFiles will be skipped.", folder); + _settings.Logger.Info("The Static Mapping folder '{0}' does not exist, reading Static MappingFiles will be skipped.", folder); return; } - foreach (string filename in _fileSystemHandler.EnumerateFiles(folder).OrderBy(f => f)) + foreach (string filename in _settings.FileSystemHandler.EnumerateFiles(folder).OrderBy(f => f)) { - _logger.Info("Reading Static MappingFile : '{0}'", filename); + _settings.Logger.Info("Reading Static MappingFile : '{0}'", filename); try { @@ -150,7 +150,7 @@ public void ReadStaticMappings([CanBeNull] string folder = null) } catch { - _logger.Error("Static MappingFile : '{0}' could not be read. This file will be skipped.", filename); + _settings.Logger.Error("Static MappingFile : '{0}' could not be read. This file will be skipped.", filename); } } } @@ -172,28 +172,28 @@ public void WatchStaticMappings([CanBeNull] string folder = null) return; } - _logger.Info("Watching folder '{0}' for new, updated and deleted MappingFiles.", folder); + _settings.Logger.Info("Watching folder '{0}' for new, updated and deleted MappingFiles.", folder); var watcher = new EnhancedFileSystemWatcher(folder, "*.json", EnhancedFileSystemWatcherTimeoutMs); watcher.Created += (sender, args) => { - _logger.Info("MappingFile created : '{0}', reading file.", args.FullPath); + _settings.Logger.Info("MappingFile created : '{0}', reading file.", args.FullPath); if (!ReadStaticMappingAndAddOrUpdate(args.FullPath)) { - _logger.Error("Unable to read MappingFile '{0}'.", args.FullPath); + _settings.Logger.Error("Unable to read MappingFile '{0}'.", args.FullPath); } }; watcher.Changed += (sender, args) => { - _logger.Info("MappingFile updated : '{0}', reading file.", args.FullPath); + _settings.Logger.Info("MappingFile updated : '{0}', reading file.", args.FullPath); if (!ReadStaticMappingAndAddOrUpdate(args.FullPath)) { - _logger.Error("Unable to read MappingFile '{0}'.", args.FullPath); + _settings.Logger.Error("Unable to read MappingFile '{0}'.", args.FullPath); } }; watcher.Deleted += (sender, args) => { - _logger.Info("MappingFile deleted : '{0}'", args.FullPath); + _settings.Logger.Info("MappingFile deleted : '{0}'", args.FullPath); string filenameWithoutExtension = Path.GetFileNameWithoutExtension(args.FullPath); if (Guid.TryParse(filenameWithoutExtension, out Guid guidFromFilename)) @@ -220,7 +220,7 @@ public bool ReadStaticMappingAndAddOrUpdate([NotNull] string path) string filenameWithoutExtension = Path.GetFileNameWithoutExtension(path); - if (FileHelper.TryReadMappingFileWithRetryAndDelay(_fileSystemHandler, path, out string value)) + if (FileHelper.TryReadMappingFileWithRetryAndDelay(_settings.FileSystemHandler, path, out string value)) { var mappingModels = DeserializeObjectToArray(JsonConvert.DeserializeObject(value)); foreach (var mappingModel in mappingModels) @@ -361,7 +361,7 @@ private ResponseMessage MappingGet(RequestMessage requestMessage) if (mapping == null) { - _logger.Warn("HttpStatusCode set to 404 : Mapping not found"); + _settings.Logger.Warn("HttpStatusCode set to 404 : Mapping not found"); return ResponseMessageBuilder.Create("Mapping not found", 404); } @@ -405,12 +405,12 @@ private void SaveMappingToFile(IMapping mapping, string folder = null) { if (folder == null) { - folder = _fileSystemHandler.GetMappingFolder(); + folder = _settings.FileSystemHandler.GetMappingFolder(); } - if (!_fileSystemHandler.FolderExists(folder)) + if (!_settings.FileSystemHandler.FolderExists(folder)) { - _fileSystemHandler.CreateFolder(folder); + _settings.FileSystemHandler.CreateFolder(folder); } var model = MappingConverter.ToMappingModel(mapping); @@ -418,9 +418,9 @@ private void SaveMappingToFile(IMapping mapping, string folder = null) string path = Path.Combine(folder, filename); - _logger.Info("Saving Mapping file {0}", filename); + _settings.Logger.Info("Saving Mapping file {0}", filename); - _fileSystemHandler.WriteMappingFile(path, JsonConvert.SerializeObject(model, _jsonSerializerSettings)); + _settings.FileSystemHandler.WriteMappingFile(path, JsonConvert.SerializeObject(model, _jsonSerializerSettings)); } private static string SanitizeFileName(string name, char replaceChar = '_') @@ -460,12 +460,12 @@ private ResponseMessage MappingsPost(RequestMessage requestMessage) } catch (ArgumentException a) { - _logger.Error("HttpStatusCode set to 400 {0}", a); + _settings.Logger.Error("HttpStatusCode set to 400 {0}", a); return ResponseMessageBuilder.Create(a.Message, 400); } catch (Exception e) { - _logger.Error("HttpStatusCode set to 500 {0}", e); + _settings.Logger.Error("HttpStatusCode set to 500 {0}", e); return ResponseMessageBuilder.Create(e.ToString(), 500); } } @@ -540,7 +540,7 @@ private ResponseMessage RequestGet(RequestMessage requestMessage) if (entry == null) { - _logger.Warn("HttpStatusCode set to 404 : Request not found"); + _settings.Logger.Warn("HttpStatusCode set to 404 : Request not found"); return ResponseMessageBuilder.Create("Request not found", 404); } @@ -683,7 +683,7 @@ private IRequestBuilder InitRequestBuilder(RequestModel requestModel, bool pathO if (pathOrUrlRequired && !pathOrUrlmatchersValid) { - _logger.Error("Path or Url matcher is missing for this mapping, this mapping will not be added."); + _settings.Logger.Error("Path or Url matcher is missing for this mapping, this mapping will not be added."); return null; } diff --git a/src/WireMock.Net/Server/FluentMockServer.AdminFiles.cs b/src/WireMock.Net/Server/FluentMockServer.AdminFiles.cs index 5c72015ab..40dc6374c 100644 --- a/src/WireMock.Net/Server/FluentMockServer.AdminFiles.cs +++ b/src/WireMock.Net/Server/FluentMockServer.AdminFiles.cs @@ -16,13 +16,13 @@ private ResponseMessage FilePost(RequestMessage requestMessage) { string filename = GetFileNameFromRequestMessage(requestMessage); - string mappingFolder = _fileSystemHandler.GetMappingFolder(); - if (!_fileSystemHandler.FolderExists(mappingFolder)) + string mappingFolder = _settings.FileSystemHandler.GetMappingFolder(); + if (!_settings.FileSystemHandler.FolderExists(mappingFolder)) { - _fileSystemHandler.CreateFolder(mappingFolder); + _settings.FileSystemHandler.CreateFolder(mappingFolder); } - _fileSystemHandler.WriteFile(filename, requestMessage.BodyAsBytes); + _settings.FileSystemHandler.WriteFile(filename, requestMessage.BodyAsBytes); return ResponseMessageBuilder.Create("File created"); } @@ -31,13 +31,13 @@ private ResponseMessage FilePut(RequestMessage requestMessage) { string filename = GetFileNameFromRequestMessage(requestMessage); - if (!_fileSystemHandler.FileExists(filename)) + if (!_settings.FileSystemHandler.FileExists(filename)) { - _logger.Info("The file '{0}' does not exist, updating file will be skipped.", filename); + _settings.Logger.Info("The file '{0}' does not exist, updating file will be skipped.", filename); return ResponseMessageBuilder.Create("File is not found", 404); } - _fileSystemHandler.WriteFile(filename, requestMessage.BodyAsBytes); + _settings.FileSystemHandler.WriteFile(filename, requestMessage.BodyAsBytes); return ResponseMessageBuilder.Create("File updated"); } @@ -46,13 +46,13 @@ private ResponseMessage FileGet(RequestMessage requestMessage) { string filename = GetFileNameFromRequestMessage(requestMessage); - if (!_fileSystemHandler.FileExists(filename)) + if (!_settings.FileSystemHandler.FileExists(filename)) { - _logger.Info("The file '{0}' does not exist.", filename); + _settings.Logger.Info("The file '{0}' does not exist.", filename); return ResponseMessageBuilder.Create("File is not found", 404); } - byte[] bytes = _fileSystemHandler.ReadFile(filename); + byte[] bytes = _settings.FileSystemHandler.ReadFile(filename); var response = new ResponseMessage { StatusCode = 200, @@ -82,9 +82,9 @@ private ResponseMessage FileHead(RequestMessage requestMessage) { string filename = GetFileNameFromRequestMessage(requestMessage); - if (!_fileSystemHandler.FileExists(filename)) + if (!_settings.FileSystemHandler.FileExists(filename)) { - _logger.Info("The file '{0}' does not exist.", filename); + _settings.Logger.Info("The file '{0}' does not exist.", filename); return ResponseMessageBuilder.Create(404); } @@ -95,13 +95,13 @@ private ResponseMessage FileDelete(RequestMessage requestMessage) { string filename = GetFileNameFromRequestMessage(requestMessage); - if (!_fileSystemHandler.FileExists(filename)) + if (!_settings.FileSystemHandler.FileExists(filename)) { - _logger.Info("The file '{0}' does not exist.", filename); + _settings.Logger.Info("The file '{0}' does not exist.", filename); return ResponseMessageBuilder.Create("File is not deleted", 404); } - _fileSystemHandler.DeleteFile(filename); + _settings.FileSystemHandler.DeleteFile(filename); return ResponseMessageBuilder.Create("File deleted."); } diff --git a/src/WireMock.Net/Server/FluentMockServer.cs b/src/WireMock.Net/Server/FluentMockServer.cs index 93b0b906d..752782882 100644 --- a/src/WireMock.Net/Server/FluentMockServer.cs +++ b/src/WireMock.Net/Server/FluentMockServer.cs @@ -27,8 +27,6 @@ public partial class FluentMockServer : IDisposable { private const int ServerStartDelayInMs = 100; - private readonly IWireMockLogger _logger; - private readonly IFileSystemHandler _fileSystemHandler; private readonly IFluentMockServerSettings _settings; private readonly IOwinSelfHost _httpServer; private readonly IWireMockMiddlewareOptions _options = new WireMockMiddlewareOptions(); @@ -187,13 +185,13 @@ public static FluentMockServer StartWithAdminInterfaceAndReadStaticMappings(para private FluentMockServer(IFluentMockServerSettings settings) { _settings = settings; - settings.Logger = settings.Logger ?? new WireMockNullLogger(); - _logger = settings.Logger; - _fileSystemHandler = settings.FileSystemHandler ?? new LocalFileSystemHandler(); + // Set default values if not provided + _settings.Logger = settings.Logger ?? new WireMockNullLogger(); + _settings.FileSystemHandler = settings.FileSystemHandler ?? new LocalFileSystemHandler(); - _logger.Info("WireMock.Net by Stef Heyenrath (https://github.com/WireMock-Net/WireMock.Net)"); - _logger.Debug("WireMock.Net server settings {0}", JsonConvert.SerializeObject(settings, Formatting.Indented)); + _settings.Logger.Info("WireMock.Net by Stef Heyenrath (https://github.com/WireMock-Net/WireMock.Net)"); + _settings.Logger.Debug("WireMock.Net server settings {0}", JsonConvert.SerializeObject(settings, Formatting.Indented)); if (settings.Urls != null) { @@ -205,10 +203,10 @@ private FluentMockServer(IFluentMockServerSettings settings) Urls = new[] { $"{(settings.UseSSL == true ? "https" : "http")}://localhost:{port}" }; } - _options.FileSystemHandler = _fileSystemHandler; + _options.FileSystemHandler = _settings.FileSystemHandler; _options.PreWireMockMiddlewareInit = settings.PreWireMockMiddlewareInit; _options.PostWireMockMiddlewareInit = settings.PostWireMockMiddlewareInit; - _options.Logger = _logger; + _options.Logger = _settings.Logger; #if USE_ASPNETCORE _httpServer = new AspNetCoreSelfHost(_options, Urls); @@ -371,7 +369,7 @@ public void AddGlobalProcessingDelay(TimeSpan delay) [PublicAPI] public void AllowPartialMapping(bool allow = true) { - _logger.Info("AllowPartialMapping is set to {0}", allow); + _settings.Logger.Info("AllowPartialMapping is set to {0}", allow); _options.AllowPartialMapping = allow; } diff --git a/test/WireMock.Net.Tests/FluentMockServerTests.cs b/test/WireMock.Net.Tests/FluentMockServerTests.cs index 4499c0630..97bdead27 100644 --- a/test/WireMock.Net.Tests/FluentMockServerTests.cs +++ b/test/WireMock.Net.Tests/FluentMockServerTests.cs @@ -175,9 +175,11 @@ public async Task FluentMockServer_Should_exclude_restrictedResponseHeader() } [Theory] - [InlineData("GET")] - [InlineData("TRACE")] [InlineData("DELETE")] +#if !NET452 + [InlineData("TRACE")] + [InlineData("GET")] +#endif public async Task FluentMockServer_Should_exclude_body_for_methods_where_body_is_definitely_disallowed(string method) { // Assign diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithBodyFromFileTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithBodyFromFileTests.cs new file mode 100644 index 000000000..4d316b55d --- /dev/null +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithBodyFromFileTests.cs @@ -0,0 +1,45 @@ +using FluentAssertions; +using System.IO; +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; +using WireMock.RequestBuilders; +using WireMock.ResponseBuilders; +using WireMock.Server; +using Xunit; + +namespace WireMock.Net.Tests.ResponseBuilders +{ + public class ResponseWithBodyFromFileTests + { + [Fact] + public async Task Response_ProvideResponse_WithBodyFromFile() + { + // Arrange + var server = FluentMockServer.Start(); + + string path = Path.Combine(Directory.GetCurrentDirectory(), "__admin", "mappings", "MyXmlResponse.xml"); + + server + .Given( + Request + .Create() + .UsingGet() + .WithPath("/v1/content") + ) + .RespondWith( + Response + .Create() + .WithStatusCode(HttpStatusCode.OK) + .WithHeader("Content-Type", "application/xml") + .WithBodyFromFile(path) + ); + + // Act + var response = await new HttpClient().GetStringAsync("http://localhost:" + server.Ports[0] + "/v1/content"); + + // Assert + response.Should().Contain("world"); + } + } +} \ No newline at end of file