From 0e18f25fe4b7df72d602c377c3b97afe06993a7f Mon Sep 17 00:00:00 2001 From: Bjørn Christian Seime Date: Mon, 24 Oct 2022 14:36:38 +0200 Subject: Fallback to 'Host' header for invalid requests using relative path --- .../jdisc/http/server/jetty/AccessLogRequestLog.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/AccessLogRequestLog.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/AccessLogRequestLog.java index 3506d8b991f..13a63efeaa9 100644 --- a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/AccessLogRequestLog.java +++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/AccessLogRequestLog.java @@ -76,7 +76,7 @@ class AccessLogRequestLog extends AbstractLifeCycle implements org.eclipse.jetty addNonNullValue(builder, request.getProtocol(), RequestLogEntry.Builder::httpVersion); addNonNullValue(builder, request.getScheme(), RequestLogEntry.Builder::scheme); addNonNullValue(builder, request.getHeader("User-Agent"), RequestLogEntry.Builder::userAgent); - addNonNullValue(builder, request.getServerName(), RequestLogEntry.Builder::hostString); + addNonNullValue(builder, getServerName(request), RequestLogEntry.Builder::hostString); addNonNullValue(builder, request.getHeader("Referer"), RequestLogEntry.Builder::referer); addNonNullValue(builder, request.getQueryString(), RequestLogEntry.Builder::rawQuery); @@ -131,6 +131,19 @@ class AccessLogRequestLog extends AbstractLifeCycle implements org.eclipse.jetty } } + private static String getServerName(Request request) { + try { + return request.getServerName(); + } catch (IllegalArgumentException e) { + /* + * getServerName() may throw IllegalArgumentException for invalid requests where request line contains a URI with relative path. + * Jetty correctly responds with '400 Bad Request' prior to invoking our request log implementation. + */ + logger.log(Level.FINE, e, () -> "Fallback to 'Host' header"); + return request.getHeader("Host"); + } + } + private String getRemoteAddress(HttpServletRequest request) { for (String header : remoteAddressHeaders) { String value = request.getHeader(header); -- cgit v1.2.3