diff --git a/src/WireMock.Net/Http/HttpRequestMethods.cs b/src/WireMock.Net/Http/HttpRequestMethods.cs
new file mode 100644
index 00000000..66e012c0
--- /dev/null
+++ b/src/WireMock.Net/Http/HttpRequestMethods.cs
@@ -0,0 +1,18 @@
+namespace WireMock.Http
+{
+ ///
+ /// https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
+ ///
+ internal static class HttpRequestMethods
+ {
+ public const string CONNECT = "CONNECT";
+ public const string DELETE = "DELETE";
+ public const string GET = "GET";
+ public const string HEAD = "HEAD";
+ public const string OPTIONS = "OPTIONS";
+ public const string PATCH = "PATCH";
+ public const string POST = "POST";
+ public const string PUT = "PUT";
+ public const string TRACE = "TRACE";
+ }
+}
\ No newline at end of file
diff --git a/src/WireMock.Net/RequestBuilders/IMethodRequestBuilder.cs b/src/WireMock.Net/RequestBuilders/IMethodRequestBuilder.cs
index 2e27bdc1..3c8cc8b6 100644
--- a/src/WireMock.Net/RequestBuilders/IMethodRequestBuilder.cs
+++ b/src/WireMock.Net/RequestBuilders/IMethodRequestBuilder.cs
@@ -9,6 +9,13 @@ namespace WireMock.RequestBuilders
///
public interface IMethodRequestBuilder : IHeadersRequestBuilder
{
+ ///
+ /// UsingConnect: add HTTP Method matching on `CONNECT` and matchBehaviour (optional).
+ ///
+ /// The match behaviour.
+ /// The .
+ IRequestBuilder UsingConnect(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch);
+
///
/// UsingDelete: add HTTP Method matching on `DELETE` and matchBehaviour (optional).
///
@@ -24,7 +31,7 @@ namespace WireMock.RequestBuilders
IRequestBuilder UsingGet(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch);
///
- /// Add HTTP Method matching on `HEAD` and matchBehaviour (optional).
+ /// UsingHead: Add HTTP Method matching on `HEAD` and matchBehaviour (optional).
///
/// The match behaviour.
/// The .
@@ -44,6 +51,13 @@ namespace WireMock.RequestBuilders
/// The .
IRequestBuilder UsingPatch(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch);
+ ///
+ /// UsingPut: add HTTP Method matching on `OPTIONS` and matchBehaviour (optional).
+ ///
+ /// The match behaviour.
+ /// The .
+ IRequestBuilder UsingOptions(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch);
+
///
/// UsingPut: add HTTP Method matching on `PUT` and matchBehaviour (optional).
///
@@ -51,6 +65,13 @@ namespace WireMock.RequestBuilders
/// The .
IRequestBuilder UsingPut(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch);
+ ///
+ /// UsingTrace: add HTTP Method matching on `TRACE` and matchBehaviour (optional).
+ ///
+ /// The match behaviour.
+ /// The .
+ IRequestBuilder UsingTrace(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch);
+
///
/// UsingAnyMethod: add HTTP Method matching on any method.
///
diff --git a/src/WireMock.Net/RequestBuilders/Request.UsingMethods.cs b/src/WireMock.Net/RequestBuilders/Request.UsingMethods.cs
new file mode 100644
index 00000000..4a92e3c6
--- /dev/null
+++ b/src/WireMock.Net/RequestBuilders/Request.UsingMethods.cs
@@ -0,0 +1,113 @@
+using System.Linq;
+using WireMock.Http;
+using WireMock.Matchers;
+using WireMock.Matchers.Request;
+using WireMock.Validation;
+
+namespace WireMock.RequestBuilders
+{
+ public partial class Request
+ {
+ ///
+ public IRequestBuilder UsingConnect(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
+ {
+ _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, HttpRequestMethods.CONNECT));
+ return this;
+ }
+
+ ///
+ public IRequestBuilder UsingDelete(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
+ {
+ _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, HttpRequestMethods.DELETE));
+ return this;
+ }
+
+ ///
+ public IRequestBuilder UsingGet(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
+ {
+ _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, HttpRequestMethods.GET));
+ return this;
+ }
+
+ ///
+ public IRequestBuilder UsingHead(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
+ {
+ _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, HttpRequestMethods.HEAD));
+ return this;
+ }
+
+ ///
+ public IRequestBuilder UsingOptions(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
+ {
+ _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, HttpRequestMethods.OPTIONS));
+ return this;
+ }
+
+ ///
+ public IRequestBuilder UsingPost(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
+ {
+ _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, HttpRequestMethods.POST));
+ return this;
+ }
+
+ ///
+ public IRequestBuilder UsingPatch(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
+ {
+ _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, HttpRequestMethods.PATCH));
+ return this;
+ }
+
+ ///
+ public IRequestBuilder UsingPut(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
+ {
+ _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, HttpRequestMethods.PUT));
+ return this;
+ }
+
+ ///
+ public IRequestBuilder UsingTrace(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
+ {
+ _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, HttpRequestMethods.TRACE));
+ return this;
+ }
+
+ ///
+ public IRequestBuilder UsingAnyMethod()
+ {
+ var matchers = _requestMatchers.Where(m => m is RequestMessageMethodMatcher).ToList();
+ foreach (var matcher in matchers)
+ {
+ _requestMatchers.Remove(matcher);
+ }
+
+ return this;
+ }
+
+ ///
+ public IRequestBuilder UsingAnyVerb()
+ {
+ return UsingAnyMethod();
+ }
+
+ ///
+ public IRequestBuilder UsingMethod(params string[] methods)
+ {
+ return UsingMethod(MatchBehaviour.AcceptOnMatch, methods);
+ }
+
+ ///
+ public IRequestBuilder UsingVerb(params string[] verbs)
+ {
+ return UsingMethod(verbs);
+ }
+
+ ///
+ public IRequestBuilder UsingMethod(MatchBehaviour matchBehaviour, params string[] methods)
+ {
+ Check.NotNullOrEmpty(methods, nameof(methods));
+
+ _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, methods));
+ return this;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/WireMock.Net/RequestBuilders/Request.cs b/src/WireMock.Net/RequestBuilders/Request.cs
index 50d92498..728ab11b 100644
--- a/src/WireMock.Net/RequestBuilders/Request.cs
+++ b/src/WireMock.Net/RequestBuilders/Request.cs
@@ -151,86 +151,5 @@ namespace WireMock.RequestBuilders
_requestMatchers.Add(new RequestMessageUrlMatcher(funcs));
return this;
}
-
- ///
- public IRequestBuilder UsingDelete(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
- {
- _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, "DELETE"));
- return this;
- }
-
- ///
- public IRequestBuilder UsingGet(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
- {
- _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, "GET"));
- return this;
- }
-
- ///
- public IRequestBuilder UsingHead(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
- {
- _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, "HEAD"));
- return this;
- }
-
- ///
- public IRequestBuilder UsingPost(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
- {
- _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, "POST"));
- return this;
- }
-
- ///
- public IRequestBuilder UsingPatch(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
- {
- _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, "PATCH"));
- return this;
- }
-
- ///
- public IRequestBuilder UsingPut(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch)
- {
- _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, "PUT"));
- return this;
- }
-
- ///
- public IRequestBuilder UsingAnyMethod()
- {
- var matchers = _requestMatchers.Where(m => m is RequestMessageMethodMatcher).ToList();
- foreach (var matcher in matchers)
- {
- _requestMatchers.Remove(matcher);
- }
-
- return this;
- }
-
- ///
- public IRequestBuilder UsingAnyVerb()
- {
- return UsingAnyMethod();
- }
-
- ///
- public IRequestBuilder UsingMethod(params string[] methods)
- {
- return UsingMethod(MatchBehaviour.AcceptOnMatch, methods);
- }
-
- ///
- public IRequestBuilder UsingVerb(params string[] verbs)
- {
- return UsingMethod(verbs);
- }
-
- ///
- public IRequestBuilder UsingMethod(MatchBehaviour matchBehaviour, params string[] methods)
- {
- Check.NotNullOrEmpty(methods, nameof(methods));
-
- _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, methods));
- return this;
- }
}
}
\ No newline at end of file
diff --git a/src/WireMock.Net/Util/BodyParser.cs b/src/WireMock.Net/Util/BodyParser.cs
index 6a6ff102..546e93c4 100644
--- a/src/WireMock.Net/Util/BodyParser.cs
+++ b/src/WireMock.Net/Util/BodyParser.cs
@@ -6,6 +6,7 @@ using System.Text;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Newtonsoft.Json;
+using WireMock.Http;
using WireMock.Matchers;
using WireMock.Types;
using WireMock.Validation;
@@ -30,15 +31,15 @@ namespace WireMock.Util
*/
private static readonly IDictionary BodyAllowedForMethods = new Dictionary
{
- { "HEAD", false },
- { "GET", false },
- { "PUT", true },
- { "POST", true },
- { "DELETE", true },
- { "TRACE", false },
- { "OPTIONS", true },
- { "CONNECT", false },
- { "PATCH", true }
+ { HttpRequestMethods.HEAD, false },
+ { HttpRequestMethods.GET, false },
+ { HttpRequestMethods.PUT, true },
+ { HttpRequestMethods.POST, true },
+ { HttpRequestMethods.DELETE, true },
+ { HttpRequestMethods.TRACE, false },
+ { HttpRequestMethods.OPTIONS, true },
+ { HttpRequestMethods.CONNECT, false },
+ { HttpRequestMethods.PATCH, true }
};
private static readonly IStringMatcher[] MultipartContentTypesMatchers = {
diff --git a/test/WireMock.Net.Tests/RequestBuilders/RequestBuilderUsingMethodTests.cs b/test/WireMock.Net.Tests/RequestBuilders/RequestBuilderUsingMethodTests.cs
index 0872d659..4bfeedc6 100644
--- a/test/WireMock.Net.Tests/RequestBuilders/RequestBuilderUsingMethodTests.cs
+++ b/test/WireMock.Net.Tests/RequestBuilders/RequestBuilderUsingMethodTests.cs
@@ -8,18 +8,54 @@ namespace WireMock.Net.Tests.RequestBuilders
{
public class RequestBuilderUsingMethodTests
{
+ [Fact]
+ public void RequestBuilder_UsingConnect()
+ {
+ // Act
+ var requestBuilder = (Request)Request.Create().UsingConnect();
+
+ // Assert
+ var matchers = requestBuilder.GetPrivateFieldValue>("_requestMatchers");
+ Check.That(matchers.Count).IsEqualTo(1);
+ Check.That((matchers[0] as RequestMessageMethodMatcher).Methods).ContainsExactly("CONNECT");
+ }
+
+ [Fact]
+ public void RequestBuilder_UsingOptions()
+ {
+ // Act
+ var requestBuilder = (Request)Request.Create().UsingOptions();
+
+ // Assert
+ var matchers = requestBuilder.GetPrivateFieldValue>("_requestMatchers");
+ Check.That(matchers.Count).IsEqualTo(1);
+ Check.That((matchers[0] as RequestMessageMethodMatcher).Methods).ContainsExactly("OPTIONS");
+ }
+
[Fact]
public void RequestBuilder_UsingPatch()
{
// Act
var requestBuilder = (Request)Request.Create().UsingPatch();
- // Assert 1
+ // Assert
var matchers = requestBuilder.GetPrivateFieldValue>("_requestMatchers");
Check.That(matchers.Count).IsEqualTo(1);
Check.That((matchers[0] as RequestMessageMethodMatcher).Methods).ContainsExactly("PATCH");
}
+ [Fact]
+ public void RequestBuilder_UsingTrace()
+ {
+ // Act
+ var requestBuilder = (Request)Request.Create().UsingTrace();
+
+ // Assert
+ var matchers = requestBuilder.GetPrivateFieldValue>("_requestMatchers");
+ Check.That(matchers.Count).IsEqualTo(1);
+ Check.That((matchers[0] as RequestMessageMethodMatcher).Methods).ContainsExactly("TRACE");
+ }
+
[Fact]
public void RequestBuilder_UsingAnyMethod_ClearsAllOtherMatches()
{