Author: markt
Date: Thu Oct  1 14:32:56 2015
New Revision: 1706264

URL: http://svn.apache.org/viewvc?rev=1706264&view=rev
Log:
Complete some error handling TODOs

Modified:
    tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java
    tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties
    tomcat/trunk/java/org/apache/coyote/http2/Stream.java
    tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java

Modified: tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java?rev=1706264&r1=1706263&r2=1706264&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java 
(original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java Thu Oct  
1 14:32:56 2015
@@ -402,7 +402,7 @@ public class Http2UpgradeHandler extends
     }
 
 
-    private void closeStream(StreamException se) throws ConnectionException, 
IOException {
+    void closeStream(StreamException se) throws ConnectionException, 
IOException {
 
         if (log.isDebugEnabled()) {
             log.debug(sm.getString("upgradeHandler.rst.debug", connectionId,
@@ -433,7 +433,7 @@ public class Http2UpgradeHandler extends
     }
 
 
-    private void closeConnection(Http2Exception ce) {
+    void closeConnection(Http2Exception ce) {
         // Write a GOAWAY frame.
         byte[] fixedPayload = new byte[8];
         ByteUtil.set31Bits(fixedPayload, 0, maxProcessedStreamId);

Modified: tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties?rev=1706264&r1=1706263&r2=1706264&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties Thu Oct  
1 14:32:56 2015
@@ -72,6 +72,8 @@ stream.write=Connection [{0}], Stream [{
 
 stream.outputBuffer.flush.debug=Connection [{0}], Stream [{1}], flushing 
output with buffer at position [{2}], writeInProgress [{3}] and closed [{4}]
 
+streamProcessor.error.connection=Connection [{0}], Stream [{1}], An error 
occurred during processing that was fatal to the connection
+streamProcessor.error.stream=Connection [{0}], Stream [{1}], An error occurred 
during processing that was fatal to the stream
 streamProcessor.httpupgrade.notsupported=HTTP upgrade is not supported within 
HTTP/2 streams
 streamProcessor.process.loopend=Connection [{0}], Stream [{1}], loop end, 
state [{2}], dispatches [{3}]
 streamProcessor.process.loopstart=Connection [{0}], Stream [{1}], loop start, 
status [{2}], dispatches [{3}]

Modified: tomcat/trunk/java/org/apache/coyote/http2/Stream.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Stream.java?rev=1706264&r1=1706263&r2=1706264&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Stream.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Stream.java Thu Oct  1 14:32:56 
2015
@@ -338,6 +338,25 @@ public class Stream extends AbstractStre
         return !state.isFrameTypePermitted(FrameType.DATA);
     }
 
+
+    void close(Http2Exception http2Exception) {
+        if (http2Exception instanceof StreamException) {
+            try {
+                handler.closeStream((StreamException) http2Exception);
+            } catch (ConnectionException ce) {
+                handler.closeConnection(ce);
+            } catch (IOException ioe) {
+                // TODO i18n
+                ConnectionException ce = new ConnectionException("", 
Http2Error.PROTOCOL_ERROR);
+                ce.initCause(ioe);
+                handler.closeConnection(ce);
+            }
+        } else {
+            handler.closeConnection(http2Exception);
+        }
+    }
+
+
     class StreamOutputBuffer implements OutputBuffer {
 
         private final ByteBuffer buffer = ByteBuffer.allocate(8 * 1024);

Modified: tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java?rev=1706264&r1=1706263&r2=1706264&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java Thu Oct  1 
14:32:56 2015
@@ -74,15 +74,19 @@ public class StreamProcessor extends Abs
                     log.debug(sm.getString("streamProcessor.process.loopstart",
                             stream.getConnectionId(), stream.getIdentifier(), 
status, dispatches));
                 }
-                // TODO CLOSE_NOW ?
-                if (dispatches != null) {
+                if (status == SocketStatus.CLOSE_NOW) {
+                    setErrorState(ErrorState.CLOSE_NOW, null);
+                    state = SocketState.CLOSED;
+                } else if (dispatches != null) {
                     DispatchType nextDispatch = dispatches.next();
                     state = dispatch(nextDispatch.getSocketStatus());
-                // TODO DISCONNECT ?
                 } else if (isAsync()) {
                     state = dispatch(status);
                 } else if (state == SocketState.ASYNC_END) {
                     state = dispatch(status);
+                } else if (status == SocketStatus.DISCONNECT) {
+                    // Should never happen
+                    throw new IllegalStateException();
                 } else {
                     state = process((SocketWrapperBase<?>) null);
                 }
@@ -104,11 +108,25 @@ public class StreamProcessor extends Abs
                     dispatches != null && state != SocketState.CLOSED);
 
             if (state == SocketState.CLOSED) {
-                // TODO
+                if (!getErrorState().isConnectionIoAllowed()) {
+                    ConnectionException ce = new 
ConnectionException(sm.getString(
+                            "streamProcessor.error.connection", 
stream.getConnectionId(),
+                            stream.getIdentifier()), 
Http2Error.INTERNAL_ERROR);
+                    stream.close(ce);
+                } else if (!getErrorState().isIoAllowed()) {
+                    StreamException se = new StreamException(sm.getString(
+                            "streamProcessor.error.stream", 
stream.getConnectionId(),
+                            stream.getIdentifier()), Http2Error.INTERNAL_ERROR,
+                            stream.getIdentifier().intValue());
+                    stream.close(se);
+                }
             }
         } catch (Exception e) {
-            // TODO
-            e.printStackTrace();
+            ConnectionException ce = new ConnectionException(sm.getString(
+                    "streamProcessor.error.connection", 
stream.getConnectionId(),
+                    stream.getIdentifier()), Http2Error.INTERNAL_ERROR);
+            ce.initCause(e);
+            stream.close(ce);
         } finally {
             ContainerThreadMarker.clear();
         }
@@ -125,7 +143,7 @@ public class StreamProcessor extends Abs
                     response.setCommitted(true);
                     stream.writeHeaders();
                 } catch (IOException ioe) {
-                    // TODO: Handle this
+                    setErrorState(ErrorState.CLOSE_CONNECTION_NOW, ioe);
                 }
             }
             break;
@@ -135,7 +153,7 @@ public class StreamProcessor extends Abs
             try {
                 stream.getOutputBuffer().close();
             } catch (IOException ioe) {
-                // TODO
+                setErrorState(ErrorState.CLOSE_CONNECTION_NOW, ioe);
             }
             break;
         }
@@ -144,7 +162,7 @@ public class StreamProcessor extends Abs
                 try {
                     stream.writeAck();
                 } catch (IOException ioe) {
-                    // TODO
+                    setErrorState(ErrorState.CLOSE_CONNECTION_NOW, ioe);
                 }
             }
             break;
@@ -155,7 +173,7 @@ public class StreamProcessor extends Abs
                 stream.flushData();
             } catch (IOException ioe) {
                 response.setErrorException(ioe);
-                // TODO: Shut stream down?
+                setErrorState(ErrorState.CLOSE_CONNECTION_NOW, ioe);
             }
             break;
         }



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

Reply via email to