HttpComponents HttpCore
  1. HttpComponents HttpCore
  2. HTTPCORE-270

IllegalStateException in AbstractSessionOutputBuffer

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Critical Critical
    • Resolution: Fixed
    • Affects Version/s: 4.2-alpha1
    • Fix Version/s: 4.2-alpha2
    • Component/s: HttpCore
    • Labels:
      None

      Description

      I am using httpclient-4.1.2 & httpcore-4.2-alpha1. In making an DefaultHttpClient.execute() call I get the following exception:
      java.lang.IllegalStateException: Current state = RESET, new state = FLUSHED
      at java.nio.charset.CharsetEncoder.throwIllegalStateException(CharsetEncoder.java:951)
      at java.nio.charset.CharsetEncoder.flush(CharsetEncoder.java:640)
      at org.apache.http.impl.io.AbstractSessionOutputBuffer.writeEncoded(AbstractSessionOutputBuffer.java:264)
      at org.apache.http.impl.io.AbstractSessionOutputBuffer.writeLine(AbstractSessionOutputBuffer.java:247)
      at org.apache.http.impl.conn.LoggingSessionOutputBuffer.writeLine(LoggingSessionOutputBuffer.java:99)
      at org.apache.http.impl.io.AbstractMessageWriter.write(AbstractMessageWriter.java:97)
      at org.apache.http.impl.AbstractHttpClientConnection.sendRequestHeader(AbstractHttpClientConnection.java:253)

      On line 264 of AbstractSessionOutputBuffer.java, encoder.flush() is being called. My thought (I have not completely debugged) is that in this instance, cbuf.hasRemaining() is false, and therefor the following calls are being made:

      encoder.reset()
      encoder.flush()

      This is resulting in the above exception.

      I believe the following small patch will short-circuit the code, and fix the issue.

      Thoughts?

      Index: httpcore/src/main/java/org/apache/http/impl/io/AbstractSessionOutputBuffer.java
      ===================================================================
      — httpcore/src/main/java/org/apache/http/impl/io/AbstractSessionOutputBuffer.java (revision 1160689)
      +++ httpcore/src/main/java/org/apache/http/impl/io/AbstractSessionOutputBuffer.java (working copy)
      @@ -256,6 +256,10 @@
      if (this.bbuf == null)

      { this.bbuf = ByteBuffer.allocate(1024); }

      + if(!cbuf.hasRemaining())

      { + return; + }

      +
      this.encoder.reset();
      while (cbuf.hasRemaining()) {
      CoderResult result = this.encoder.encode(cbuf, this.bbuf, true);

      1. SocketOutputBuffer.diff
        6 kB
        William R. Speirs

        Activity

        No work has yet been logged on this issue.

          People

          • Assignee:
            Unassigned
            Reporter:
            William R. Speirs
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development