Skip to content

Commit

Permalink
Cookie #9
Browse files Browse the repository at this point in the history
  • Loading branch information
StefH committed Jan 23, 2017
1 parent 363d96e commit 45aa83e
Show file tree
Hide file tree
Showing 11 changed files with 208 additions and 92 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ WireMock supports matching of requests to stubs and verification queries using t
* HTTP Method
* Query parameters
* Headers
* Cookies
* Request body


Expand Down
6 changes: 5 additions & 1 deletion src/WireMock/HttpListenerRequestMapper.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
Expand All @@ -23,8 +24,11 @@ public RequestMessage Map(HttpListenerRequest listenerRequest)
string bodyAsString = body != null ? listenerRequest.ContentEncoding.GetString(body) : null;
var listenerHeaders = listenerRequest.Headers;
var headers = listenerHeaders.AllKeys.ToDictionary(k => k, k => listenerHeaders[k]);
var cookies = new Dictionary<string, string>();
foreach (Cookie cookie in listenerRequest.Cookies)
cookies.Add(cookie.Name, cookie.Value);

return new RequestMessage(url, verb, body, bodyAsString, headers);
return new RequestMessage(url, verb, body, bodyAsString, headers, cookies);
}

/// <summary>
Expand Down
65 changes: 65 additions & 0 deletions src/WireMock/Matchers/Request/RequestMessageCookieMatcher.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
using System;
using System.Collections.Generic;
using JetBrains.Annotations;
using WireMock.Validation;

namespace WireMock.Matchers.Request
{
/// <summary>
/// The request cookie matcher.
/// </summary>
public class RequestMessageCookieMatcher : IRequestMatcher
{
private readonly string _name;

private readonly IMatcher _matcher;

private readonly Func<IDictionary<string, string>, bool> _cookieFunc;

/// <summary>
/// Initializes a new instance of the <see cref="RequestMessageCookieMatcher"/> class.
/// </summary>
/// <param name="name">The name.</param>
/// <param name="pattern">The pattern.</param>
/// <param name="ignoreCase">The ignoreCase.</param>
public RequestMessageCookieMatcher([NotNull] string name, [NotNull] string pattern, bool ignoreCase = true)
{
Check.NotNull(name, nameof(name));
Check.NotNull(pattern, nameof(pattern));

_name = name;
_matcher = new WildcardMatcher(pattern, ignoreCase);
}

/// <summary>
/// Initializes a new instance of the <see cref="RequestMessageCookieMatcher"/> class.
/// </summary>
/// <param name="func">
/// The func.
/// </param>
public RequestMessageCookieMatcher([NotNull] Func<IDictionary<string, string>, bool> func)
{
Check.NotNull(func, nameof(func));
_cookieFunc = func;
}

/// <summary>
/// Determines whether the specified RequestMessage is match.
/// </summary>
/// <param name="requestMessage">The RequestMessage.</param>
/// <returns>
/// <c>true</c> if the specified RequestMessage is match; otherwise, <c>false</c>.
/// </returns>
public bool IsMatch(RequestMessage requestMessage)
{
if (_cookieFunc != null)
return _cookieFunc(requestMessage.Cookies);

if (requestMessage.Cookies == null)
return false;

string headerValue = requestMessage.Cookies[_name];
return _matcher.IsMatch(headerValue);
}
}
}
3 changes: 3 additions & 0 deletions src/WireMock/Matchers/Request/RequestMessageHeaderMatcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ public bool IsMatch(RequestMessage requestMessage)
if (_headerFunc != null)
return _headerFunc(requestMessage.Headers);

if (requestMessage.Headers == null)
return false;

