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: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to