On 17.12.2013 23:06, sebb wrote:
> On 17 December 2013 21:43,  <rj...@apache.org> wrote:
>> Author: rjung
>> Date: Tue Dec 17 21:43:02 2013
>> New Revision: 1551729
>>
>> URL: http://svn.apache.org/r1551729
>> Log:
>> Fix occasional test failure.
>>
>> The WebSocketClient first read headers via
>> a BufferedReader, then tried to read the body
>> via the underlying InputStream. Depending on
>> the structure of the incoming packets reading
>> the body failed because some bytes were already
>> buffered in the reader and no longer available
>> by the stream. The switch between rader and stream
>> was motivated, because the decoding also had to
>> switch from ISO-8859-1 (headers) to UTF-8 (body).
>>
>> We now simulate a rudimentary reader which always
>> reads from the stream and allows to change the
>> decoding charset while reading.
> 
> It would be helpful to include this log message in the code comments.
> 
> The commit log is basically ephemeral - it should (only) document why
> the commit was made.
> In this case "Fix occasional test failure." would be sufficient.
> 
> Comments that may be needed to understand why the code behaves in a
> particular way belong as comments in the code.
> After all, the mission of the ASF is to release source, which should
> be able to stand on its own.

That's why I added the comment

+        /*
+         * This is not a real reader but just a thin wrapper around
+         * an input stream that allows to switch encoding during
+         * reading.
+         * An example is reading headers using ISO-8859-1 and a body
+         * using UTF-8.
+         * The class is not thread-safe and not well-performing.
+         */

to the class. IMHO here it doesn't make sense to add an explanation for
the old no longer existing bug. IMHO it is a general anti-pattern not
especially related to this test class so it doesn't make sense to
document any past bugs in the code.

Regards,

Rainer

