diff options
author | Bjørn Christian Seime <bjorncs@yahoo-inc.com> | 2017-07-12 16:09:14 +0200 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@yahoo-inc.com> | 2017-07-12 16:40:59 +0200 |
commit | 0203110fa97f6a9691c1397e667720b9b260d633 (patch) | |
tree | eb780abe4c88a39c57e92a4e4f94ad7c43c24aa6 /jdisc_http_service/src | |
parent | 839291730624c0a605e0e53e476473e190b8925c (diff) |
Expose connection timestamp to all request types
Diffstat (limited to 'jdisc_http_service/src')
5 files changed, 43 insertions, 21 deletions
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/HttpRequest.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/HttpRequest.java index bc41eb0006f..2268b568b18 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/HttpRequest.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/HttpRequest.java @@ -192,14 +192,13 @@ public class HttpRequest extends Request implements ServletOrJdiscHttpRequest { /** * <p>For server requests, this returns the timestamp of when the underlying HTTP channel was connected. - * This is whatever value was returned by {@link - * com.yahoo.jdisc.Timer#currentTimeMillis()} at the time.</p> * * <p>For client requests, this returns the same value as {@link #creationTime(java.util.concurrent.TimeUnit)}.</p> * * @param unit the unit to return the time in * @return the timestamp of when the underlying HTTP channel was connected, or request creation time */ + @Override public long getConnectedAt(TimeUnit unit) { return unit.convert(connectedAt, TimeUnit.MILLISECONDS); } diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/DiscFilterRequest.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/DiscFilterRequest.java index 87342d4d7c4..166194de505 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/DiscFilterRequest.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/filter/DiscFilterRequest.java @@ -1,6 +1,13 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.jdisc.http.filter; +import com.yahoo.jdisc.HeaderFields; +import com.yahoo.jdisc.http.Cookie; +import com.yahoo.jdisc.http.HttpHeaders; +import com.yahoo.jdisc.http.HttpRequest; +import com.yahoo.jdisc.http.HttpRequest.Version; +import com.yahoo.jdisc.http.servlet.ServletOrJdiscHttpRequest; + import java.net.InetSocketAddress; import java.net.URI; import java.security.Principal; @@ -14,16 +21,9 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; - -import com.yahoo.jdisc.http.servlet.ServletOrJdiscHttpRequest; -import com.yahoo.jdisc.HeaderFields; -import com.yahoo.jdisc.http.Cookie; -import com.yahoo.jdisc.http.HttpHeaders; -import com.yahoo.jdisc.http.HttpRequest; -import com.yahoo.jdisc.http.HttpRequest.Version; - /** * The Request class on which all filters will operate upon. * <p> @@ -268,6 +268,10 @@ public abstract class DiscFilterRequest { parent.encodeCookieHeader(cookies); } + public long getConnectedAt(TimeUnit unit) { + return parent.getConnectedAt(unit); + } + public String getProtocol() { return getVersion().name(); } diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/servlet/ServletOrJdiscHttpRequest.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/servlet/ServletOrJdiscHttpRequest.java index ed3cdcb55b8..eaac2b1c415 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/servlet/ServletOrJdiscHttpRequest.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/servlet/ServletOrJdiscHttpRequest.java @@ -9,29 +9,32 @@ import java.net.SocketAddress; import java.net.URI; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; /** * Common interface for JDisc and servlet http requests. */ public interface ServletOrJdiscHttpRequest { - public void copyHeaders(HeaderFields target); + void copyHeaders(HeaderFields target); - public Map<String, List<String>> parameters(); + Map<String, List<String>> parameters(); - public URI getUri(); + URI getUri(); - public HttpRequest.Version getVersion(); + HttpRequest.Version getVersion(); - public String getRemoteHostAddress(); - public String getRemoteHostName(); - public int getRemotePort(); + String getRemoteHostAddress(); + String getRemoteHostName(); + int getRemotePort(); - public void setRemoteAddress(SocketAddress remoteAddress); + void setRemoteAddress(SocketAddress remoteAddress); - public Map<String, Object> context(); + Map<String, Object> context(); - public List<Cookie> decodeCookieHeader(); + List<Cookie> decodeCookieHeader(); - public void encodeCookieHeader(List<Cookie> cookies); + void encodeCookieHeader(List<Cookie> cookies); + + long getConnectedAt(TimeUnit unit); } diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/servlet/ServletRequest.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/servlet/ServletRequest.java index ba5c499e80c..3cbe415d39d 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/servlet/ServletRequest.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/servlet/ServletRequest.java @@ -21,6 +21,9 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.TimeUnit; + +import static com.yahoo.jdisc.http.core.HttpServletRequestUtils.getConnection; /** * Mutable wrapper to use a {@link javax.servlet.http.HttpServletRequest} @@ -39,6 +42,7 @@ public class ServletRequest extends HttpServletRequestWrapper implements Servlet private final Set<String> headerBlacklist = new HashSet<>(); private final Map<String, Object> context = new HashMap<>(); private final Map<String, List<String>> parameters = new HashMap<>(); + private final long connectedAt; private URI uri; private String remoteHostAddress; @@ -57,6 +61,7 @@ public class ServletRequest extends HttpServletRequestWrapper implements Servlet remoteHostAddress = request.getRemoteAddr(); remoteHostName = request.getRemoteHost(); remotePort = request.getRemotePort(); + connectedAt = getConnection(request).getCreatedTimeStamp(); headerFields = new HeaderFields(); Enumeration<String> parentHeaders = request.getHeaderNames(); @@ -242,4 +247,9 @@ public class ServletRequest extends HttpServletRequestWrapper implements Servlet public void encodeCookieHeader(List<Cookie> cookies) { setHeaders(HttpHeaders.Names.COOKIE, Cookie.toCookieHeader(cookies)); } + + @Override + public long getConnectedAt(TimeUnit unit) { + return unit.convert(connectedAt, TimeUnit.MILLISECONDS); + } } diff --git a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/filter/ServletFilterRequestTest.java b/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/filter/ServletFilterRequestTest.java index f0947308b28..c11d24ef888 100644 --- a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/filter/ServletFilterRequestTest.java +++ b/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/filter/ServletFilterRequestTest.java @@ -4,6 +4,8 @@ package com.yahoo.jdisc.http.filter; import com.yahoo.jdisc.http.Cookie; import com.yahoo.jdisc.http.HttpHeaders; import com.yahoo.jdisc.http.servlet.ServletRequest; +import org.eclipse.jetty.server.HttpConnection; +import org.mockito.Mockito; import org.springframework.mock.web.MockHttpServletRequest; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -14,6 +16,7 @@ import java.util.Collections; import java.util.List; import static com.yahoo.jdisc.http.HttpRequest.Version; +import static org.mockito.Mockito.when; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; @@ -60,6 +63,9 @@ public class ServletFilterRequestTest { parent.setParameter(listParamName, listParamValue); parent.addHeader(headerName, headerValue); parent.setAttribute(attributeName, attributeValue); + HttpConnection connection = Mockito.mock(HttpConnection.class); + when(connection.getCreatedTimeStamp()).thenReturn(System.currentTimeMillis()); + parent.setAttribute("org.eclipse.jetty.server.HttpConnection", connection); return new ServletRequest(parent, uri); } |