diff --git a/src/WireMock.Net.RestClient/IWireMockAdminApi.cs b/src/WireMock.Net.RestClient/IWireMockAdminApi.cs
index 2a798cfa..4de6622b 100644
--- a/src/WireMock.Net.RestClient/IWireMockAdminApi.cs
+++ b/src/WireMock.Net.RestClient/IWireMockAdminApi.cs
@@ -24,12 +24,24 @@ public interface IWireMockAdminApi
[Header("Authorization")]
AuthenticationHeaderValue Authorization { get; set; }
+ ///
+ /// Get health status.
+ ///
+ /// The optional cancellationToken.
+ ///
+ /// Returns HttpStatusCode 200 with a value Healthy to indicate that WireMock.Net is healthy.
+ /// Else it returns HttpStatusCode 404.
+ ///
+ [Get("health")]
+ [AllowAnyStatusCode]
+ Task GetHealthAsync(CancellationToken cancellationToken = default);
+
///
/// Get the settings.
///
/// SettingsModel
[Get("settings")]
- Task GetSettingsAsync();
+ Task GetSettingsAsync(CancellationToken cancellationToken = default);
///
/// Update the settings.
diff --git a/src/WireMock.Net/Server/WireMockServer.Admin.cs b/src/WireMock.Net/Server/WireMockServer.Admin.cs
index afb72518..0656efa4 100644
--- a/src/WireMock.Net/Server/WireMockServer.Admin.cs
+++ b/src/WireMock.Net/Server/WireMockServer.Admin.cs
@@ -31,6 +31,7 @@ public partial class WireMockServer
{
private const int EnhancedFileSystemWatcherTimeoutMs = 1000;
private const string AdminFiles = "/__admin/files";
+ private const string AdminHealth = "/__admin/health";
private const string AdminMappings = "/__admin/mappings";
private const string AdminMappingsCode = "/__admin/mappings/code";
private const string AdminMappingsWireMockOrg = "/__admin/mappings/wiremock.org";
@@ -54,6 +55,9 @@ public partial class WireMockServer
#region InitAdmin
private void InitAdmin()
{
+ // __admin/health
+ Given(Request.Create().WithPath(AdminHealth).UsingGet()).AtPriority(WireMockConstants.AdminPriority).RespondWith(new DynamicResponseProvider(HealthGet));
+
// __admin/settings
Given(Request.Create().WithPath(AdminSettings).UsingGet()).AtPriority(WireMockConstants.AdminPriority).RespondWith(new DynamicResponseProvider(SettingsGet));
Given(Request.Create().WithPath(AdminSettings).UsingMethod("PUT", "POST").WithHeader(HttpKnownHeaderNames.ContentType, AdminRequestContentTypeJson)).AtPriority(WireMockConstants.AdminPriority).RespondWith(new DynamicResponseProvider(SettingsUpdate));
@@ -218,6 +222,22 @@ public partial class WireMockServer
}
#endregion
+ #region Health
+ private static IResponseMessage HealthGet(IRequestMessage requestMessage)
+ {
+ return new ResponseMessage
+ {
+ BodyData = new BodyData
+ {
+ DetectedBodyType = BodyType.String,
+ BodyAsString = "Healthy"
+ },
+ StatusCode = (int)HttpStatusCode.OK,
+ Headers = new Dictionary> { { HttpKnownHeaderNames.ContentType, new WireMockList(WireMockConstants.ContentTypeTextPlain) } }
+ };
+ }
+ #endregion
+
#region Settings
private IResponseMessage SettingsGet(IRequestMessage requestMessage)
{
@@ -830,4 +850,4 @@ public partial class WireMockServer
var singleResult = ((JObject)value).ToObject();
return new[] { singleResult! };
}
-}
+}
\ No newline at end of file
diff --git a/test/WireMock.Net.Tests/AdminApi/WireMockAdminApiTests.cs b/test/WireMock.Net.Tests/AdminApi/WireMockAdminApiTests.cs
index dde12f4e..6dc03f37 100644
--- a/test/WireMock.Net.Tests/AdminApi/WireMockAdminApiTests.cs
+++ b/test/WireMock.Net.Tests/AdminApi/WireMockAdminApiTests.cs
@@ -41,6 +41,18 @@ public partial class WireMockAdminApiTests
VerifyNewtonsoftJson.Enable(VerifySettings);
}
+ [Fact]
+ public async Task IWireMockAdminApi_GetHealthAsync()
+ {
+ // Arrange
+ var server = WireMockServer.StartWithAdminInterface();
+ var api = RestClient.For(server.Urls[0]);
+
+ // Act
+ var status = await api.GetHealthAsync().ConfigureAwait(false);
+ status.Should().Be("Healthy");
+ }
+
[Fact]
public async Task IWireMockAdminApi_GetSettingsAsync()
{
diff --git a/test/WireMock.Net.Tests/WireMockServer.Proxy.cs b/test/WireMock.Net.Tests/WireMockServer.Proxy.cs
index 1504b636..6bb753c4 100644
--- a/test/WireMock.Net.Tests/WireMockServer.Proxy.cs
+++ b/test/WireMock.Net.Tests/WireMockServer.Proxy.cs
@@ -117,7 +117,7 @@ public class WireMockServerProxyTests
}
// Assert
- server.Mappings.Should().HaveCount(35);
+ server.Mappings.Should().HaveCount(36);
}
[Fact]
diff --git a/test/WireMock.Net.Tests/WireMockServer.Settings.cs b/test/WireMock.Net.Tests/WireMockServer.Settings.cs
index d1e8e9c9..a698527b 100644
--- a/test/WireMock.Net.Tests/WireMockServer.Settings.cs
+++ b/test/WireMock.Net.Tests/WireMockServer.Settings.cs
@@ -81,7 +81,7 @@ public class WireMockServerSettingsTests
// Assert
server.Mappings.Should().NotBeNull();
- server.Mappings.Should().HaveCount(33);
+ server.Mappings.Should().HaveCount(34);
server.Mappings.All(m => m.Priority == WireMockConstants.AdminPriority).Should().BeTrue();
}
@@ -100,9 +100,9 @@ public class WireMockServerSettingsTests
// Assert
server.Mappings.Should().NotBeNull();
- server.Mappings.Should().HaveCount(34);
+ server.Mappings.Should().HaveCount(35);
- server.Mappings.Count(m => m.Priority == WireMockConstants.AdminPriority).Should().Be(33);
+ server.Mappings.Count(m => m.Priority == WireMockConstants.AdminPriority).Should().Be(34);
server.Mappings.Count(m => m.Priority == WireMockConstants.ProxyPriority).Should().Be(1);
}