Author: veithen
Date: Fri Jun  5 10:16:25 2009
New Revision: 781972

URL: http://svn.apache.org/viewvc?rev=781972&view=rev
Log:
CharsetDecoderFilter: Don't throw exception for malformed input.

Modified:
    
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/CharsetDecoderFilter.java
    
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Pipeline.java
    
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/ReadOnlyStream.java
    
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Stream.java

Modified: 
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/CharsetDecoderFilter.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/CharsetDecoderFilter.java?rev=781972&r1=781971&r2=781972&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/CharsetDecoderFilter.java
 (original)
+++ 
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/CharsetDecoderFilter.java
 Fri Jun  5 10:16:25 2009
@@ -32,6 +32,8 @@
     private final CharsetDecoder decoder;
     private final ByteBuffer inBuffer = ByteBuffer.allocate(64);
     private final CharBuffer outBuffer = CharBuffer.allocate(64);
+    private int errorCount;
+    private boolean reportErrors = true;
 
     public CharsetDecoderFilter(Writer writer, Charset charset) {
         this.writer = writer;
@@ -49,7 +51,26 @@
             inBuffer.flip();
             coderResult = decoder.decode(inBuffer, outBuffer, 
stream.isEndOfStream());
             if (coderResult.isError()) {
-                throw new StreamException("Character set encoding error");
+                errorCount++;
+                if (reportErrors) {
+                    if (errorCount > 5) {
+                        stream.error("Too many input errors; stop reporting.");
+                        reportErrors = false;
+                    } else {
+                        StringBuffer buffer = new StringBuffer();
+                        buffer.append("Malformed input for charset ");
+                        buffer.append(decoder.charset().name());
+                        buffer.append(':');
+                        for (int i=0; i<coderResult.length(); i++) {
+                            buffer.append(' ');
+                            buffer.append(Integer.toHexString(inBuffer.get() & 
0xFF));
+                        }
+                        stream.error(buffer.toString());
+                    }
+                }
+                if (!reportErrors) {
+                    inBuffer.position(inBuffer.position() + 
coderResult.length());
+                }
             }
             outBuffer.flip();
             try {

Modified: 
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Pipeline.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Pipeline.java?rev=781972&r1=781971&r2=781972&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Pipeline.java
 (original)
+++ 
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Pipeline.java
 Fri Jun  5 10:16:25 2009
@@ -315,6 +315,11 @@
             flushOutput(false);
             nested = nested.next == next ? null : nested.next;
         }
+
+        public void error(String description) {
+            // TODO: for the moment, just to a System.out.println; we should 
report errors in the UI
+            System.out.println("Non fatal error in filter " + 
filter.getClass().getName() + ": " + description);
+        }
     }
     
     private class OutputStreamImpl extends OutputStream {

Modified: 
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/ReadOnlyStream.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/ReadOnlyStream.java?rev=781972&r1=781971&r2=781972&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/ReadOnlyStream.java
 (original)
+++ 
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/ReadOnlyStream.java
 Fri Jun  5 10:16:25 2009
@@ -96,4 +96,8 @@
     public void popFilter() {
         parent.popFilter();
     }
+
+    public void error(String description) {
+        parent.error(description);
+    }
 }

Modified: 
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Stream.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Stream.java?rev=781972&r1=781971&r2=781972&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Stream.java
 (original)
+++ 
webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Stream.java
 Fri Jun  5 10:16:25 2009
@@ -178,4 +178,6 @@
     void pushFilter(StreamFilter filter);
     
     void popFilter();
+    
+    void error(String description);
 }


Reply via email to