From 4d9256725878886f0b8b2bee90107180457d5629 Mon Sep 17 00:00:00 2001 From: markt Date: Sun, 16 Jan 2011 12:55:55 +0000 Subject: [PATCH] Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=50582 Refactor access logging so chunked encoding is not forced if bytes sent is logged git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1059548 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/catalina/connector/CoyoteAdapter.java | 14 +++++++--- .../org/apache/catalina/valves/AccessLogValve.java | 32 ++++------------------ .../apache/catalina/valves/JDBCAccessLogValve.java | 11 ++++---- .../apache/coyote/http11/AbstractOutputBuffer.java | 3 +- webapps/docs/changelog.xml | 4 +++ 5 files changed, 27 insertions(+), 37 deletions(-) diff --git a/java/org/apache/catalina/connector/CoyoteAdapter.java b/java/org/apache/catalina/connector/CoyoteAdapter.java index e4c3eab0b..50580f34c 100644 --- a/java/org/apache/catalina/connector/CoyoteAdapter.java +++ b/java/org/apache/catalina/connector/CoyoteAdapter.java @@ -404,6 +404,9 @@ public class CoyoteAdapter implements Adapter { async = true; } else if (!comet) { response.finishResponse(); + ((Context) request.getMappingData().context).logAccess(request, + response, + System.currentTimeMillis() - req.getStartTime(), false); req.action(ActionCode.POST_REQUEST , null); } @@ -435,9 +438,10 @@ public class CoyoteAdapter implements Adapter { Request request = (Request) req.getNote(ADAPTER_NOTES); Response response = (Response) res.getNote(ADAPTER_NOTES); - + boolean create = false; + if (request == null) { - + create = true; // Create objects request = connector.createRequest(); request.setCoyoteRequest(req); @@ -460,8 +464,10 @@ public class CoyoteAdapter implements Adapter { connector.getService().getContainer().logAccess( request, response, time, true); - request.recycle(); - response.recycle(); + if (create) { + request.recycle(); + response.recycle(); + } } diff --git a/java/org/apache/catalina/valves/AccessLogValve.java b/java/org/apache/catalina/valves/AccessLogValve.java index 2d8fd2583..e5e426a04 100644 --- a/java/org/apache/catalina/valves/AccessLogValve.java +++ b/java/org/apache/catalina/valves/AccessLogValve.java @@ -538,36 +538,14 @@ public class AccessLogValve extends ValveBase implements AccessLog { @Override public void invoke(Request request, Response response) throws IOException, ServletException { - if (getState().isAvailable() && getEnabled()) { - final String t1Name = AccessLogValve.class.getName()+".t1"; - // Pass this request on to the next valve in our pipeline - long t1 = System.currentTimeMillis(); - boolean asyncdispatch = request.isAsyncDispatching(); - if (!asyncdispatch) { - request.setAttribute(t1Name, Long.valueOf(t1)); - } - - getNext().invoke(request, response); - - //we're not done with the request - if (request.isAsyncDispatching()) { - return; - } else if (asyncdispatch && request.getAttribute(t1Name)!=null) { - t1 = ((Long)request.getAttribute(t1Name)).longValue(); - } - - long t2 = System.currentTimeMillis(); - long time = t2 - t1; - - log(request,response, time); - } else - getNext().invoke(request, response); + getNext().invoke(request, response); } @Override public void log(Request request, Response response, long time) { - if (logElements == null || condition != null + if (!getState().isAvailable() || !getEnabled() || + logElements == null || condition != null && null != request.getRequest().getAttribute(condition)) { return; } @@ -1057,7 +1035,9 @@ public class AccessLogValve extends ValveBase implements AccessLog { @Override public void addElement(StringBuilder buf, Date date, Request request, Response response, long time) { - long length = response.getBytesWritten(true); + // Don't need to flush since trigger for log message is after the + // response has been committed + long length = response.getBytesWritten(false); if (length <= 0 && conversion) { buf.append('-'); } else { diff --git a/java/org/apache/catalina/valves/JDBCAccessLogValve.java b/java/org/apache/catalina/valves/JDBCAccessLogValve.java index b977cb9d0..75539ed87 100644 --- a/java/org/apache/catalina/valves/JDBCAccessLogValve.java +++ b/java/org/apache/catalina/valves/JDBCAccessLogValve.java @@ -436,17 +436,18 @@ public final class JDBCAccessLogValve extends ValveBase implements AccessLog { * in a ServletException. */ @Override - public void invoke(Request request, Response response) - throws IOException, ServletException { - + public void invoke(Request request, Response response) throws IOException, + ServletException { getNext().invoke(request, response); - - log (request, response, 0); } @Override public void log(Request request, Response response, long time) { + if (!getState().isAvailable()) { + return; + } + final String EMPTY = "" ; String remoteHost; diff --git a/java/org/apache/coyote/http11/AbstractOutputBuffer.java b/java/org/apache/coyote/http11/AbstractOutputBuffer.java index 6d5b2afe2..b4a434527 100644 --- a/java/org/apache/coyote/http11/AbstractOutputBuffer.java +++ b/java/org/apache/coyote/http11/AbstractOutputBuffer.java @@ -289,7 +289,7 @@ public abstract class AbstractOutputBuffer implements OutputBuffer{ lastActiveFilter = -1; committed = false; finished = false; - + byteCount = 0; } /** @@ -315,7 +315,6 @@ public abstract class AbstractOutputBuffer implements OutputBuffer{ if (lastActiveFilter != -1) activeFilters[lastActiveFilter].end(); finished = true; - byteCount = 0; } public abstract void sendAck() throws IOException; diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 0c1d8bbce..423374cf9 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -65,6 +65,10 @@ Fix NPE in RemoteAddrFilter, RemoteHostFilter. (kkolinko) + + 50582: Refactor access logging so chunked encoding is not + forced for all requests if bytes sent is logged. (markt) + -- 2.11.0