Author: fhanik
Date: Tue Aug 21 15:15:40 2007
New Revision: 568307

URL: http://svn.apache.org/viewvc?rev=568307&view=rev
Log:
Fix the B2C converter.
Sometimes data comes in incomplete chunks, and we have to check to see if we 
have available data, otherwise, when we return -1, the underlying 
InputStreamReader actually returns 1, and we get garbage in the output data.
I will discuss this on the dev list, since it affects all tomcat versions, at 
that time I will also provide a test case showing what can happen. Please 
comment on this fix, if there is something alarming

Modified:
    tomcat/trunk/java/org/apache/tomcat/util/buf/B2CConverter.java

Modified: tomcat/trunk/java/org/apache/tomcat/util/buf/B2CConverter.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/buf/B2CConverter.java?rev=568307&r1=568306&r2=568307&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/buf/B2CConverter.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/buf/B2CConverter.java Tue Aug 21 
15:15:40 2007
@@ -22,6 +22,7 @@
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.UnsupportedEncodingException;
+import java.nio.CharBuffer;
 
 /** Efficient conversion of bytes  to character .
  *  
@@ -82,7 +83,7 @@
     {
        try {
            // read from the reader
-           while( true ) { // conv.ready() ) {
+           while( iis.available()>0 ) { // conv.ready() ) {
                int cnt=conv.read( result, 0, BUFFER_SIZE );
                if( cnt <= 0 ) {
                    // End of stream ! - we may be in a bad state
@@ -211,6 +212,18 @@
        return super.read( cbuf, off, len );
     }
     
+    public final int read() throws IOException {
+        return super.read();
+    }
+    
+    public final int read(CharBuffer cb) throws IOException {
+        return super.read(cb);
+    }
+    
+    public final int read(char[] cbuf) throws IOException {
+        return super.read(cbuf);
+    }
+    
     /** Reset the buffer
      */
     public  final void recycle() {
@@ -254,7 +267,7 @@
     public  final int read() throws IOException {
        return (pos < end ) ? (buf[pos++] & 0xff) : -1;
     }
-
+    
     // -------------------- Internal methods --------------------
 
     void setBuffer( byte b[], int p, int l ) {
@@ -269,6 +282,34 @@
        pos=mb.getStart();
        len=mb.getLength();
        end=pos+len;
+    }
+
+    public int available() throws IOException {
+        return end-pos;
+    }
+
+    public boolean markSupported() {
+        return false;
+    }
+
+    public int read(byte[] b) throws IOException {
+        return read(b,0,b.length);
+    }
+
+    /**
+     * Repositions this stream to the position at the time the 
<code>mark</code> method was last called on this input
+     * stream.
+     *
+     * @throws IOException if this stream has not been marked or if the mark 
has been invalidated.
+     * @todo Implement this java.io.InputStream method
+     */
+    public synchronized void reset() throws IOException {
+        //not implemented
+    }
+
+    public long skip(long n) throws IOException {
+        //not implemented
+        return 0L;
     }
 
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to