Merge pull request #3160 from eclipse/jetty-10.0.x-113-customrequestlog

Issue #113 CustomRequestLog as default in jetty-10
This commit is contained in:
Greg Wilkins 2018-12-01 16:32:45 +01:00 committed by GitHub
commit 18b0ad842a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 68 additions and 975 deletions

View File

@ -34,8 +34,8 @@ import org.eclipse.jetty.security.HashLoginService;
import org.eclipse.jetty.security.authentication.BasicAuthenticator;
import org.eclipse.jetty.server.AbstractConnector;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.CustomRequestLog;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.NCSARequestLog;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.ShutdownMonitor;
@ -497,8 +497,7 @@ public class Runner
if (_logFile!=null)
{
NCSARequestLog requestLog = new NCSARequestLog(_logFile);
requestLog.setExtended(false);
CustomRequestLog requestLog = new CustomRequestLog(_logFile);
_server.setRequestLog(requestLog);
}
}

View File

@ -1,30 +0,0 @@
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<!-- =============================================================== -->
<!-- Configure the Jetty Request Log -->
<!-- =============================================================== -->
<Configure id="Server" class="org.eclipse.jetty.server.Server">
<!-- =========================================================== -->
<!-- Configure Request Log for Server -->
<!-- (Use RequestLogHandler for a context specific RequestLog -->
<!-- =========================================================== -->
<Set name="RequestLog">
<New id="RequestLog" class="org.eclipse.jetty.server.AsyncNCSARequestLog">
<Set name="filename"><Property name="jetty.base" default="." />/<Property>
<Name>jetty.requestlog.filePath</Name>
<Deprecated>requestlog.filename</Deprecated>
<Default><Property name="jetty.requestlog.dir" default="logs"/>/yyyy_mm_dd.request.log</Default>
</Property>
</Set>
<Set name="filenameDateFormat"><Property name="jetty.requestlog.filenameDateFormat" default="yyyy_MM_dd"/></Set>
<Set name="retainDays"><Property name="jetty.requestlog.retainDays" default="90"/></Set>
<Set name="append"><Property name="jetty.requestlog.append" default="false"/></Set>
<Set name="extended"><Property name="jetty.requestlog.extended" default="false"/></Set>
<Set name="logCookies"><Property name="jetty.requestlog.cookies" default="false"/></Set>
<Set name="LogTimeZone"><Property name="jetty.requestlog.timezone" default="GMT"/></Set>
<Set name="LogLatency"><Property name="jetty.requestlog.loglatency" default="false"/></Set>
</New>
</Set>
</Configure>

View File

@ -1,13 +1,14 @@
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
[description]
Enables a format string style request log.
An implementation of requestlog using CustomRequestLog and AsyncRequestLogWriter
[provides]
requestlog
requestlog-impl
[tags]
requestlog
logging
[depend]
server
@ -17,8 +18,12 @@ etc/jetty-customrequestlog.xml
[files]
logs/
basehome:modules/requestlog/jetty-customrequestlog.xml|etc/jetty-customrequestlog.xml
[ini-template]
## Format string
# jetty.customrequestlog.formatString=%a - %u %{dd/MMM/yyyy:HH:mm:ss ZZZ|GMT}t "%r" %s %B "%{Referer}i" "%{User-Agent}i" "%C"
## Logging directory (relative to $jetty.base)
# jetty.requestlog.dir=logs
@ -36,6 +41,3 @@ logs/
## Timezone of the log file rollover
# jetty.requestlog.timezone=GMT
## Format string
# jetty.customrequestlog.formatString=%a - %u %{dd/MMM/yyyy:HH:mm:ss ZZZ|GMT}t "%r" %s %B "%{Referer}i" "%{User-Agent}i" "%C"

View File

@ -14,7 +14,7 @@ logback-impl
resources
[provide]
requestlog
requestlog-impl
[xml]
etc/jetty-logback-access.xml

View File

@ -1,44 +1,12 @@
DO NOT EDIT - See: https://www.eclipse.org/jetty/documentation/current/startup-modules.html
[description]
Enables a NCSA style request log.
Enables the default custom request log.
[tags]
requestlog
[depend]
server
[depends]
customrequestlog
[xml]
etc/jetty-requestlog.xml
[files]
logs/
[ini-template]
## Logging directory (relative to $jetty.base)
# jetty.requestlog.dir=logs
## File path
# jetty.requestlog.filePath=${jetty.requestlog.dir}/yyyy_mm_dd.request.log
## Date format for rollovered files (uses SimpleDateFormat syntax)
# jetty.requestlog.filenameDateFormat=yyyy_MM_dd
## How many days to retain old log files
# jetty.requestlog.retainDays=90
## Whether to append to existing file
# jetty.requestlog.append=false
## Whether to use the extended log output
# jetty.requestlog.extended=true
## Whether to log http cookie information
# jetty.requestlog.cookies=true
## Timezone of the log entries
# jetty.requestlog.timezone=GMT
## Whether to log LogLatency
# jetty.requestlog.loglatency=false

View File

@ -1,516 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.server;
import java.io.IOException;
import java.util.Locale;
import javax.servlet.http.Cookie;
import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.pathmap.PathMappings;
import org.eclipse.jetty.server.handler.StatisticsHandler;
import org.eclipse.jetty.util.DateCache;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
/**
* Base implementation of the {@link RequestLog} outputs logs in the pseudo-standard NCSA common log format.
* Configuration options allow a choice between the standard Common Log Format (as used in the 3 log format) and the
* Combined Log Format (single log format). This log format can be output by most web servers, and almost all web log
* analysis software can understand these formats.
*
* @deprecated use {@link CustomRequestLog} given format string {@link CustomRequestLog#EXTENDED_NCSA_FORMAT} with a {@link RequestLog.Writer}
*/
@Deprecated
public class AbstractNCSARequestLog extends ContainerLifeCycle implements RequestLog
{
protected static final Logger LOG = Log.getLogger(AbstractNCSARequestLog.class);
private static ThreadLocal<StringBuilder> _buffers = ThreadLocal.withInitial(() -> new StringBuilder(256));
protected final RequestLog.Writer _requestLogWriter;
private String[] _ignorePaths;
private boolean _extended;
private PathMappings<String> _ignorePathMap;
private boolean _logLatency = false;
private boolean _logCookies = false;
private boolean _logServer = false;
private boolean _preferProxiedForAddress;
private transient DateCache _logDateCache;
private String _logDateFormat = "dd/MMM/yyyy:HH:mm:ss Z";
private Locale _logLocale = Locale.getDefault();
private String _logTimeZone = "GMT";
public AbstractNCSARequestLog(RequestLog.Writer requestLogWriter)
{
this._requestLogWriter = requestLogWriter;
addBean(_requestLogWriter);
}
/**
* Is logging enabled
*
* @return true if logging is enabled
*/
protected boolean isEnabled()
{
return true;
}
/**
* Write requestEntry out. (to disk or slf4j log)
*
* @param requestEntry the request entry
* @throws IOException if unable to write the entry
*/
public void write(String requestEntry) throws IOException
{
_requestLogWriter.write(requestEntry);
}
private void append(StringBuilder buf, String s)
{
if (s == null || s.length() == 0)
buf.append('-');
else
buf.append(s);
}
/**
* Writes the request and response information to the output stream.
*
* @see org.eclipse.jetty.server.RequestLog#log(Request, Response)
*/
@Override
public void log(Request request, Response response)
{
try
{
if (_ignorePathMap != null && _ignorePathMap.getMatch(request.getRequestURI()) != null)
return;
if (!isEnabled())
return;
StringBuilder buf = _buffers.get();
buf.setLength(0);
if (_logServer)
{
append(buf, request.getServerName());
buf.append(' ');
}
String addr = null;
if (_preferProxiedForAddress)
{
addr = request.getHeader(HttpHeader.X_FORWARDED_FOR.toString());
}
if (addr == null)
addr = request.getRemoteAddr();
buf.append(addr);
buf.append(" - ");
String auth = getAuthentication(request);
append(buf, auth == null ? "-" : auth);
buf.append(" [");
if (_logDateCache != null)
buf.append(_logDateCache.format(request.getTimeStamp()));
else
buf.append(request.getTimeStamp());
buf.append("] \"");
append(buf, request.getMethod());
buf.append(' ');
append(buf, request.getOriginalURI());
buf.append(' ');
append(buf, request.getProtocol());
buf.append("\" ");
int status = response.getCommittedMetaData().getStatus();
if (status >= 0)
{
buf.append((char)('0' + ((status / 100) % 10)));
buf.append((char)('0' + ((status / 10) % 10)));
buf.append((char)('0' + (status % 10)));
}
else
buf.append(status);
long written = response.getHttpChannel().getBytesWritten();
if (written >= 0)
{
buf.append(' ');
if (written > 99999)
buf.append(written);
else
{
if (written > 9999)
buf.append((char)('0' + ((written / 10000) % 10)));
if (written > 999)
buf.append((char)('0' + ((written / 1000) % 10)));
if (written > 99)
buf.append((char)('0' + ((written / 100) % 10)));
if (written > 9)
buf.append((char)('0' + ((written / 10) % 10)));
buf.append((char)('0' + (written) % 10));
}
buf.append(' ');
}
else
buf.append(" - ");
if (_extended)
logExtended(buf, request, response);
if (_logCookies)
{
Cookie[] cookies = request.getCookies();
if (cookies == null || cookies.length == 0)
buf.append(" -");
else
{
buf.append(" \"");
for (int i = 0; i < cookies.length; i++)
{
if (i != 0)
buf.append(';');
buf.append(cookies[i].getName());
buf.append('=');
buf.append(cookies[i].getValue());
}
buf.append('\"');
}
}
if (_logLatency)
{
long now = System.currentTimeMillis();
if (_logLatency)
{
buf.append(' ');
buf.append(now - request.getTimeStamp());
}
}
String log = buf.toString();
write(log);
}
catch (IOException e)
{
LOG.warn(e);
}
}
/**
* Extract the user authentication
*
* @param request The request to extract from
* @return The string to log for authenticated user.
*/
protected String getAuthentication(Request request)
{
Authentication authentication = request.getAuthentication();
if (authentication instanceof Authentication.User)
return ((Authentication.User)authentication).getUserIdentity().getUserPrincipal().getName();
// TODO extract the user name if it is Authentication.Deferred and return as '?username'
return null;
}
/**
* Writes extended request and response information to the output stream.
*
* @param b StringBuilder to write to
* @param request request object
* @param response response object
* @throws IOException if unable to log the extended information
*/
protected void logExtended(StringBuilder b, Request request, Response response) throws IOException
{
String referer = request.getHeader(HttpHeader.REFERER.toString());
if (referer == null)
b.append("\"-\" ");
else
{
b.append('"');
b.append(referer);
b.append("\" ");
}
String agent = request.getHeader(HttpHeader.USER_AGENT.toString());
if (agent == null)
b.append("\"-\"");
else
{
b.append('"');
b.append(agent);
b.append('"');
}
}
/**
* Set request paths that will not be logged.
*
* @param ignorePaths array of request paths
*/
public void setIgnorePaths(String[] ignorePaths)
{
_ignorePaths = ignorePaths;
}
/**
* Retrieve the request paths that will not be logged.
*
* @return array of request paths
*/
public String[] getIgnorePaths()
{
return _ignorePaths;
}
/**
* Controls logging of the request cookies.
*
* @param logCookies true - values of request cookies will be logged, false - values of request cookies will not be
* logged
*/
public void setLogCookies(boolean logCookies)
{
_logCookies = logCookies;
}
/**
* Retrieve log cookies flag
*
* @return value of the flag
*/
public boolean getLogCookies()
{
return _logCookies;
}
/**
* Controls logging of the request hostname.
*
* @param logServer true - request hostname will be logged, false - request hostname will not be logged
*/
public void setLogServer(boolean logServer)
{
_logServer = logServer;
}
/**
* Retrieve log hostname flag.
*
* @return value of the flag
*/
public boolean getLogServer()
{
return _logServer;
}
/**
* Controls logging of request processing time.
*
* @param logLatency true - request processing time will be logged false - request processing time will not be
* logged
*/
public void setLogLatency(boolean logLatency)
{
_logLatency = logLatency;
}
/**
* Retrieve log request processing time flag.
*
* @return value of the flag
*/
public boolean getLogLatency()
{
return _logLatency;
}
/**
* @param value true to log dispatch
* @deprecated use {@link StatisticsHandler}
*/
@Deprecated
public void setLogDispatch(boolean value)
{
}
/**
* @return true if logging dispatches
* @deprecated use {@link StatisticsHandler}
*/
@Deprecated
public boolean isLogDispatch()
{
return false;
}
/**
* Controls whether the actual IP address of the connection or the IP address from the X-Forwarded-For header will
* be logged.
*
* @param preferProxiedForAddress true - IP address from header will be logged, false - IP address from the
* connection will be logged
*/
public void setPreferProxiedForAddress(boolean preferProxiedForAddress)
{
_preferProxiedForAddress = preferProxiedForAddress;
}
/**
* Retrieved log X-Forwarded-For IP address flag.
*
* @return value of the flag
*/
public boolean getPreferProxiedForAddress()
{
return _preferProxiedForAddress;
}
/**
* Set the extended request log format flag.
*
* @param extended true - log the extended request information, false - do not log the extended request information
*/
public void setExtended(boolean extended)
{
_extended = extended;
}
/**
* Retrieve the extended request log format flag.
*
* @return value of the flag
*/
@ManagedAttribute("use extended NCSA format")
public boolean isExtended()
{
return _extended;
}
/**
* Set up request logging and open log file.
*
* @see org.eclipse.jetty.util.component.AbstractLifeCycle#doStart()
*/
@Override
protected synchronized void doStart() throws Exception
{
if (_logDateFormat != null)
{
_logDateCache = new DateCache(_logDateFormat, _logLocale, _logTimeZone);
}
if (_ignorePaths != null && _ignorePaths.length > 0)
{
_ignorePathMap = new PathMappings<>();
for (int i = 0; i < _ignorePaths.length; i++)
_ignorePathMap.put(_ignorePaths[i], _ignorePaths[i]);
}
else
_ignorePathMap = null;
super.doStart();
}
@Override
protected void doStop() throws Exception
{
_logDateCache = null;
super.doStop();
}
/**
* Set the timestamp format for request log entries in the file. If this is not set, the pre-formated request
* timestamp is used.
*
* @param format timestamp format string
*/
public void setLogDateFormat(String format)
{
_logDateFormat = format;
}
/**
* Retrieve the timestamp format string for request log entries.
*
* @return timestamp format string.
*/
public String getLogDateFormat()
{
return _logDateFormat;
}
/**
* Set the locale of the request log.
*
* @param logLocale locale object
*/
public void setLogLocale(Locale logLocale)
{
_logLocale = logLocale;
}
/**
* Retrieve the locale of the request log.
*
* @return locale object
*/
public Locale getLogLocale()
{
return _logLocale;
}
/**
* Set the timezone of the request log.
*
* @param tz timezone string
*/
public void setLogTimeZone(String tz)
{
_logTimeZone = tz;
}
/**
* Retrieve the timezone of the request log.
*
* @return timezone string
*/
@ManagedAttribute("the timezone")
public String getLogTimeZone()
{
return _logTimeZone;
}
}

View File

@ -1,39 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.server;
import java.util.concurrent.BlockingQueue;
/**
* An asynchronously writing NCSA Request Log
* @deprecated use {@link CustomRequestLog} given format string {@link CustomRequestLog#EXTENDED_NCSA_FORMAT} with an {@link AsyncRequestLogWriter}
*/
@Deprecated
public class AsyncNCSARequestLog extends NCSARequestLog
{
public AsyncNCSARequestLog()
{
this(null,null);
}
public AsyncNCSARequestLog(String filename, BlockingQueue<String> queue)
{
super(new AsyncRequestLogWriter(filename, queue));
}
}

View File

@ -1,219 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.server;
import java.io.IOException;
import java.util.TimeZone;
import org.eclipse.jetty.util.RolloverFileOutputStream;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
/**
* This {@link RequestLog} implementation outputs logs in the pseudo-standard
* NCSA common log format. Configuration options allow a choice between the
* standard Common Log Format (as used in the 3 log format) and the Combined Log
* Format (single log format). This log format can be output by most web
* servers, and almost all web log analysis software can understand these
* formats.
*
* @deprecated use {@link CustomRequestLog} given format string {@link CustomRequestLog#EXTENDED_NCSA_FORMAT} with a {@link RequestLogWriter}
*/
@Deprecated
@ManagedObject("NCSA standard format request log")
public class NCSARequestLog extends AbstractNCSARequestLog
{
private final RequestLogWriter _requestLogWriter;
/**
* Create request log object with default settings.
*/
public NCSARequestLog()
{
this((String)null);
}
/**
* Create request log object with specified output file name.
*
* @param filename the file name for the request log.
* This may be in the format expected
* by {@link RolloverFileOutputStream}
*/
public NCSARequestLog(String filename)
{
this(new RequestLogWriter(filename));
}
/**
* Create request log object given a RequestLogWriter file name.
*
* @param writer the writer which manages the output of the formatted string
* produced by the {@link RequestLog}
*/
public NCSARequestLog(RequestLogWriter writer)
{
super(writer);
_requestLogWriter = writer;
setExtended(true);
}
/**
* Set the output file name of the request log.
* The file name may be in the format expected by
* {@link RolloverFileOutputStream}.
*
* @param filename file name of the request log
*/
public void setFilename(String filename)
{
_requestLogWriter.setFilename(filename);
}
@Override
public void setLogTimeZone(String tz)
{
super.setLogTimeZone(tz);
_requestLogWriter.setTimeZone(tz);
}
/**
* Retrieve the output file name of the request log.
*
* @return file name of the request log
*/
@ManagedAttribute("file of log")
public String getFilename()
{
return _requestLogWriter.getFileName();
}
/**
* Retrieve the file name of the request log with the expanded
* date wildcard if the output is written to the disk using
* {@link RolloverFileOutputStream}.
*
* @return file name of the request log, or null if not applicable
*/
public String getDatedFilename()
{
return _requestLogWriter.getDatedFilename();
}
@Override
protected boolean isEnabled()
{
return _requestLogWriter.isEnabled();
}
/**
* Set the number of days before rotated log files are deleted.
*
* @param retainDays number of days to keep a log file
*/
public void setRetainDays(int retainDays)
{
_requestLogWriter.setRetainDays(retainDays);
}
/**
* Retrieve the number of days before rotated log files are deleted.
*
* @return number of days to keep a log file
*/
@ManagedAttribute("number of days that log files are kept")
public int getRetainDays()
{
return _requestLogWriter.getRetainDays();
}
/**
* Set append to log flag.
*
* @param append true - request log file will be appended after restart,
* false - request log file will be overwritten after restart
*/
public void setAppend(boolean append)
{
_requestLogWriter.setAppend(append);
}
/**
* Retrieve append to log flag.
*
* @return value of the flag
*/
@ManagedAttribute("existing log files are appends to the new one")
public boolean isAppend()
{
return _requestLogWriter.isAppend();
}
/**
* Set the log file name date format.
*
* @param logFileDateFormat format string that is passed to {@link RolloverFileOutputStream}
* @see RolloverFileOutputStream#RolloverFileOutputStream(String, boolean, int, TimeZone, String, String)
*/
public void setFilenameDateFormat(String logFileDateFormat)
{
_requestLogWriter.setFilenameDateFormat(logFileDateFormat);
}
/**
* Retrieve the file name date format string.
*
* @return the log File Date Format
*/
public String getFilenameDateFormat()
{
return _requestLogWriter.getFilenameDateFormat();
}
@Override
public void write(String requestEntry) throws IOException
{
_requestLogWriter.write(requestEntry);
}
/**
* Set up request logging and open log file.
*
* @see org.eclipse.jetty.util.component.AbstractLifeCycle#doStart()
*/
@Override
protected synchronized void doStart() throws Exception
{
super.doStart();
}
/**
* Close the log file and perform cleanup.
*
* @see org.eclipse.jetty.util.component.AbstractLifeCycle#doStop()
*/
@Override
protected void doStop() throws Exception
{
synchronized (this)
{
super.doStop();
}
}
}

View File

@ -1,67 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.server;
import java.io.IOException;
import org.eclipse.jetty.util.annotation.ManagedObject;
/**
* Implementation of NCSARequestLog where output is sent as a SLF4J INFO Log message on the named logger "org.eclipse.jetty.server.RequestLog"
* @deprecated use {@link CustomRequestLog} given format string {@link CustomRequestLog#EXTENDED_NCSA_FORMAT} with an {@link Slf4jRequestLogWriter}
*/
@Deprecated
@ManagedObject("NCSA standard format request log to slf4j bridge")
public class Slf4jRequestLog extends AbstractNCSARequestLog
{
private final Slf4jRequestLogWriter _requestLogWriter;
public Slf4jRequestLog()
{
this(new Slf4jRequestLogWriter());
}
public Slf4jRequestLog(Slf4jRequestLogWriter writer)
{
super(writer);
_requestLogWriter = writer;
}
public void setLoggerName(String loggerName)
{
_requestLogWriter.setLoggerName(loggerName);
}
public String getLoggerName()
{
return _requestLogWriter.getLoggerName();
}
@Override
protected boolean isEnabled()
{
return _requestLogWriter.isEnabled();
}
@Override
public void write(String requestEntry) throws IOException
{
_requestLogWriter.write(requestEntry);
}
}

View File

@ -34,7 +34,6 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.http.BadMessageException;
import org.eclipse.jetty.server.AbstractNCSARequestLog;
import org.eclipse.jetty.server.CustomRequestLog;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.HttpChannel;
@ -53,7 +52,6 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import org.junit.jupiter.params.provider.ValueSource;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
@ -75,13 +73,6 @@ public class NcsaRequestLogTest
case "customNCSA":
_log = new CustomRequestLog(writer, CustomRequestLog.EXTENDED_NCSA_FORMAT);
break;
case "NCSA":
{
AbstractNCSARequestLog logNCSA = new AbstractNCSARequestLog(writer);
logNCSA.setExtended(true);
_log = logNCSA;
break;
}
default:
throw new IllegalStateException("invalid logType");
}
@ -122,42 +113,47 @@ public class NcsaRequestLogTest
_server.stop();
stacklessLogging.close();
}
// TODO include logback?
public static Stream<Arguments> ncsaImplementations()
{
return Stream.of(Arguments.of("customNCSA"));
}
@ParameterizedTest()
@ValueSource(strings = {"customNCSA", "NCSA"})
@MethodSource("ncsaImplementations")
public void testNotHandled(String logType) throws Exception
{
setup(logType);
testHandlerServerStart();
_connector.getResponse("GET /foo HTTP/1.0\n\n");
String log = _entries.poll(5,TimeUnit.SECONDS);
assertThat(log,containsString("GET /foo HTTP/1.0\" 404 "));
}
@ParameterizedTest()
@ValueSource(strings = {"customNCSA", "NCSA"})
@MethodSource("ncsaImplementations")
public void testRequestLine(String logType) throws Exception
{
setup(logType);
testHandlerServerStart();
_connector.getResponse("GET /foo?data=1 HTTP/1.0\nhost: host:80\n\n");
String log = _entries.poll(5,TimeUnit.SECONDS);
assertThat(log,containsString("GET /foo?data=1 HTTP/1.0\" 200 "));
_connector.getResponse("GET //bad/foo?data=1 HTTP/1.0\n\n");
log = _entries.poll(5,TimeUnit.SECONDS);
assertThat(log,containsString("GET //bad/foo?data=1 HTTP/1.0\" 200 "));
_connector.getResponse("GET http://host:80/foo?data=1 HTTP/1.0\n\n");
log = _entries.poll(5,TimeUnit.SECONDS);
assertThat(log,containsString("GET http://host:80/foo?data=1 HTTP/1.0\" 200 "));
assertThat(log,containsString("GET http://host:80/foo?data=1 HTTP/1.0\" 200 "));
}
@ParameterizedTest()
@ValueSource(strings = {"customNCSA", "NCSA"})
@MethodSource("ncsaImplementations")
public void testHTTP10Host(String logType) throws Exception
{
setup(logType);
@ -171,9 +167,9 @@ public class NcsaRequestLogTest
assertThat(log,containsString("GET /foo?name=value"));
assertThat(log,containsString(" 200 "));
}
@ParameterizedTest()
@ValueSource(strings = {"customNCSA", "NCSA"})
@MethodSource("ncsaImplementations")
public void testHTTP11(String logType) throws Exception
{
setup(logType);
@ -187,9 +183,9 @@ public class NcsaRequestLogTest
assertThat(log,containsString("GET /foo?name=value"));
assertThat(log,containsString(" 200 "));
}
@ParameterizedTest()
@ValueSource(strings = {"customNCSA", "NCSA"})
@MethodSource("ncsaImplementations")
public void testAbsolute(String logType) throws Exception
{
setup(logType);
@ -203,9 +199,9 @@ public class NcsaRequestLogTest
assertThat(log,containsString("GET http://hostname:8888/foo?name=value"));
assertThat(log,containsString(" 200 "));
}
@ParameterizedTest()
@ValueSource(strings = {"customNCSA", "NCSA"})
@MethodSource("ncsaImplementations")
public void testQuery(String logType) throws Exception
{
setup(logType);
@ -216,9 +212,9 @@ public class NcsaRequestLogTest
assertThat(log,containsString("GET /foo?name=value"));
assertThat(log,containsString(" 200 "));
}
@ParameterizedTest()
@ValueSource(strings = {"customNCSA", "NCSA"})
@MethodSource("ncsaImplementations")
public void testSmallData(String logType) throws Exception
{
setup(logType);
@ -229,9 +225,9 @@ public class NcsaRequestLogTest
assertThat(log,containsString("GET /foo?"));
assertThat(log,containsString(" 200 42 "));
}
@ParameterizedTest()
@ValueSource(strings = {"customNCSA", "NCSA"})
@MethodSource("ncsaImplementations")
public void testBigData(String logType) throws Exception
{
setup(logType);
@ -242,9 +238,9 @@ public class NcsaRequestLogTest
assertThat(log,containsString("GET /foo?"));
assertThat(log,containsString(" 200 102400 "));
}
@ParameterizedTest()
@ValueSource(strings = {"customNCSA", "NCSA"})
@MethodSource("ncsaImplementations")
public void testStatus(String logType) throws Exception
{
setup(logType);
@ -255,9 +251,9 @@ public class NcsaRequestLogTest
assertThat(log,containsString("GET /foo?"));
assertThat(log,containsString(" 206 0 "));
}
@ParameterizedTest()
@ValueSource(strings = {"customNCSA", "NCSA"})
@MethodSource("ncsaImplementations")
public void testStatusData(String logType) throws Exception
{
setup(logType);
@ -268,9 +264,9 @@ public class NcsaRequestLogTest
assertThat(log,containsString("GET /foo?"));
assertThat(log,containsString(" 206 42 "));
}
@ParameterizedTest()
@ValueSource(strings = {"customNCSA", "NCSA"})
@MethodSource("ncsaImplementations")
public void testBadRequest(String logType) throws Exception
{
setup(logType);
@ -281,9 +277,9 @@ public class NcsaRequestLogTest
assertThat(log,containsString("\"- - -\""));
assertThat(log,containsString(" 400 "));
}
@ParameterizedTest()
@ValueSource(strings = {"customNCSA", "NCSA"})
@MethodSource("ncsaImplementations")
public void testBadCharacter(String logType) throws Exception
{
setup(logType);
@ -294,9 +290,9 @@ public class NcsaRequestLogTest
assertThat(log,containsString("\"- - -\""));
assertThat(log,containsString(" 400 "));
}
@ParameterizedTest()
@ValueSource(strings = {"customNCSA", "NCSA"})
@MethodSource("ncsaImplementations")
public void testBadVersion(String logType) throws Exception
{
setup(logType);
@ -307,9 +303,9 @@ public class NcsaRequestLogTest
assertThat(log,containsString("\"- - -\""));
assertThat(log,containsString(" 400 "));
}
@ParameterizedTest()
@ValueSource(strings = {"customNCSA", "NCSA"})
@MethodSource("ncsaImplementations")
public void testLongURI(String logType) throws Exception
{
setup(logType);
@ -323,9 +319,9 @@ public class NcsaRequestLogTest
assertThat(log,containsString("\"- - -\""));
assertThat(log,containsString(" 414 "));
}
@ParameterizedTest()
@ValueSource(strings = {"customNCSA", "NCSA"})
@MethodSource("ncsaImplementations")
public void testLongHeader(String logType) throws Exception
{
setup(logType);
@ -339,9 +335,9 @@ public class NcsaRequestLogTest
assertThat(log,containsString("\"METHOD /foo HTTP/1.0\""));
assertThat(log,containsString(" 431 "));
}
@ParameterizedTest()
@ValueSource(strings = {"customNCSA", "NCSA"})
@MethodSource("ncsaImplementations")
public void testBadRequestNoHost(String logType) throws Exception
{
setup(logType);
@ -354,7 +350,7 @@ public class NcsaRequestLogTest
}
@ParameterizedTest()
@ValueSource(strings = {"customNCSA", "NCSA"})
@MethodSource("ncsaImplementations")
public void testUseragentWithout(String logType) throws Exception
{
setup(logType);
@ -367,7 +363,7 @@ public class NcsaRequestLogTest
}
@ParameterizedTest()
@ValueSource(strings = {"customNCSA", "NCSA"})
@MethodSource("ncsaImplementations")
public void testUseragentWith(String logType) throws Exception
{
setup(logType);
@ -381,12 +377,12 @@ public class NcsaRequestLogTest
// Tests from here use these parameters
public static Stream<Arguments> data()
public static Stream<Arguments> scenarios()
{
List<Object[]> data = new ArrayList<>();
for(String logType : Arrays.asList("customNCSA","NCSA"))
ncsaImplementations().forEach(arg->
{
String logType = String.valueOf(arg.get()[0]);
data.add(new Object[]{logType, new NoopHandler(), "/noop", "\"GET /noop HTTP/1.0\" 404"});
data.add(new Object[]{logType, new HelloHandler(), "/hello", "\"GET /hello HTTP/1.0\" 200"});
data.add(new Object[]{logType, new ResponseSendErrorHandler(), "/sendError", "\"GET /sendError HTTP/1.0\" 599"});
@ -397,13 +393,13 @@ public class NcsaRequestLogTest
data.add(new Object[]{logType, new BadMessageHandler(), "/bad", "\"GET /bad HTTP/1.0\" 499"});
data.add(new Object[]{logType, new AbortHandler(), "/bad", "\"GET /bad HTTP/1.0\" 488"});
data.add(new Object[]{logType, new AbortPartialHandler(), "/bad", "\"GET /bad HTTP/1.0\" 200"});
}
});
return data.stream().map(Arguments::of);
}
@ParameterizedTest
@MethodSource("data")
@MethodSource("scenarios")
public void testServerRequestLog(String logType, Handler testHandler, String requestPath, String expectedLogEntry) throws Exception
{
setup(logType);
@ -415,7 +411,7 @@ public class NcsaRequestLogTest
}
@ParameterizedTest
@MethodSource("data")
@MethodSource("scenarios")
public void testLogHandlerWrapper(String logType, Handler testHandler, String requestPath, String expectedLogEntry) throws Exception
{
setup(logType);
@ -429,7 +425,7 @@ public class NcsaRequestLogTest
}
@ParameterizedTest
@MethodSource("data")
@MethodSource("scenarios")
public void testLogHandlerCollectionFirst(String logType, Handler testHandler, String requestPath, String expectedLogEntry) throws Exception
{
setup(logType);
@ -445,7 +441,7 @@ public class NcsaRequestLogTest
@ParameterizedTest
@MethodSource("data")
@MethodSource("scenarios")
public void testLogHandlerCollectionLast(String logType, Handler testHandler, String requestPath, String expectedLogEntry) throws Exception
{
setup(logType);
@ -468,7 +464,7 @@ public class NcsaRequestLogTest
@ParameterizedTest
@MethodSource("data")
@MethodSource("scenarios")
public void testErrorHandler(String logType, Handler testHandler, String requestPath, String expectedLogEntry) throws Exception
{
setup(logType);
@ -503,7 +499,7 @@ public class NcsaRequestLogTest
@ParameterizedTest
@MethodSource("data")
@MethodSource("scenarios")
public void testOKErrorHandler(String logType, Handler testHandler, String requestPath, String expectedLogEntry) throws Exception
{
setup(logType);
@ -531,7 +527,7 @@ public class NcsaRequestLogTest
@ParameterizedTest
@MethodSource("data")
@MethodSource("scenarios")
public void testAsyncDispatch(String logType, Handler testHandler, String requestPath, String expectedLogEntry) throws Exception
{
setup(logType);
@ -562,7 +558,7 @@ public class NcsaRequestLogTest
@ParameterizedTest
@MethodSource("data")
@MethodSource("scenarios")
public void testAsyncComplete(String logType, Handler testHandler, String requestPath, String expectedLogEntry) throws Exception
{
setup(logType);

View File

@ -55,7 +55,6 @@ import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.webapp.Configurations;
import org.eclipse.jetty.webapp.MetaInfConfiguration;
import org.eclipse.jetty.webapp.WebAppContext;
import org.eclipse.jetty.webapp.WebInfConfiguration;
import org.junit.jupiter.api.Disabled;
@Disabled("Not a test case")