Author: markt
Date: Wed Jun 24 15:55:54 2009
New Revision: 788062
URL: http://svn.apache.org/viewvc?rev=788062&view=rev
Log:
Make diagnosing broken requests a little easier.
Modified:
tomcat/tc6.0.x/trunk/STATUS.txt
tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/http/Parameters.java
tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml
Modified: tomcat/tc6.0.x/trunk/STATUS.txt
URL:
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/STATUS.txt?rev=788062&r1=788061&r2=788062&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/STATUS.txt (original)
+++ tomcat/tc6.0.x/trunk/STATUS.txt Wed Jun 24 15:55:54 2009
@@ -98,11 +98,6 @@
+1: fhanik
-1:
-* Make diagnosing broken requests a little easier.
- http://people.apache.org/~markt/patches/2009-06-23-parameters-v2.patch
- +1: markt, fhanik, kkolinko
- -1:
-
* Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=47343
Regression in fix for
https://issues.apache.org/bugzilla/show_bug.cgi?id=42747
Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/http/Parameters.java
URL:
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/http/Parameters.java?rev=788062&r1=788061&r2=788062&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/http/Parameters.java
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/http/Parameters.java Wed
Jun 24 15:55:54 2009
@@ -18,6 +18,7 @@
package org.apache.tomcat.util.http;
import java.io.IOException;
+import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Hashtable;
@@ -339,8 +340,11 @@
// if needed
ByteChunk tmpName=new ByteChunk();
ByteChunk tmpValue=new ByteChunk();
+ private ByteChunk origName=new ByteChunk();
+ private ByteChunk origValue=new ByteChunk();
CharChunk tmpNameC=new CharChunk(1024);
CharChunk tmpValueC=new CharChunk(1024);
+ private static final String DEFAULT_ENCODING = "ISO-8859-1";
public void processParameters( byte bytes[], int start, int len ) {
processParameters(bytes, start, len, encoding);
@@ -351,8 +355,15 @@
int end=start+len;
int pos=start;
- if( debug>0 )
- log( "Bytes: " + new String( bytes, start, len ));
+ if(log.isDebugEnabled()) {
+ try {
+ log.debug("Bytes: " +
+ new String(bytes, start, len, DEFAULT_ENCODING));
+ } catch (UnsupportedEncodingException e) {
+ // Should never happen...
+ log.error("Unable to convert bytes", e);
+ }
+ }
do {
boolean noEq=false;
@@ -369,7 +380,16 @@
noEq=true;
valStart=nameEnd;
valEnd=nameEnd;
- if( debug>0) log("no equal " + nameStart + " " + nameEnd + " "
+ new String(bytes, nameStart, nameEnd-nameStart) );
+ if(log.isDebugEnabled()) {
+ try {
+ log.debug("no equal " + nameStart + " " + nameEnd + "
" +
+ new String(bytes, nameStart, nameEnd-nameStart,
+ DEFAULT_ENCODING) );
+ } catch (UnsupportedEncodingException e) {
+ // Should never happen...
+ log.error("Unable to convert bytes", e);
+ }
+ }
}
if( nameEnd== -1 )
nameEnd=end;
@@ -383,24 +403,71 @@
pos=valEnd+1;
if( nameEnd<=nameStart ) {
- log.warn("Parameters: Invalid chunk ignored.");
+ StringBuilder msg = new StringBuilder("Parameters: Invalid
chunk ");
+ // No name eg ...&=xx&... will trigger this
+ if (valEnd >= nameStart) {
+ msg.append('\'');
+ try {
+ msg.append(new String(bytes, nameStart,
+ valEnd - nameStart, DEFAULT_ENCODING));
+ } catch (UnsupportedEncodingException e) {
+ // Should never happen...
+ log.error("Unable to convert bytes", e);
+ }
+ msg.append("' ");
+ }
+ msg.append("ignored.");
+ log.warn(msg);
continue;
// invalid chunk - it's better to ignore
}
tmpName.setBytes( bytes, nameStart, nameEnd-nameStart );
tmpValue.setBytes( bytes, valStart, valEnd-valStart );
-
+
+ // Take copies as if anything goes wrong originals will be
+ // corrupted. This means original values can be logged.
+ // For performance - only done for debug
+ if (log.isDebugEnabled()) {
+ try {
+ origName.append(bytes, nameStart, nameEnd-nameStart);
+ origValue.append(bytes, valStart, valEnd-valStart);
+ } catch (IOException ioe) {
+ // Should never happen...
+ log.error("Error copying parameters", ioe);
+ }
+ }
+
try {
addParam( urlDecode(tmpName, enc), urlDecode(tmpValue, enc) );
} catch (IOException e) {
- // Exception during character decoding: skip parameter
- log.warn("Parameters: Character decoding failed. " +
- "Parameter skipped.", e);
+ StringBuilder msg =
+ new StringBuilder("Parameters: Character decoding
failed.");
+ msg.append(" Parameter '");
+ if (log.isDebugEnabled()) {
+ msg.append(origName.toString());
+ msg.append("' with value '");
+ msg.append(origValue.toString());
+ msg.append("' has been ignored.");
+ log.debug(msg, e);
+ } else {
+ msg.append(tmpName.toString());
+ msg.append("' with value '");
+ msg.append(tmpValue.toString());
+ msg.append("' has been ignored. Note that the name and ");
+ msg.append("value quoted here may corrupted due to the ");
+ msg.append("failed decoding. Use debug level logging to ");
+ msg.append("see the original, non-corrupted values.");
+ log.warn(msg);
+ }
}
tmpName.recycle();
tmpValue.recycle();
-
+ // Only recycle copies if we used them
+ if (log.isDebugEnabled()) {
+ origName.recycle();
+ origValue.recycle();
+ }
} while( pos<end );
}
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=788062&r1=788061&r2=788062&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Wed Jun 24 15:55:54 2009
@@ -101,9 +101,13 @@
(markt)
</update>
<fix>
- Log deployments consistently for WAR, directotry and descriptor
+ Log deployments consistently for WAR, directory and descriptor
deployments. (markt)
</fix>
+ <add>
+ Better logging for parameter decoding issues to help idenitfy broken
+ requests. (markt)
+ </add>
</changelog>
</subsection>
<subsection name="Coyote">
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]