diff options
author | gjoranv <gv@yahoo-inc.com> | 2017-03-08 16:17:36 +0100 |
---|---|---|
committer | gjoranv <gv@yahoo-inc.com> | 2017-03-09 01:29:42 +0100 |
commit | 44ef733850e75905bd2a6b16485954d4b7b3f15a (patch) | |
tree | a9b58d87b1c3d46ba2d07f74315f8a305e63cb29 /jdisc_http_service | |
parent | 0b3c8ffaedd710f028e2e018f436f5b79b4fd633 (diff) |
Allow retrieving headers from response filters, via RequestView.
Diffstat (limited to 'jdisc_http_service')
4 files changed, 103 insertions, 4 deletions
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/RequestView.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/RequestView.java index f03a16f0bf0..dcee10cede2 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/RequestView.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/RequestView.java @@ -3,7 +3,9 @@ package com.yahoo.jdisc.http.filter; import com.yahoo.jdisc.http.HttpRequest.Method; +import javax.annotation.Nonnull; import java.net.URI; +import java.util.List; import java.util.Optional; /** @@ -20,13 +22,26 @@ public interface RequestView { * @see com.yahoo.jdisc.Request#context() * @return the named data associated with the request that are private to this runtime (not exposed to the client) */ - public Object getAttribute(String name); + Object getAttribute(String name); + + /** + * Returns an immutable view of all values of a named header field. + * Returns an empty list if no such header is present. + */ + @Nonnull + List<String> getHeaders(String name); + + /** + * Convenience method for retrieving the first value of a named header field. + * Returns empty if the header is not set, or if the value list is empty. + */ + Optional<String> getFirstHeader(String name); /** * Returns the Http method. Only present if the underlying request has http-like semantics. */ - public Optional<Method> getMethod(); + Optional<Method> getMethod(); - public URI getUri(); + URI getUri(); } diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/SecurityFilterInvoker.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/SecurityFilterInvoker.java index 2bcb1635dfb..2b53402451c 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/SecurityFilterInvoker.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/SecurityFilterInvoker.java @@ -9,9 +9,12 @@ import com.yahoo.jdisc.http.servlet.ServletRequest; import com.yahoo.jdisc.http.servlet.ServletResponse; import com.yahoo.jdisc.http.server.jetty.FilterInvoker; +import javax.annotation.Nonnull; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.net.URI; +import java.util.Collections; +import java.util.List; import java.util.Optional; /** @@ -82,6 +85,17 @@ public class SecurityFilterInvoker implements FilterInvoker { return request.getAttribute(name); } + + @Nonnull @Override + public List<String> getHeaders(String name) { + return Collections.unmodifiableList(Collections.list(request.getHeaders(name))); + } + + @Override + public Optional<String> getFirstHeader(String name) { + return getHeaders(name).stream().findFirst(); + } + @Override public Optional<Method> getMethod() { return Optional.of(Method.valueOf(request.getMethod())); diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/SecurityResponseFilterChain.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/SecurityResponseFilterChain.java index ae4ea34e45c..ae03f5fcb59 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/SecurityResponseFilterChain.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/SecurityResponseFilterChain.java @@ -14,6 +14,8 @@ import com.yahoo.jdisc.Response; import com.yahoo.jdisc.http.HttpRequest; import com.yahoo.jdisc.http.HttpResponse; +import javax.annotation.Nonnull; + /** * Implementation of TypedFilterChain for DiscFilterResponse * @author tejalk @@ -58,7 +60,7 @@ public class SecurityResponseFilterChain extends AbstractResource implements Res return Collections.unmodifiableList(filters); } - private static class RequestViewImpl implements RequestView { + static class RequestViewImpl implements RequestView { private final Request request; private final Optional<HttpRequest.Method> method; @@ -75,6 +77,17 @@ public class SecurityResponseFilterChain extends AbstractResource implements Res return request.context().get(name); } + @Nonnull @Override + public List<String> getHeaders(String name) { + List<String> headers = request.headers().get(name); + return headers == null ? Collections.emptyList() : Collections.unmodifiableList(headers); + } + + @Override + public Optional<String> getFirstHeader(String name) { + return getHeaders(name).stream().findFirst(); + } + @Override public Optional<HttpRequest.Method> getMethod() { return method; diff --git a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/filter/RequestViewImplTest.java b/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/filter/RequestViewImplTest.java new file mode 100644 index 00000000000..d8ba8bac14a --- /dev/null +++ b/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/filter/RequestViewImplTest.java @@ -0,0 +1,57 @@ +// Copyright 2017 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.jdisc.http.filter; + +import com.google.common.collect.Lists; +import com.yahoo.jdisc.HeaderFields; +import com.yahoo.jdisc.Request; +import com.yahoo.jdisc.http.filter.SecurityResponseFilterChain.RequestViewImpl; +import org.testng.annotations.Test; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static org.testng.Assert.assertEquals; + +/** + * @author gjoranv + */ +public class RequestViewImplTest { + + @Test + public void header_from_the_parent_request_is_available() throws Exception { + final String HEADER = "single-header"; + + HeaderFields parentHeaders = new HeaderFields(); + parentHeaders.add(HEADER, "value"); + + RequestView requestView = newRequestView(parentHeaders); + + assertEquals(requestView.getFirstHeader(HEADER).get(), "value"); + assertEquals(requestView.getHeaders(HEADER).size(), 1); + assertEquals(requestView.getHeaders(HEADER).get(0), "value"); + } + + + @Test + public void multi_value_header_from_the_parent_request_is_available() throws Exception { + final String HEADER = "list-header"; + + HeaderFields parentHeaders = new HeaderFields(); + parentHeaders.add(HEADER, Lists.newArrayList("one", "two")); + + RequestView requestView = newRequestView(parentHeaders); + + assertEquals(requestView.getHeaders(HEADER).size(), 2); + assertEquals(requestView.getHeaders(HEADER).get(0), "one"); + assertEquals(requestView.getHeaders(HEADER).get(1), "two"); + + assertEquals(requestView.getFirstHeader(HEADER).get(), "one"); + } + + private static RequestView newRequestView(HeaderFields parentHeaders) { + Request request = mock(Request.class); + when(request.headers()).thenReturn(parentHeaders); + + return new RequestViewImpl(request); + } + +} |