Author: remm
Date: Mon Nov 2 16:46:59 2015
New Revision: 1712081
URL: http://svn.apache.org/viewvc?rev=1712081&view=rev
Log:
- 57799: Some blocking IO code uses InputStream.available() (a useless call
that has always been in the java.io API). Following the introduction of non
blocking, available() now causes real IO to occur. While this should be mostly
harmless for APR and NIO (which can "read" 0 bytes), it would leave an async
read pending with NIO2. The read IO operation will now not occur unless a read
listener has been set (in which case available() is mostly equivalent to the
newer isReady() method).
- Also add a missing i18n.
- Adapt patch from trunk to the 8 connectors.
Modified:
tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java
tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/LocalStrings.properties
tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java
tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractInputBuffer.java
tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/InternalInputBuffer.java
tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml
Modified:
tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java
URL:
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java?rev=1712081&r1=1712080&r2=1712081&view=diff
==============================================================================
--- tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java
(original)
+++ tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java
Mon Nov 2 16:46:59 2015
@@ -241,7 +241,7 @@ public class InputBuffer extends Reader
available = cb.getLength();
}
if (available == 0) {
- coyoteRequest.action(ActionCode.AVAILABLE, null);
+ coyoteRequest.action(ActionCode.AVAILABLE,
Boolean.valueOf(coyoteRequest.getReadListener() != null));
available = (coyoteRequest.getAvailable() > 0) ? 1 : 0;
}
return available;
@@ -286,7 +286,7 @@ public class InputBuffer extends Reader
public boolean isReady() {
if (coyoteRequest.getReadListener() == null) {
- throw new IllegalStateException("not in non blocking mode.");
+ throw new
IllegalStateException(sm.getString("inputBuffer.requiresNonBlocking"));
}
// Need to check is finished before we check available() as BIO always
// returns 1 for isAvailable()
Modified:
tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/LocalStrings.properties
URL:
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/LocalStrings.properties?rev=1712081&r1=1712080&r2=1712081&view=diff
==============================================================================
---
tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/LocalStrings.properties
(original)
+++
tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/LocalStrings.properties
Mon Nov 2 16:46:59 2015
@@ -68,6 +68,7 @@ coyoteResponse.sendRedirect.note=<html><
coyoteResponse.setBufferSize.ise=Cannot change buffer size after data has been
written
inputBuffer.streamClosed=Stream closed
+inputBuffer.requiresNonBlocking=Not available in non blocking mode
outputBuffer.writeNull=The String argument to write(String,int,int) may not be
null
Modified:
tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java
URL:
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java?rev=1712081&r1=1712080&r2=1712081&view=diff
==============================================================================
---
tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java
(original)
+++
tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java
Mon Nov 2 16:46:59 2015
@@ -873,7 +873,7 @@ public abstract class AbstractHttp11Proc
break;
}
case AVAILABLE: {
- request.setAvailable(inputBuffer.available());
+ request.setAvailable(inputBuffer.available(param == Boolean.TRUE));
break;
}
case NB_WRITE_INTEREST: {
Modified:
tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractInputBuffer.java
URL:
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractInputBuffer.java?rev=1712081&r1=1712080&r2=1712081&view=diff
==============================================================================
--- tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractInputBuffer.java
(original)
+++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractInputBuffer.java
Mon Nov 2 16:46:59 2015
@@ -326,14 +326,14 @@ public abstract class AbstractInputBuffe
* Available bytes in the buffers (note that due to encoding, this may not
* correspond).
*/
- public int available() {
+ public int available(boolean read) {
int available = lastValid - pos;
if ((available == 0) && (lastActiveFilter >= 0)) {
for (int i = 0; (available == 0) && (i <= lastActiveFilter); i++) {
available = activeFilters[i].available();
}
}
- if (available > 0) {
+ if (available > 0 || !read) {
return available;
}
Modified:
tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/InternalInputBuffer.java
URL:
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/InternalInputBuffer.java?rev=1712081&r1=1712080&r2=1712081&view=diff
==============================================================================
--- tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/InternalInputBuffer.java
(original)
+++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/InternalInputBuffer.java
Mon Nov 2 16:46:59 2015
@@ -76,7 +76,7 @@ public class InternalInputBuffer extends
* tested for == 0 or > 0.
*/
@Override
- public int available() {
+ public int available(boolean read) {
return 1;
}
Modified: tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml
URL:
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml?rev=1712081&r1=1712080&r2=1712081&view=diff
==============================================================================
--- tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml Mon Nov 2 16:46:59 2015
@@ -125,6 +125,11 @@
Add a new RestCsrfPreventionFilter that provides basic CSRF protection
for REST APIs. (violetagg)
</add>
+ <fix>
+ <bug>57799</bug>: InputStream.available() was causing an IO operation
+ to occur even in blocking mode, which caused problems with NIO2.
+ (remm)
+ </fix>
</changelog>
</subsection>
<subsection name="Coyote">
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]