string headerValue = requestMessage.Headers[_name];
return _matcher.IsMatch(headerValue);
}
Expand Down
4 changes: 2 additions & 2 deletions src/WireMock/Matchers/WildcardMatcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,12 @@ public bool IsMatch(string input)
/// <summary>
/// Copy/paste from http://www.codeproject.com/Tips/57304/Use-wildcard-characters-and-to-compare-strings
/// </summary>
private bool MatchWildcardString(string pattern, string input)
private bool MatchWildcardString([NotNull] string pattern, string input)
{
if (input != null && _ignoreCase)
input = input.ToLower();

if (pattern != null && _ignoreCase)
if (_ignoreCase)
pattern = pattern.ToLower();

if (string.CompareOrdinal(pattern, input) == 0)
Expand Down
45 changes: 45 additions & 0 deletions src/WireMock/RequestBuilders/IHeadersAndCookiesRequestBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using JetBrains.Annotations;
using WireMock.Matchers.Request;

namespace WireMock.RequestBuilders
{
/// <summary>
/// The HeadersAndCookieRequestBuilder interface.
/// </summary>
public interface IHeadersAndCookiesRequestBuilder : IBodyRequestBuilder, IRequestMatcher, IParamsRequestBuilder
{
/// <summary>
/// The with header.
/// </summary>
/// <param name="name">The name.</param>
/// <param name="pattern">The pattern.</param>
/// <param name="ignoreCase">ignore Case</param>
/// <returns>The <see cref="IHeadersAndCookiesRequestBuilder"/>.</returns>
IHeadersAndCookiesRequestBuilder WithHeader(string name, string pattern, bool ignoreCase = true);

/// <summary>
/// The with header.
/// </summary>
/// <param name="func">The headers func.</param>
/// <returns>The <see cref="IHeadersAndCookiesRequestBuilder"/>.</returns>
IHeadersAndCookiesRequestBuilder WithHeader([NotNull] params Func<IDictionary<string, string>, bool>[] func);

/// <summary>
/// The with header.
/// </summary>
/// <param name="name">The name.</param>
/// <param name="pattern">The pattern.</param>
/// <param name="ignoreCase">ignore Case</param>
/// <returns>The <see cref="IHeadersAndCookiesRequestBuilder"/>.</returns>
IHeadersAndCookiesRequestBuilder WithCookie(string name, string pattern, bool ignoreCase = true);

/// <summary>
/// The with header.
/// </summary>
/// <param name="cookieFunc">The func.</param>
/// <returns>The <see cref="IHeadersAndCookiesRequestBuilder"/>.</returns>
IHeadersAndCookiesRequestBuilder WithCookie([NotNull] params Func<IDictionary<string, string>, bool>[] cookieFunc);
}
}
39 changes: 0 additions & 39 deletions src/WireMock/RequestBuilders/IHeadersRequestBuilder.cs

This file was deleted.

30 changes: 15 additions & 15 deletions src/WireMock/RequestBuilders/IVerbRequestBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,61 +5,61 @@ namespace WireMock.RequestBuilders
/// <summary>
/// The VerbRequestBuilder interface.
/// </summary>
public interface IVerbRequestBuilder : IHeadersRequestBuilder
public interface IVerbRequestBuilder : IHeadersAndCookiesRequestBuilder
{
/// <summary>
/// The using get.
/// </summary>
/// <returns>
/// The <see cref="IHeadersRequestBuilder"/>.
/// The <see cref="IHeadersAndCookiesRequestBuilder"/>.
/// </returns>
IHeadersRequestBuilder UsingGet();
IHeadersAndCookiesRequestBuilder UsingGet();

/// <summary>
/// The using post.
/// </summary>
/// <returns>
/// The <see cref="IHeadersRequestBuilder"/>.
/// The <see cref="IHeadersAndCookiesRequestBuilder"/>.
/// </returns>
IHeadersRequestBuilder UsingPost();
IHeadersAndCookiesRequestBuilder UsingPost();

/// <summary>
/// The using delete.
/// </summary>
/// <returns>
/// The <see cref="IHeadersRequestBuilder"/>.
/// The <see cref="IHeadersAndCookiesRequestBuilder"/>.
/// </returns>
IHeadersRequestBuilder UsingDelete();
IHeadersAndCookiesRequestBuilder UsingDelete();

/// <summary>
/// The using put.
/// </summary>
/// <returns>
/// The <see cref="IHeadersRequestBuilder"/>.
/// The <see cref="IHeadersAndCookiesRequestBuilder"/>.
/// </returns>
IHeadersRequestBuilder UsingPut();
IHeadersAndCookiesRequestBuilder UsingPut();

/// <summary>
/// The using head.
/// </summary>
/// <returns>
/// The <see cref="IHeadersRequestBuilder"/>.
/// The <see cref="IHeadersAndCookiesRequestBuilder"/>.
/// </returns>
IHeadersRequestBuilder UsingHead();
IHeadersAndCookiesRequestBuilder UsingHead();

/// <summary>
/// The using any verb.
/// </summary>
/// <returns>
/// The <see cref="IHeadersRequestBuilder"/>.
/// The <see cref="IHeadersAndCookiesRequestBuilder"/>.
/// </returns>
IHeadersRequestBuilder UsingAnyVerb();
IHeadersAndCookiesRequestBuilder UsingAnyVerb();

/// <summary>
/// The using verb.
/// </summary>
/// <param name="verbs">The verb.</param>
/// <returns>The <see cref="IHeadersRequestBuilder"/>.</returns>
IHeadersRequestBuilder UsingVerb([NotNull] params string[] verbs);
/// <returns>The <see cref="IHeadersAndCookiesRequestBuilder"/>.</returns>
IHeadersAndCookiesRequestBuilder UsingVerb([NotNull] params string[] verbs);
}
}
Loading

0 comments on commit 45aa83e

Please sign in to comment.