>> Modified:
>>     
>> tomcat/tc7.0.x/trunk/test/org/apache/catalina/websocket/TestWebSocket.java
>>
>> Modified: 
>> tomcat/tc7.0.x/trunk/test/org/apache/catalina/websocket/TestWebSocket.java
>> URL: 
>> http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/catalina/websocket/TestWebSocket.java?rev=1551729&r1=1551728&r2=1551729&view=diff
>> ==============================================================================
>> --- 
>> tomcat/tc7.0.x/trunk/test/org/apache/catalina/websocket/TestWebSocket.java 
>> (original)
>> +++ 
>> tomcat/tc7.0.x/trunk/test/org/apache/catalina/websocket/TestWebSocket.java 
>> Tue Dec 17 21:43:02 2013
>> @@ -16,13 +16,11 @@
>>   */
>>  package org.apache.catalina.websocket;
>>
>> -import java.io.BufferedReader;
>> +import java.io.BufferedInputStream;
>>  import java.io.IOException;
>>  import java.io.InputStream;
>> -import java.io.InputStreamReader;
>>  import java.io.OutputStream;
>>  import java.io.OutputStreamWriter;
>> -import java.io.Reader;
>>  import java.io.Writer;
>>  import java.net.InetSocketAddress;
>>  import java.net.Socket;
>> @@ -382,12 +380,11 @@ public class TestWebSocket extends Tomca
>>
>>      private static class WebSocketClient {
>>          private OutputStream os;
>> -        private InputStream is;
>>          private boolean isContinuation = false;
>>          final String encoding = "ISO-8859-1";
>> -        private Socket socket ;
>> -        private Writer writer ;
>> -        private BufferedReader reader;
>> +        private Socket socket;
>> +        private Writer writer;
>> +        private CustomReader reader;
>>
>>          public WebSocketClient(int port) {
>>              SocketAddress addr = new InetSocketAddress("localhost", port);
>> @@ -397,9 +394,7 @@ public class TestWebSocket extends Tomca
>>                  socket.connect(addr, 10000);
>>                  os = socket.getOutputStream();
>>                  writer = new OutputStreamWriter(os, encoding);
>> -                is = socket.getInputStream();
>> -                Reader r = new InputStreamReader(is, encoding);
>> -                reader = new BufferedReader(r);
>> +                reader = new CustomReader(socket.getInputStream(), 
>> encoding);
>>              } catch (Exception e) {
>>                  throw new RuntimeException(e);
>>              }
>> @@ -449,28 +444,100 @@ public class TestWebSocket extends Tomca
>>          }
>>
>>          private String readMessage() throws IOException {
>> -            ByteChunk bc = new ByteChunk(125);
>> -            CharChunk cc = new CharChunk(125);
>>
>>              // Skip first byte
>> -            is.read();
>> +            reader.read();
>>
>>              // Get payload length
>> -            int len = is.read() & 0x7F;
>> +            int len = reader.read() & 0x7F;
>>              assertTrue(len < 126);
>>
>>              // Read payload
>> -            int read = 0;
>> -            while (read < len) {
>> -                read = read + is.read(bc.getBytes(), read, len - read);
>> +            reader.setEncoding("UTF-8");
>> +            return reader.read(len);
>> +        }
>> +        /*
>> +         * This is not a real reader but just a thin wrapper around
>> +         * an input stream that allows to switch encoding during
>> +         * reading.
>> +         * An example is reading headers using ISO-8859-1 and a body
>> +         * using UTF-8.
>> +         * The class is not thread-safe and not well-performing.
>> +         */
>> +        private class CustomReader {
>> +            private InputStream is;
>> +            private String encoding;
>> +            private boolean markSupported;
>> +            private B2CConverter b2c;
>> +
>> +            public CustomReader(InputStream is, String encoding) throws 
>> IOException {
>> +                this.is = new BufferedInputStream(is);
>>                 this.encoding = encoding;
>> +                markSupported = is.markSupported();
>> +                b2c = new B2CConverter(encoding);
>> +            }
>> +
>> +            public String getEncoding() {
>> +                return encoding;
>> +            }
>> +
>> +            public void setEncoding(String encoding) throws IOException {
>> +                this.encoding = encoding;
>> +                b2c = new B2CConverter(encoding);
>>              }
>>
>> -            bc.setEnd(len);
>> +            public int read() throws IOException {
>> +                return is.read();
>> +            }
>>
>> -            B2CConverter b2c = new B2CConverter("UTF-8");
>> -            b2c.convert(bc, cc, true);
>> +            public String read(int len) throws IOException {
>> +                ByteChunk bc = new ByteChunk(125);
>> +                CharChunk cc = new CharChunk(125);
>> +                int read = 0;
>> +                while (read < len) {
>> +                    read = read + is.read(bc.getBytes(), read, len - read);
>> +                }
>> +
>> +                bc.setEnd(len);
>> +                b2c.convert(bc, cc, true);
>> +                return cc.toString();
>> +            }
>>
>> -            return cc.toString();
>> +            public String readLine() throws IOException {
>> +                ByteChunk bc = new ByteChunk(125);
>> +                CharChunk cc = new CharChunk(125);
>> +                char c;
>> +                int i = is.read();
>> +                int read = 0;
>> +                while (i != -1) {
>> +                    if (i != '\r' && i != '\n') {
>> +                        bc.append((byte)i);
>> +                        read++;
>> +                    } else if (i == '\n') {
>> +                        break;
>> +                    } else if (i == '\r') {
>> +                        if (markSupported) {
>> +                            is.mark(2);
>> +                        }
>> +                        i = read();
>> +                        if (i == -1) {
>> +                            break;
>> +                        } else {
>> +                            if (i == '\n') {
>> +                                break;
>> +                            } else {
>> +                                if (markSupported) {
>> +                                    is.reset();
>> +                                }
>> +                            }
>> +                        }
>> +                    }
>> +                    i = is.read();
>> +                }
>> +                bc.setEnd(read);
>> +                b2c.convert(bc, cc, true);
>> +                return cc.toString();
>> +            }
>>          }
>>      }
>>  }

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to