Committed On Thu, 2003-02-20 at 17:32, Jeffrey Dever wrote: > Oleg, this fix will need to go in before we drop alpha3. > > Sam Maloney wrote: > > >On Wednesday 19 February 2003 17:39, Oleg Kalnichevski wrote: > > > > > >>Hi Sam > >> > >>I believe the bug has been fixed by now. I stumbled upon it a few days > >>ago pretty much by chance > >> > >>http://www.mail-archive.com/commons-httpclient-dev%40jakarta.apache.org/msg > >>00536.html > >> > >> > >> > >This fix does not fix the same problem. The fix linked to above will prevent > >(byte)-1 from being appended to the buffer (a different bug), but that is not > >the problem I/bug 16458 was having. > > > >I updated to CVS again, and there were some changes in this area (now readLine > >calls HttpParser.readLine which calls HttpParser.readRawLine). However, after > >testing again, I confirmed that the problem still exists unaffected. > > > >Here is the problem: > > > > at > >org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:46) > > at > >org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:81) > > at > >org.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:878) > > at > >>org.apache.commons.httpclient.HttpConnectionAdapter.readLine(MultiThreadedHttpConnectionManager_fixed.java:730) > > at > >>org.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1917) > > > >You can see that readStatusLine looks like this: > > > ><SNIP> > > //read out the HTTP status string > > String statusString = conn.readLine(); > > while ((statusString != null) && !statusString.startsWith("HTTP/")) { > > statusString = conn.readLine(); > > } > > if (statusString == null) { > > // A null statusString means the connection was lost before we got a > > // response. Try again. > > throw new HttpRecoverableException("Error in parsing the status " > > + " line from the response: unable to find line starting with" > > + " \"HTTP/\""); > > } > ></SNIP> > > > >You can see from the above code, that until conn.readLine() returns null or a > >string starting with "HTTP/", this piece of code will keep looping > >indefinatly (what is taking 100% CPU). Right now, readLine never will return > >null, only empty strings. > > > >I'm guessing readLine must have returned null at one point, as every place > >that calls it expects null to be returned on closed connection. > > > >The way readLine must work for the calling code to work is: > > > >1) Read data upto \r\n, return line. (currently happens) > >2) if EOF before finding \r\n, but we have data in our buffer, return the > >buffer. (also happens) > > > >3) if EOF before finding any data (buf.size()==0), then return null to signal > >that no more data is possible, and caller should NOT call again. (this is > >what patch adds) > > > >If we return empty string like is happening currently, then the caller will > >not know NOT to call again. In this bugs case, the caller keeps reading lines > >until it finds 'HTTP/'. Since the empty string doesn't match that, the caller > >will keep trying to get the next line, and they will just keep getting "". > > > >Here is my patch again, updated to apply to HttpParser (where the readLine > >code has been moved to since my last patch). I have retested the new patch > >and it is working in all my test cases, including the one to reproduce the > >bug. > > > >Index: HttpParser.java > >=================================================================== > >RCS file: > >>/home/cvspublic/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpParser.java,v > >retrieving revision 1.1 > >diff -u -r1.1 HttpParser.java > >--- HttpParser.java 16 Feb 2003 13:10:16 -0000 1.1 > >+++ HttpParser.java 20 Feb 2003 15:51:51 -0000 > >@@ -58,6 +58,10 @@ > > } > > } > > } > >+ if (buf.size() <= 0) { > >+ // Then we just started reading, but the stream is EOF (closed). > >+ return null; // Let caller know we got EOF BEFORE any data. > >+ } > > if (WIRE_LOG.isDebugEnabled()) { > > WIRE_LOG.debug("<< \"" + buf.toString() + (ch>0 ? "\" [\\r\\n]" : > >"")); > > } > >@@ -79,6 +83,12 @@ > > public static String readLine(InputStream inputStream) throws IOException > >{ > > LOG.trace("enter HttpConnection.readLine()"); > > byte[] rawdata = readRawLine(inputStream); > >+ > >+ if (rawdata == null) { > >+ // Then there was EOF before any data was read, we must let > >caller know. > >+ return null; > >+ } > >+ > > int len = rawdata.length; > > if (( len >= 2) && (rawdata[len - 2] == '\r') && (rawdata[len - 1] == > >'\n')) { > > return HttpConstants.getString(rawdata, 0, rawdata.length - 2); > > > >Cheers, > >Sam Maloney > > > > > > > >>I was not aware that it might have fixed bug# 16458. Could you please > >>take the newest CVS snapshout for a spin and let us know if the problem > >>has indeed been eliminated? > >> > >>Other patches would be highly welcome > >> > >>Cheers > >> > >>Oleg > >> > >>On Wed, 2003-02-19 at 23:23, Sam Maloney wrote: > >> > >> > >>>Hi there, > >>> > >>>As I am a new poster here, I will first describe myself and the > >>>situation. If you wish to skip this, skip down to after the line '-----'. > >>> > >>>In a very large project I am a senior on, I use to be using HTTPClient > >>>v0.3-3 (www.innovation.ch/java/HTTPClient/). > >>> > >>>At the time I chose it, it was the superior client. However, because of > >>>the facts: > >>> > >>>a) It does not work properly with sending the request as a stream without > >>>knowing the content length until stream.close(). (It claimed to work okay > >>>with this). > >>> > >>>b) After looking at the code to try to fix the problem, not only did I > >>>give up trying to fix the problem, but I also gave up on the product :) > >>> > >>>So anyways, hearing 2.0alpha of HttpClient was out, and supported both > >>>SSL (needed) and Streams (very good), I decided to try it out. > >>> > >>>I want to point out that I encountered bug 13463 early on, and after > >>>reading the bugzilla db, I tried the patch attached to the end of it. I > >>>would just like to give my vote to include it into CVS, as it fixes the > >>>problem (bug 13463) perfectly. > >>> > >>>----- > >>> > >>>As for bug 16458, I have fixed it. > >>> > >>>It was a rather simple bug, and can be reproduced by closing the server > >>>side socket while the client is still waiting for a response. This will > >>>cause the client to take 100% cpu, and it will do so for ever and ever. > >>> > >>>The fix is as follows (I have tested extensively any fixes I will post): > >>> > >>>Index: HttpConnection.java > >>>=================================================================== > >>>RCS file: > >>>/home/cvspublic/jakarta-commons/httpclient/src/java/org/apache/commons/ht > >>>tpclient/HttpConnection.java,v retrieving revision 1.44 > >>>diff -u -r1.44 HttpConnection.java > >>>--- HttpConnection.java 13 Feb 2003 21:31:53 -0000 1.44 > >>>+++ HttpConnection.java 19 Feb 2003 21:27:26 -0000 > >>>@@ -128,6 +128,10 @@ > >>> > >>> StringBuffer buf = new StringBuffer(); > >>> int ch = inputStream.read(); > >>>+ if(ch == -1){ > >>>+ // End Of File! > >>>+ return null; // Let caller know! > >>>+ } > >>> while (ch >= 0) { > >>> if (ch == '\r') { > >>> ch = inputStream.read(); > >>> > >>>I have another bugfix that I will post in my next message. > >>> > >>>Thanks, > >>>Sam Maloney <[EMAIL PROTECTED]> > >>> > >>>--------------------------------------------------------------------- > >>>To unsubscribe, e-mail: > >>>[EMAIL PROTECTED] For additional > >>>commands, e-mail: [EMAIL PROTECTED] > >>> > >>> > >>--------------------------------------------------------------------- > >>To unsubscribe, e-mail: > >>[EMAIL PROTECTED] For additional > >>commands, e-mail: [EMAIL PROTECTED] > >> > >> > > > > > >--------------------------------------------------------------------- > >To unsubscribe, e-mail: [EMAIL PROTECTED] > >For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] >
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]