IllegalStateException in AbstractSessionOutputBuffer
----------------------------------------------------
Key: HTTPCORE-270
URL: https://issues.apache.org/jira/browse/HTTPCORE-270
Project: HttpComponents HttpCore
Issue Type: Bug
Components: HttpCore
Affects Versions: 4.2-alpha1
Reporter: William R. Speirs
Priority: Critical
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);
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]