diff --git a/components/api/src/main/java/com/hotels/styx/api/HttpRequest.java b/components/api/src/main/java/com/hotels/styx/api/HttpRequest.java index 3d9373eead..6b246413d2 100644 --- a/components/api/src/main/java/com/hotels/styx/api/HttpRequest.java +++ b/components/api/src/main/java/com/hotels/styx/api/HttpRequest.java @@ -42,6 +42,7 @@ import static com.hotels.styx.api.HttpHeaderNames.CONTENT_LENGTH; import static com.hotels.styx.api.HttpHeaderNames.HOST; import static com.hotels.styx.api.HttpHeaderValues.KEEP_ALIVE; +import static com.hotels.styx.api.support.CookiesSupport.findCookie; import static io.netty.handler.codec.http.HttpMethod.CONNECT; import static io.netty.handler.codec.http.HttpMethod.DELETE; import static io.netty.handler.codec.http.HttpMethod.GET; @@ -334,9 +335,7 @@ public Iterable queryParamNames() { * @return returns an optional cookie object from the header */ public Optional cookie(String name) { - return cookies().stream() - .filter(cookie -> name.equalsIgnoreCase(cookie.name())) - .findFirst(); + return findCookie(cookies, name); } /** @@ -648,9 +647,7 @@ public Builder addCookie(String name, String value) { * @return {@code this} */ public Builder removeCookie(String name) { - cookies.stream() - .filter(cookie -> cookie.name().equals(name)) - .findFirst() + findCookie(cookies, name) .ifPresent(cookies::remove); return this; diff --git a/components/api/src/main/java/com/hotels/styx/api/HttpResponse.java b/components/api/src/main/java/com/hotels/styx/api/HttpResponse.java index 255223b831..1647f6b371 100644 --- a/components/api/src/main/java/com/hotels/styx/api/HttpResponse.java +++ b/components/api/src/main/java/com/hotels/styx/api/HttpResponse.java @@ -37,6 +37,7 @@ import static com.hotels.styx.api.HttpHeaderNames.CONTENT_LENGTH; import static com.hotels.styx.api.HttpHeaderNames.CONTENT_TYPE; import static com.hotels.styx.api.HttpMessageBody.NO_BODY; +import static com.hotels.styx.api.support.CookiesSupport.findCookie; import static io.netty.buffer.Unpooled.copiedBuffer; import static io.netty.handler.codec.http.HttpResponseStatus.FOUND; import static io.netty.handler.codec.http.HttpResponseStatus.MOVED_PERMANENTLY; @@ -151,9 +152,7 @@ public ImmutableList cookies() { * @return the cookie if present */ public Optional cookie(String name) { - return cookies().stream() - .filter(cookie -> name.equalsIgnoreCase(cookie.name())) - .findFirst(); + return findCookie(cookies, name); } /** @@ -515,11 +514,8 @@ public Builder addCookie(String name, String value) { * @return {@code this} */ public Builder removeCookie(String name) { - cookies.stream() - .filter(cookie -> cookie.name().equalsIgnoreCase(name)) - .findFirst() + findCookie(cookies, name) .ifPresent(cookie -> cookies.remove(cookie)); - return this; } diff --git a/components/api/src/main/java/com/hotels/styx/api/messages/FullHttpMessage.java b/components/api/src/main/java/com/hotels/styx/api/messages/FullHttpMessage.java index 5c52688a08..f278176619 100644 --- a/components/api/src/main/java/com/hotels/styx/api/messages/FullHttpMessage.java +++ b/components/api/src/main/java/com/hotels/styx/api/messages/FullHttpMessage.java @@ -25,6 +25,7 @@ import static com.hotels.styx.api.HttpHeaderNames.CONTENT_LENGTH; import static com.hotels.styx.api.HttpHeaderNames.CONTENT_TYPE; +import static com.hotels.styx.api.support.CookiesSupport.findCookie; /** * All behaviour common to both full requests and full responses. @@ -97,9 +98,7 @@ default List headers(CharSequence name) { * @return the cookie if present */ default Optional cookie(String name) { - return cookies().stream() - .filter(cookie -> name.equalsIgnoreCase(cookie.name())) - .findFirst(); + return findCookie(cookies(), name); } /** diff --git a/components/api/src/main/java/com/hotels/styx/api/messages/FullHttpRequest.java b/components/api/src/main/java/com/hotels/styx/api/messages/FullHttpRequest.java index 021266d877..37b4a4292f 100644 --- a/components/api/src/main/java/com/hotels/styx/api/messages/FullHttpRequest.java +++ b/components/api/src/main/java/com/hotels/styx/api/messages/FullHttpRequest.java @@ -48,6 +48,7 @@ import static com.hotels.styx.api.messages.HttpMethod.httpMethod; import static com.hotels.styx.api.messages.HttpVersion.HTTP_1_1; import static com.hotels.styx.api.messages.HttpVersion.httpVersion; +import static com.hotels.styx.api.support.CookiesSupport.findCookie; import static com.hotels.styx.api.support.CookiesSupport.isCookieHeader; import static java.lang.Integer.parseInt; import static java.net.InetSocketAddress.createUnresolved; @@ -592,9 +593,7 @@ public Builder addCookie(String name, String value) { * @return {@code this} */ public Builder removeCookie(String name) { - cookies.stream() - .filter(cookie -> cookie.name().equalsIgnoreCase(name)) - .findFirst() + findCookie(cookies, name) .ifPresent(cookies::remove); return this; diff --git a/components/api/src/main/java/com/hotels/styx/api/messages/FullHttpResponse.java b/components/api/src/main/java/com/hotels/styx/api/messages/FullHttpResponse.java index 29dff0b9e6..5a56436805 100644 --- a/components/api/src/main/java/com/hotels/styx/api/messages/FullHttpResponse.java +++ b/components/api/src/main/java/com/hotels/styx/api/messages/FullHttpResponse.java @@ -37,6 +37,7 @@ import static com.hotels.styx.api.messages.HttpResponseStatus.statusWithCode; import static com.hotels.styx.api.messages.HttpVersion.HTTP_1_1; import static com.hotels.styx.api.messages.HttpVersion.httpVersion; +import static com.hotels.styx.api.support.CookiesSupport.findCookie; import static java.lang.Integer.parseInt; import static java.util.Objects.requireNonNull; import static rx.Observable.just; @@ -361,9 +362,7 @@ public Builder addCookie(String name, String value) { * @return {@code this} */ public Builder removeCookie(String name) { - cookies.stream() - .filter(cookie -> cookie.name().equalsIgnoreCase(name)) - .findFirst() + findCookie(cookies, name) .ifPresent(cookies::remove); return this; diff --git a/components/api/src/main/java/com/hotels/styx/api/messages/StreamingHttpMessage.java b/components/api/src/main/java/com/hotels/styx/api/messages/StreamingHttpMessage.java index cb39b01cb8..34bb200c3a 100644 --- a/components/api/src/main/java/com/hotels/styx/api/messages/StreamingHttpMessage.java +++ b/components/api/src/main/java/com/hotels/styx/api/messages/StreamingHttpMessage.java @@ -26,6 +26,7 @@ import static com.hotels.styx.api.HttpHeaderNames.CONTENT_LENGTH; import static com.hotels.styx.api.HttpHeaderNames.CONTENT_TYPE; +import static com.hotels.styx.api.support.CookiesSupport.findCookie; /** * All behaviour common to both streaming requests and streaming responses. @@ -86,9 +87,7 @@ default List headers(CharSequence name) { * @return the cookie if present */ default Optional cookie(String name) { - return cookies().stream() - .filter(cookie -> name.equalsIgnoreCase(cookie.name())) - .findFirst(); + return findCookie(cookies(), name); } /** diff --git a/components/api/src/main/java/com/hotels/styx/api/messages/StreamingHttpRequest.java b/components/api/src/main/java/com/hotels/styx/api/messages/StreamingHttpRequest.java index 6f16e52965..7a58db44d8 100644 --- a/components/api/src/main/java/com/hotels/styx/api/messages/StreamingHttpRequest.java +++ b/components/api/src/main/java/com/hotels/styx/api/messages/StreamingHttpRequest.java @@ -50,6 +50,7 @@ import static com.hotels.styx.api.messages.HttpMethod.httpMethod; import static com.hotels.styx.api.messages.HttpVersion.HTTP_1_1; import static com.hotels.styx.api.messages.HttpVersion.httpVersion; +import static com.hotels.styx.api.support.CookiesSupport.findCookie; import static com.hotels.styx.api.support.CookiesSupport.isCookieHeader; import static io.netty.buffer.ByteBufUtil.getBytes; import static io.netty.buffer.Unpooled.compositeBuffer; @@ -577,9 +578,7 @@ public Builder addCookie(String name, String value) { * @return {@code this} */ public Builder removeCookie(String name) { - cookies.stream() - .filter(cookie -> cookie.name().equalsIgnoreCase(name)) - .findFirst() + findCookie(cookies, name) .ifPresent(cookies::remove); return this; diff --git a/components/api/src/main/java/com/hotels/styx/api/messages/StreamingHttpResponse.java b/components/api/src/main/java/com/hotels/styx/api/messages/StreamingHttpResponse.java index 344f1bc86c..79a78d947b 100644 --- a/components/api/src/main/java/com/hotels/styx/api/messages/StreamingHttpResponse.java +++ b/components/api/src/main/java/com/hotels/styx/api/messages/StreamingHttpResponse.java @@ -40,6 +40,7 @@ import static com.hotels.styx.api.messages.HttpResponseStatus.statusWithCode; import static com.hotels.styx.api.messages.HttpVersion.HTTP_1_1; import static com.hotels.styx.api.messages.HttpVersion.httpVersion; +import static com.hotels.styx.api.support.CookiesSupport.findCookie; import static io.netty.buffer.ByteBufUtil.getBytes; import static io.netty.buffer.Unpooled.compositeBuffer; import static io.netty.util.ReferenceCountUtil.release; @@ -320,9 +321,7 @@ public Builder addCookie(String name, String value) { * @return {@code this} */ public Builder removeCookie(String name) { - cookies.stream() - .filter(cookie -> cookie.name().equalsIgnoreCase(name)) - .findFirst() + findCookie(cookies, name) .ifPresent(cookies::remove); return this; diff --git a/components/api/src/main/java/com/hotels/styx/api/support/CookiesSupport.java b/components/api/src/main/java/com/hotels/styx/api/support/CookiesSupport.java index d2dd158c27..d1869919b9 100644 --- a/components/api/src/main/java/com/hotels/styx/api/support/CookiesSupport.java +++ b/components/api/src/main/java/com/hotels/styx/api/support/CookiesSupport.java @@ -15,6 +15,13 @@ */ package com.hotels.styx.api.support; +import com.hotels.styx.api.HttpCookie; + +import java.util.Collection; +import java.util.Optional; + +import static java.util.Objects.requireNonNull; + /** * Does some validation for cookie header names. */ @@ -31,4 +38,20 @@ private CookiesSupport() { public static boolean isCookieHeader(String header) { return "Set-Cookie".equalsIgnoreCase(header) || "Cookie".equalsIgnoreCase(header); } + + /** + * Find a cookie with the specified {@code name}. + * + * @param cookies list of cookies + * @param name cookie name + * @return the cookie if present + */ + public static Optional findCookie(Collection cookies, String name){ + requireNonNull(cookies); + requireNonNull(name); + return cookies + .stream() + .filter(cookie -> name.equals(cookie.name())) + .findFirst(); + } } diff --git a/components/api/src/test/java/com/hotels/styx/api/support/CookiesSupportTest.java b/components/api/src/test/java/com/hotels/styx/api/support/CookiesSupportTest.java index 69a1c7edc9..0c3867f877 100644 --- a/components/api/src/test/java/com/hotels/styx/api/support/CookiesSupportTest.java +++ b/components/api/src/test/java/com/hotels/styx/api/support/CookiesSupportTest.java @@ -15,8 +15,15 @@ */ package com.hotels.styx.api.support; +import com.google.common.collect.ImmutableList; +import com.hotels.styx.api.HttpCookie; +import com.hotels.styx.api.HttpCookieAttribute; import org.testng.annotations.Test; +import java.util.List; +import java.util.Optional; + +import static com.hotels.styx.api.support.CookiesSupport.findCookie; import static com.hotels.styx.api.support.CookiesSupport.isCookieHeader; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; @@ -35,4 +42,17 @@ public void onlyRequestAndResponseCookieHeaderIsAllowed() { assertThat(isCookieHeader("cookiex"), is(false)); } + @Test + public void canFindCookieName(){ + HttpCookie expectedCookie = HttpCookie.cookie("cookie1", "value1", HttpCookieAttribute.httpOnly()); + List cookies = ImmutableList.of(expectedCookie); + assertThat(findCookie(cookies, expectedCookie.name()),is(Optional.of(expectedCookie))); + } + + @Test + public void cookieNamesAreCaseSensitive(){ + HttpCookie expectedCookie = HttpCookie.cookie("cookie1", "value1", HttpCookieAttribute.httpOnly()); + List cookies = ImmutableList.of(expectedCookie); + assertThat(findCookie(cookies, expectedCookie.name().toUpperCase()),is(Optional.empty())); + } } \ No newline at end of file