Author: markt Date: Tue Nov 2 19:26:07 2010 New Revision: 1030188 URL: http://svn.apache.org/viewvc?rev=1030188&view=rev Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=49099 Include requests rejected by CoyoteAdapter in the access log(s)
Added: tomcat/tc6.0.x/trunk/java/org/apache/catalina/AccessLog.java (with props) Modified: tomcat/tc6.0.x/trunk/ (props changed) tomcat/tc6.0.x/trunk/STATUS.txt tomcat/tc6.0.x/trunk/java/org/apache/catalina/Container.java tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/ContainerBase.java tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardEngine.java tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/AccessLogValve.java tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/JDBCAccessLogValve.java tomcat/tc6.0.x/trunk/java/org/apache/coyote/Adapter.java tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpAprProcessor.java tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpProcessor.java tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Processor.java tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml tomcat/tc6.0.x/trunk/webapps/docs/config/valve.xml Propchange: tomcat/tc6.0.x/trunk/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Tue Nov 2 19:26:07 2010 @@ -1 +1 @@ -/tomcat/trunk:601180,606992,612607,630314,640888,652744,653247,666232,673796,673820,677910,683969,683982,684001,684081,684234,684269-684270,685177,687503,687645,689402,690781,691392,691805,692748,693378,694992,695053,695311,696780,696782,698012,698227,698236,698613,699427,699634,701355,709294,709811,709816,710063,710066,710125,710205,711126,711600,712461,712467,713953,714002,718360,719119,719124,719602,719626,719628,720046,720069,721040,721286,721708,721886,723404,723738,726052,727303,728032,728768,728947,729057,729567,729569,729571,729681,729809,729815,729934,730250,730590,731651,732859,732863,734734,740675,740684,742677,742697,742714,744160,744238,746321,746384,746425,747834,747863,748344,750258,750291,750921,751286-751287,751289,751295,752323,753039,757335,757774,758249,758365,758596,758616,758664,759074,761601,762868,762929,762936-762937,763166,763183,763193,763228,763262,763298,763302,763325,763599,763611,763654,763681,763706,764985,764997,765662,768335,769979,770716,77 0809,770876,772872,776921,776924,776935,776945,777464,777466,777576,777625,778379,778523-778524,781528,781779,782145,782791,783316,783696,783724,783756,783762,783766,783863,783934,784453,784602,784614,785381,785688,785768,785859,786468,786487,786490,786496,786667,787627,787770,787985,789389,790405,791041,791184,791194,791224,791243,791326,791328,791789,792740,793372,793757,793882,793981,794082,794673,794822,795043,795152,795210,795457,795466,797168,797425,797596,797607,802727,802940,804462,804544,804734,805153,809131,809603,810916,810977,812125,812137,812432,813001,813013,813866,814180,814708,814876,815972,816252,817442,817822,819339,819361,820110,820132,820874,820954,821397,828196,828201,828210,828225,828759,830378-830379,830999,831106,831774,831785,831828,831850,831860,832214,832218,833121,833545,834047,835036,835336,836405,881396,881412,883130,883134,883146,883165,883177,883362,883565,884341,885038,885231,885241,885260,885901,885991,886019,888072,889363,889606,889716,8901 39,890265,890349-890350,890417,891185-891187,891583,892198,892341,892415,892464,892555,892812,892814,892817,892843,892887,893321,893493,894580,894586,894805,894831,895013,895045,895057,895191,895392,895703,896370,896384,897380-897381,897776,898126,898256,898468,898527,898555,898558,898718,898836,898906,899284,899348,899420,899653,899769-899770,899783,899788,899792,899916,899918-899919,899935,899949,903916,905020,905151,905722,905728,905735,907311,907513,907538,907652,907819,907825,907864,908002,908721,908754,908759,909097,909206,909212,909525,909636,909869,909875,909887,910266,910370,910442,910471,910485,910974,915226,915737,915861,916097,916141,916157,916170,917598,917633,918093,918489,918594,918684,918787,918792,918799,918803,918885,919851,919914,920025,920055,920298,920449,920596,920824,920840,921444,922010,926716,927062,927621,928482,928695,928732,928798,931709,932357,932967,935105,935983,939491,939551,940064,941356,941463,944409,944416,945231,945808,945835,945841,946686 ,948057,950164,950596,950614,950851,950905,951615,953434,954435,955648,955655,956832,957130,957830,958192,960701,963868,964614,966177-966178,966292,966692,981815,991837,993042,1001955,1002185,1002263,1002274,1002349,1002359,1002362,1002481,1002514,1003481,1003488,1003556,1003572,1003581,1003861,1004868-1004869,1005452,1005467,1005647,1005802,1022120,1022134,1022606,1022623,1024224,1024251,1026042,1026784,1026912,1026920 +/tomcat/trunk:601180,606992,612607,630314,640888,652744,653247,666232,673796,673820,677910,683969,683982,684001,684081,684234,684269-684270,685177,687503,687645,689402,690781,691392,691805,692748,693378,694992,695053,695311,696780,696782,698012,698227,698236,698613,699427,699634,701355,709294,709811,709816,710063,710066,710125,710205,711126,711600,712461,712467,713953,714002,718360,719119,719124,719602,719626,719628,720046,720069,721040,721286,721708,721886,723404,723738,726052,727303,728032,728768,728947,729057,729567,729569,729571,729681,729809,729815,729934,730250,730590,731651,732859,732863,734734,740675,740684,742677,742697,742714,744160,744238,746321,746384,746425,747834,747863,748344,750258,750291,750921,751286-751287,751289,751295,752323,753039,757335,757774,758249,758365,758596,758616,758664,759074,761601,762868,762929,762936-762937,763166,763183,763193,763228,763262,763298,763302,763325,763599,763611,763654,763681,763706,764985,764997,765662,768335,769979,770716,77 0809,770876,772872,776921,776924,776935,776945,777464,777466,777576,777625,778379,778523-778524,781528,781779,782145,782791,783316,783696,783724,783756,783762,783766,783863,783934,784453,784602,784614,785381,785688,785768,785859,786468,786487,786490,786496,786667,787627,787770,787985,789389,790405,791041,791184,791194,791224,791243,791326,791328,791789,792740,793372,793757,793882,793981,794082,794673,794822,795043,795152,795210,795457,795466,797168,797425,797596,797607,802727,802940,804462,804544,804734,805153,809131,809603,810916,810977,812125,812137,812432,813001,813013,813866,814180,814708,814876,815972,816252,817442,817822,819339,819361,820110,820132,820874,820954,821397,828196,828201,828210,828225,828759,830378-830379,830999,831106,831774,831785,831828,831850,831860,832214,832218,833121,833545,834047,835036,835336,836405,881396,881412,883130,883134,883146,883165,883177,883362,883565,884341,885038,885231,885241,885260,885901,885991,886019,888072,889363,889606,889716,8901 39,890265,890349-890350,890417,891185-891187,891583,892198,892341,892415,892464,892555,892812,892814,892817,892843,892887,893321,893493,894580,894586,894805,894831,895013,895045,895057,895191,895392,895703,896370,896384,897380-897381,897776,898126,898256,898468,898527,898555,898558,898718,898836,898906,899284,899348,899420,899653,899769-899770,899783,899788,899792,899916,899918-899919,899935,899949,903916,905020,905151,905722,905728,905735,907311,907513,907538,907652,907819,907825,907864,908002,908721,908754,908759,909097,909206,909212,909525,909636,909869,909875,909887,910266,910370,910442,910471,910485,910974,915226,915737,915861,916097,916141,916157,916170,917598,917633,918093,918489,918594,918684,918787,918792,918799,918803,918885,919851,919914,920025,920055,920298,920449,920596,920824,920840,921444,922010,926716,927062,927621,928482,928695,928732,928798,931709,932357,932967,935105,935983,939491,939551,940064,941356,941463,944409,944416,945231,945808,945835,945841,946686 ,948057,950164,950596,950614,950851,950905,951615,953434,954435,955648,955655,956832,957130,957830,958192,960701,963868,964614,966177-966178,966292,966692,981815,991837,993042,1001955,1002185,1002263,1002274,1002349,1002359,1002362,1002481,1002514,1003481,1003488,1003556,1003572,1003581,1003861,1004868-1004869,1005452,1005467,1005647,1005802,1022120,1022134,1022606,1022623,1024224,1024251,1026042,1026784,1026912,1026920,1029767 Modified: tomcat/tc6.0.x/trunk/STATUS.txt URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/STATUS.txt?rev=1030188&r1=1030187&r2=1030188&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/STATUS.txt (original) +++ tomcat/tc6.0.x/trunk/STATUS.txt Tue Nov 2 19:26:07 2010 @@ -89,42 +89,6 @@ PATCHES PROPOSED TO BACKPORT: cause confusion. I'd prefer not to invent a new name, but mention the one that we already have when documenting virtualClasspath. -* Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=49099 - Provide a mechanism for including requests rejected by the CoyoteAdapter in - the standard access log - http://people.apache.org/~markt/patches/2010-07-07-bug49099.patch - This is a backport of: r950587, r950809, r951018, r951093, r951447, - r951892, r952295 - +1: markt, mturk - +1: kkolinko: s/if (accessLog != null)/if (getAccessLog() != null)/ - in StandardEngine.logAccess(..), because otherwise accessLog field is never - initialized and remains null. - -1: - rjung: Would be +1, but one question: in ContainerBase method logAccess(), - if getAccessLog() succeeds, isn't the logging done twice, once there and again - to the parent? It seems either we should check for "!logged" before logging - to the parent (at the moment "logged" isn't used at all), or simply return, because - nothing else is done after parent logging. - - kkolinko (Re: rjung): I understand that it is intended: It is logged in all - parents, but not in the siblings (because passing 'false' as useDefault - argument when calling getParent().logAccess(..)). - - markt (Re: rjung): It is done this way to maintain default behaviour. If you - define an AccessLog for a Host and an Engine, requests to the Host will be - logged in both. The logged flag is used to determine if we need to try and - find a default logger to ensure the request is logged somewhere. - - kkolinko: I do not quite understand why CoyoteAdapter.log() recycles - request and response even if it did not create them, but I do not see - valid reasons why it should not. Access logging occurs once request - processing is completed, so it seems valid to recycle them at that point. - - markt (Re: kkolinko): CoyoteAdapter.log() recycles the request and response - since it may get called without a call to CoyoteAdapter.service() and it was - easier to always recycle than to figure out if a recycle was required or not. - - * Backport the CSRF prevention filter to Tomcat 6 and configure the Manager and Host Manager applications to use it. The configuration is such that the using the old roles (manager, admin) will work and will bypass the CSRF protection Added: tomcat/tc6.0.x/trunk/java/org/apache/catalina/AccessLog.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/AccessLog.java?rev=1030188&view=auto ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/AccessLog.java (added) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/AccessLog.java Tue Nov 2 19:26:07 2010 @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.catalina; + +import org.apache.catalina.connector.Request; +import org.apache.catalina.connector.Response; + + +/** + * Intended for use by a {...@link Valve} to indicate that the {...@link Valve} + * provides access logging. It is used by the Tomcat internals to identify a + * Valve that logs access requests so requests that are rejected + * earlier in the processing chain can still be added to the access log. + * Implementations of this interface should be robust against the provided + * {...@link Request} and {...@link Response} objects being null, having null + * attributes or any other 'oddness' that may result from attempting to log + * a request that was almost certainly rejected because it was mal-formed. + */ +public interface AccessLog { + + /** + * Add the request/response to the access log using the specified processing + * time. + * + * @param request Request (associated with the response) to log + * @param response Response (associated with the request) to log + * @param time Time taken to process the request/response in + * milliseconds (use 0 if not known) + */ + public void log(Request request, Response response, long time); +} Propchange: tomcat/tc6.0.x/trunk/java/org/apache/catalina/AccessLog.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/Container.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/Container.java?rev=1030188&r1=1030187&r2=1030188&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/Container.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/Container.java Tue Nov 2 19:26:07 2010 @@ -440,4 +440,27 @@ public interface Container { public void removePropertyChangeListener(PropertyChangeListener listener); + + + /** + * Log a request/response that was destined for this container but has been + * handled earlier in the processing chain so that the request/response + * still appears in the correct access logs. + * @param request Request (associated with the response) to log + * @param response Response (associated with the request) to log + * @param time Time taken to process the request/response in + * milliseconds (use 0 if not known) + * @param useDefault Flag that indicates that the request/response should + * be logged in the engine's default access log + */ + public void logAccess(Request request, Response response, long time, + boolean useDefault); + + + /** + * Identify the AccessLog to use to log a request/response that was destined + * for this container but was handled earlier in the processing chain so + * that the request/response still appears in the correct access logs. + */ + public AccessLog getAccessLog(); } Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java?rev=1030188&r1=1030187&r2=1030188&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java Tue Nov 2 19:26:07 2010 @@ -344,6 +344,41 @@ public class CoyoteAdapter implements Ad } + public void log(org.apache.coyote.Request req, + org.apache.coyote.Response res, long time) { + + Request request = (Request) req.getNote(ADAPTER_NOTES); + Response response = (Response) res.getNote(ADAPTER_NOTES); + + if (request == null) { + + // Create objects + request = connector.createRequest(); + request.setCoyoteRequest(req); + response = connector.createResponse(); + response.setCoyoteResponse(res); + + // Link objects + request.setResponse(response); + response.setRequest(request); + + // Set as notes + req.setNote(ADAPTER_NOTES, request); + res.setNote(ADAPTER_NOTES, response); + + // Set query string encoding + req.getParameters().setQueryStringEncoding + (connector.getURIEncoding()); + } + + connector.getService().getContainer().logAccess( + request, response, time, true); + + request.recycle(); + response.recycle(); + } + + // ------------------------------------------------------ Protected Methods @@ -406,12 +441,16 @@ public class CoyoteAdapter implements Ad } catch (IOException ioe) { res.setStatus(400); res.setMessage("Invalid URI: " + ioe.getMessage()); + connector.getService().getContainer().logAccess( + request, response, 0, true); return false; } // Normalization if (!normalize(req.decodedURI())) { res.setStatus(400); res.setMessage("Invalid URI"); + connector.getService().getContainer().logAccess( + request, response, 0, true); return false; } // Character decoding @@ -420,6 +459,8 @@ public class CoyoteAdapter implements Ad if (!checkNormalize(req.decodedURI())) { res.setStatus(400); res.setMessage("Invalid URI character encoding"); + connector.getService().getContainer().logAccess( + request, response, 0, true); return false; } } else { @@ -494,6 +535,7 @@ public class CoyoteAdapter implements Ad res.setStatus(405); res.addHeader("Allow", header); res.setMessage("TRACE method is not allowed"); + request.getContext().logAccess(request, response, 0, true); return false; } @@ -514,6 +556,7 @@ public class CoyoteAdapter implements Ad redirectPath = redirectPath + "?" + query; } response.sendRedirect(redirectPath); + request.getContext().logAccess(request, response, 0, true); return false; } @@ -897,8 +940,6 @@ public class CoyoteAdapter implements Ad b[pos + dest] = b[pos + src]; } } - - private String getSessionCookieName(Context context) { String result = null; Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/ContainerBase.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/ContainerBase.java?rev=1030188&r1=1030187&r2=1030188&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/ContainerBase.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/ContainerBase.java Tue Nov 2 19:26:07 2010 @@ -37,6 +37,7 @@ import javax.management.ObjectName; import javax.naming.directory.DirContext; import javax.servlet.ServletException; +import org.apache.catalina.AccessLog; import org.apache.catalina.Cluster; import org.apache.catalina.Container; import org.apache.catalina.ContainerEvent; @@ -279,6 +280,13 @@ public abstract class ContainerBase private boolean threadDone = false; + /** + * The access log to use for requests normally handled by this container + * that have been handled earlier in the processing chain. + */ + protected volatile AccessLog accessLog = null; + private volatile boolean accessLogScanComplete = false; + // ------------------------------------------------------------- Properties @@ -1191,6 +1199,46 @@ public abstract class ContainerBase } + + /** + * Check this container for an access log and if none is found, look to the + * parent. If there is no parent and still none is found, use the NoOp + * access log. + */ + public void logAccess(Request request, Response response, long time, + boolean useDefault) { + + boolean logged = false; + + if (getAccessLog() != null) { + getAccessLog().log(request, response, time); + logged = true; + } + + if (getParent() != null) { + // No need to use default logger once request/response has been logged + // once + getParent().logAccess(request, response, time, (useDefault && !logged)); + } + } + + public AccessLog getAccessLog() { + + if (accessLogScanComplete) { + return accessLog; + } + + Valve valves[] = getPipeline().getValves(); + for (Valve valve : valves) { + if (valve instanceof AccessLog) { + accessLog = (AccessLog) valve; + break; + } + } + accessLogScanComplete = true; + return accessLog; + } + // ------------------------------------------------------- Pipeline Methods @@ -1614,5 +1662,10 @@ public abstract class ContainerBase } + protected static final class NoopAccessLog implements AccessLog { + public void log(Request request, Response response, long time) { + // NOOP + } + } } Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardEngine.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardEngine.java?rev=1030188&r1=1030187&r2=1030188&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardEngine.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardEngine.java Tue Nov 2 19:26:07 2010 @@ -26,12 +26,16 @@ import javax.management.MBeanServer; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; +import org.apache.catalina.AccessLog; import org.apache.catalina.Container; +import org.apache.catalina.Context; import org.apache.catalina.Engine; import org.apache.catalina.Host; import org.apache.catalina.LifecycleException; import org.apache.catalina.Realm; import org.apache.catalina.Service; +import org.apache.catalina.connector.Request; +import org.apache.catalina.connector.Response; import org.apache.catalina.realm.JAASRealm; import org.apache.catalina.util.ServerInfo; import org.apache.juli.logging.Log; @@ -124,6 +128,11 @@ public class StandardEngine */ private String jvmRouteId; + /** + * Default access log to use for request/response pairs where we can't ID + * the intended host and context. + */ + private volatile AccessLog defaultAccessLog; // ------------------------------------------------------------- Properties @@ -470,8 +479,44 @@ public class StandardEngine } + /** + * Override the default implementation. If no access log is defined for the + * Engine, look for one in the Engine's default host and then the default + * host's ROOT context. If still none is found, return the default NoOp + * access log. + */ + public void logAccess(Request request, Response response, long time, + boolean useDefault) { - // ------------------------------------------------------ Protected Methods + boolean logged = false; + + if (getAccessLog() != null) { + accessLog.log(request, response, time); + logged = true; + } + + if (!logged && useDefault) { + Host host = null; + if (defaultAccessLog == null) { + // If we reached this point, this Engine can't have an AccessLog + // Look in the defaultHost + host = (Host) findChild(getDefaultHost()); + defaultAccessLog = host.getAccessLog(); + + if (defaultAccessLog == null) { + // Try the ROOT context of default host + Context context = (Context) host.findChild(""); + defaultAccessLog = context.getAccessLog(); + + if (defaultAccessLog == null) { + defaultAccessLog = new NoopAccessLog(); + } + } + } + + defaultAccessLog.log(request, response, time); + } + } // -------------------- JMX registration -------------------- Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/AccessLogValve.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/AccessLogValve.java?rev=1030188&r1=1030187&r2=1030188&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/AccessLogValve.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/AccessLogValve.java Tue Nov 2 19:26:07 2010 @@ -35,6 +35,7 @@ import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpSession; +import org.apache.catalina.AccessLog; import org.apache.catalina.Lifecycle; import org.apache.catalina.LifecycleException; import org.apache.catalina.LifecycleListener; @@ -118,9 +119,7 @@ import org.apache.juli.logging.LogFactor * @version $Id$ */ -public class AccessLogValve - extends ValveBase - implements Lifecycle { +public class AccessLogValve extends ValveBase implements AccessLog, Lifecycle { private static Log log = LogFactory.getLog(AccessLogValve.class); @@ -556,25 +555,30 @@ public class AccessLogValve long t2 = System.currentTimeMillis(); long time = t2 - t1; - - if (logElements == null || condition != null - && null != request.getRequest().getAttribute(condition)) { - return; - } - - Date date = getDate(); - StringBuffer result = new StringBuffer(128); - - for (int i = 0; i < logElements.length; i++) { - logElements[i].addElement(result, date, request, response, time); - } - - log(result.toString()); + + log(request, response, time); } else getNext().invoke(request, response); } + public void log(Request request, Response response, long time) { + if (logElements == null || condition != null + && null != request.getRequest().getAttribute(condition)) { + return; + } + + Date date = getDate(); + StringBuffer result = new StringBuffer(128); + + for (int i = 0; i < logElements.length; i++) { + logElements[i].addElement(result, date, request, response, time); + } + + log(result.toString()); + } + + /** * Rename the existing log file to something else. Then open the * old log file name up once again. Intended to be called by a JMX Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/JDBCAccessLogValve.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/JDBCAccessLogValve.java?rev=1030188&r1=1030187&r2=1030188&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/JDBCAccessLogValve.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/JDBCAccessLogValve.java Tue Nov 2 19:26:07 2010 @@ -29,6 +29,7 @@ import java.util.Properties; import javax.servlet.ServletException; +import org.apache.catalina.AccessLog; import org.apache.catalina.Lifecycle; import org.apache.catalina.LifecycleException; import org.apache.catalina.LifecycleListener; @@ -114,9 +115,8 @@ import org.apache.catalina.util.StringMa * @author Peter Rossbach */ -public final class JDBCAccessLogValve - extends ValveBase - implements Lifecycle { +public final class JDBCAccessLogValve extends ValveBase + implements AccessLog, Lifecycle { // ----------------------------------------------------------- Constructors @@ -458,11 +458,18 @@ public final class JDBCAccessLogValve */ public void invoke(Request request, Response response) throws IOException, ServletException { - final String EMPTY = "" ; getNext().invoke(request, response); - String remoteHost = EMPTY; + log (request, response, 0); + } + + + public void log(Request request, Response response, long time) { + final String EMPTY = "" ; + + String remoteHost; + if(resolveHosts) remoteHost = request.getRemoteHost(); else Modified: tomcat/tc6.0.x/trunk/java/org/apache/coyote/Adapter.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/Adapter.java?rev=1030188&r1=1030187&r2=1030188&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/coyote/Adapter.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/Adapter.java Tue Nov 2 19:26:07 2010 @@ -45,9 +45,10 @@ public interface Adapter { * runtime exceptions ) */ public void service(Request req, Response res) - throws Exception; + throws Exception; public boolean event(Request req, Response res, SocketStatus status) - throws Exception; + throws Exception; + public void log(Request req, Response res, long time); } Modified: tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpAprProcessor.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpAprProcessor.java?rev=1030188&r1=1030187&r2=1030188&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpAprProcessor.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpAprProcessor.java Tue Nov 2 19:26:07 2010 @@ -406,6 +406,7 @@ public class AjpAprProcessor implements log.debug(sm.getString("ajpprocessor.header.error"), t); // 400 - Bad Request response.setStatus(400); + adapter.log(request, response, 0); error = true; } @@ -417,6 +418,7 @@ public class AjpAprProcessor implements log.debug(sm.getString("ajpprocessor.request.prepare"), t); // 400 - Internal Server Error response.setStatus(400); + adapter.log(request, response, 0); error = true; } @@ -431,6 +433,7 @@ public class AjpAprProcessor implements log.error(sm.getString("ajpprocessor.request.process"), t); // 500 - Internal Server Error response.setStatus(500); + adapter.log(request, response, 0); error = true; } } @@ -811,6 +814,7 @@ public class AjpAprProcessor implements secret = true; if (!tmpMB.equals(requiredSecret)) { response.setStatus(403); + adapter.log(request, response, 0); error = true; } } @@ -827,6 +831,7 @@ public class AjpAprProcessor implements // Check if secret was submitted if required if ((requiredSecret != null) && !secret) { response.setStatus(403); + adapter.log(request, response, 0); error = true; } @@ -875,6 +880,7 @@ public class AjpAprProcessor implements request.serverName().duplicate(request.localName()); } catch (IOException e) { response.setStatus(400); + adapter.log(request, response, 0); error = true; } return; @@ -926,6 +932,7 @@ public class AjpAprProcessor implements error = true; // 400 - Bad request response.setStatus(400); + adapter.log(request, response, 0); break; } port = port + (charValue * mult); Modified: tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpProcessor.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpProcessor.java?rev=1030188&r1=1030187&r2=1030188&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpProcessor.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/ajp/AjpProcessor.java Tue Nov 2 19:26:07 2010 @@ -423,6 +423,7 @@ public class AjpProcessor implements Act log.debug(sm.getString("ajpprocessor.header.error"), t); // 400 - Bad Request response.setStatus(400); + adapter.log(request, response, 0); error = true; } @@ -434,6 +435,7 @@ public class AjpProcessor implements Act log.debug(sm.getString("ajpprocessor.request.prepare"), t); // 400 - Internal Server Error response.setStatus(400); + adapter.log(request, response, 0); error = true; } @@ -448,6 +450,7 @@ public class AjpProcessor implements Act log.error(sm.getString("ajpprocessor.request.process"), t); // 500 - Internal Server Error response.setStatus(500); + adapter.log(request, response, 0); error = true; } } @@ -816,6 +819,7 @@ public class AjpProcessor implements Act secret = true; if (!tmpMB.equals(requiredSecret)) { response.setStatus(403); + adapter.log(request, response, 0); error = true; } } @@ -832,6 +836,7 @@ public class AjpProcessor implements Act // Check if secret was submitted if required if ((requiredSecret != null) && !secret) { response.setStatus(403); + adapter.log(request, response, 0); error = true; } @@ -880,6 +885,7 @@ public class AjpProcessor implements Act request.serverName().duplicate(request.localName()); } catch (IOException e) { response.setStatus(400); + adapter.log(request, response, 0); error = true; } return; @@ -931,6 +937,7 @@ public class AjpProcessor implements Act error = true; // 400 - Bad request response.setStatus(400); + adapter.log(request, response, 0); break; } port = port + (charValue * mult); Modified: tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java?rev=1030188&r1=1030187&r2=1030188&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java Tue Nov 2 19:26:07 2010 @@ -747,6 +747,7 @@ public class Http11AprProcessor implemen log.error(sm.getString("http11processor.request.process"), t); // 500 - Internal Server Error response.setStatus(500); + adapter.log(request, response, 0); error = true; } @@ -833,6 +834,7 @@ public class Http11AprProcessor implemen } // 400 - Bad Request response.setStatus(400); + adapter.log(request, response, 0); error = true; } @@ -847,6 +849,7 @@ public class Http11AprProcessor implemen } // 400 - Internal Server Error response.setStatus(400); + adapter.log(request, response, 0); error = true; } } @@ -874,6 +877,7 @@ public class Http11AprProcessor implemen log.error(sm.getString("http11processor.request.process"), t); // 500 - Internal Server Error response.setStatus(500); + adapter.log(request, response, 0); error = true; } } @@ -945,6 +949,7 @@ public class Http11AprProcessor implemen log.error(sm.getString("http11processor.request.finish"), t); // 500 - Internal Server Error response.setStatus(500); + adapter.log(request, response, 0); error = true; } try { @@ -1289,6 +1294,7 @@ public class Http11AprProcessor implemen error = true; // Send 505; Unsupported HTTP version response.setStatus(505); + adapter.log(request, response, 0); } MessageBytes methodMB = request.method(); @@ -1386,6 +1392,7 @@ public class Http11AprProcessor implemen error = true; // 501 - Unimplemented response.setStatus(501); + adapter.log(request, response, 0); } startPos = commaPos + 1; commaPos = transferEncodingValue.indexOf(',', startPos); @@ -1397,6 +1404,7 @@ public class Http11AprProcessor implemen error = true; // 501 - Unimplemented response.setStatus(501); + adapter.log(request, response, 0); } } @@ -1415,6 +1423,7 @@ public class Http11AprProcessor implemen error = true; // 400 - Bad request response.setStatus(400); + adapter.log(request, response, 0); } parseHost(valueMB); @@ -1497,6 +1506,7 @@ public class Http11AprProcessor implemen error = true; // 400 - Bad request response.setStatus(400); + adapter.log(request, response, 0); break; } port = port + (charValue * mult); Modified: tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java?rev=1030188&r1=1030187&r2=1030188&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java Tue Nov 2 19:26:07 2010 @@ -771,6 +771,7 @@ public class Http11NioProcessor implemen log.error(sm.getString("http11processor.request.process"), t); // 500 - Internal Server Error response.setStatus(500); + adapter.log(request, response, 0); error = true; } @@ -858,6 +859,7 @@ public class Http11NioProcessor implemen } // 400 - Bad Request response.setStatus(400); + adapter.log(request, response, 0); error = true; } @@ -872,6 +874,7 @@ public class Http11NioProcessor implemen } // 400 - Internal Server Error response.setStatus(400); + adapter.log(request, response, 0); error = true; } } @@ -911,6 +914,7 @@ public class Http11NioProcessor implemen log.error(sm.getString("http11processor.request.process"), t); // 500 - Internal Server Error response.setStatus(500); + adapter.log(request, response, 0); error = true; } } @@ -983,6 +987,7 @@ public class Http11NioProcessor implemen log.error(sm.getString("http11processor.request.finish"), t); // 500 - Internal Server Error response.setStatus(500); + adapter.log(request, response, 0); error = true; } try { @@ -1317,6 +1322,7 @@ public class Http11NioProcessor implemen error = true; // Send 505; Unsupported HTTP version response.setStatus(505); + adapter.log(request, response, 0); } MessageBytes methodMB = request.method(); @@ -1414,6 +1420,7 @@ public class Http11NioProcessor implemen error = true; // 501 - Unimplemented response.setStatus(501); + adapter.log(request, response, 0); } startPos = commaPos + 1; commaPos = transferEncodingValue.indexOf(',', startPos); @@ -1425,6 +1432,7 @@ public class Http11NioProcessor implemen error = true; // 501 - Unimplemented response.setStatus(501); + adapter.log(request, response, 0); } } @@ -1443,6 +1451,7 @@ public class Http11NioProcessor implemen error = true; // 400 - Bad request response.setStatus(400); + adapter.log(request, response, 0); } parseHost(valueMB); @@ -1526,6 +1535,7 @@ public class Http11NioProcessor implemen error = true; // 400 - Bad request response.setStatus(400); + adapter.log(request, response, 0); break; } port = port + (charValue * mult); Modified: tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Processor.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Processor.java?rev=1030188&r1=1030187&r2=1030188&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Processor.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Processor.java Tue Nov 2 19:26:07 2010 @@ -829,6 +829,7 @@ public class Http11Processor implements } // 400 - Bad Request response.setStatus(400); + adapter.log(request, response, 0); error = true; } @@ -843,6 +844,7 @@ public class Http11Processor implements } // 400 - Internal Server Error response.setStatus(400); + adapter.log(request, response, 0); error = true; } } @@ -871,6 +873,7 @@ public class Http11Processor implements log.error(sm.getString("http11processor.request.process"), t); // 500 - Internal Server Error response.setStatus(500); + adapter.log(request, response, 0); error = true; } } @@ -890,6 +893,7 @@ public class Http11Processor implements log.error(sm.getString("http11processor.request.finish"), t); // 500 - Internal Server Error response.setStatus(500); + adapter.log(request, response, 0); error = true; } try { @@ -1197,6 +1201,7 @@ public class Http11Processor implements " Unsupported HTTP version \""+protocolMB+"\""); } response.setStatus(505); + adapter.log(request, response, 0); } MessageBytes methodMB = request.method(); @@ -1294,6 +1299,7 @@ public class Http11Processor implements error = true; // 501 - Unimplemented response.setStatus(501); + adapter.log(request, response, 0); } startPos = commaPos + 1; commaPos = transferEncodingValue.indexOf(',', startPos); @@ -1309,6 +1315,7 @@ public class Http11Processor implements " Unsupported transfer encoding \""+encodingName+"\""); } response.setStatus(501); + adapter.log(request, response, 0); } } @@ -1331,6 +1338,7 @@ public class Http11Processor implements " host header missing"); } response.setStatus(400); + adapter.log(request, response, 0); } parseHost(valueMB); Modified: tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml?rev=1030188&r1=1030187&r2=1030188&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Tue Nov 2 19:26:07 2010 @@ -45,6 +45,10 @@ <subsection name="General"> <changelog> <fix> + <bug>49909</bug>: Provide a mechanism to log requests rejected before + they reach the AccessLogValve to appear in the access log. (markt) + </fix> + <fix> <bug>49674</bug>: Update to Commons Daemon 1.0.3. (markt) </fix> <update> Modified: tomcat/tc6.0.x/trunk/webapps/docs/config/valve.xml URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/config/valve.xml?rev=1030188&r1=1030187&r2=1030188&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/webapps/docs/config/valve.xml (original) +++ tomcat/tc6.0.x/trunk/webapps/docs/config/valve.xml Tue Nov 2 19:26:07 2010 @@ -66,6 +66,20 @@ <code>Host</code>, or <code>Engine</code>), and will record ALL requests processed by that container.</p> + <p>Some requests may be handled by Tomcat before they are passed to a + container. These include redirects from /foo to /foo/ and the rejection of + invalid requests. Where Tomcat can identify the <code>Context</code> that + would have handled the request, the request/response will be logged in the + <code>AccessLog</code>(s) associated <code>Context</code>, <code>Host</code> + and <code>Engine</code>. Where Tomcat cannot identify the + <code>Context</code> that would have handled the request, e.g. in cases + where the URL is invalid, Tomcat will look first in the <code>Engine</code>, + then the default <code>Host</code> for the <code>Engine</code> and finally + the ROOT (or default) <code>Context</code> for the default <code>Host</code> + for an <code>AccessLog</code> implementation. Tomcat will use the first + <code>AccessLog</code> implementation found to log those requests that are + rejected before they are passed to a container.</p> + </subsection> <subsection name="Attributes"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org