Fixed incorrect exception handling

This commit is contained in:
Trustin Lee 2009-04-21 10:48:46 +00:00
parent d2b6078eaa
commit 212be9327d
2 changed files with 28 additions and 24 deletions

View File

@ -55,7 +55,7 @@ class HttpTunnelingChannelHandler extends SimpleChannelUpstreamHandler {
private static final InternalLogger logger = InternalLoggerFactory.getInstance(HttpTunnelingChannelHandler.class); private static final InternalLogger logger = InternalLoggerFactory.getInstance(HttpTunnelingChannelHandler.class);
List<MessageEvent> awaitingEvents = new ArrayList<MessageEvent>(); private final List<MessageEvent> awaitingEvents = new ArrayList<MessageEvent>();
private final Lock reconnectLock = new ReentrantLock(); private final Lock reconnectLock = new ReentrantLock();
@ -86,7 +86,7 @@ class HttpTunnelingChannelHandler extends SimpleChannelUpstreamHandler {
ChannelBuffer buffer = (ChannelBuffer) e.getMessage(); ChannelBuffer buffer = (ChannelBuffer) e.getMessage();
if (stream) { if (stream) {
boolean success = false; boolean success = false;
Throwable cause = null; Exception cause = null;
byte[] b = null; byte[] b = null;
reconnectLock.lock(); reconnectLock.lock();
try { try {
@ -99,17 +99,17 @@ class HttpTunnelingChannelHandler extends SimpleChannelUpstreamHandler {
outputStream.write(b); outputStream.write(b);
outputStream.flush(); outputStream.flush();
success = true; success = true;
} catch (Throwable t) { } catch (Exception ex) {
success = false; success = false;
cause = t; cause = ex;
if (awaitReconnect()) { if (awaitReconnect()) {
try { try {
outputStream.write(b); outputStream.write(b);
outputStream.flush(); outputStream.flush();
success = true; success = true;
} catch (Throwable t2) { } catch (Exception ex2) {
success = false; success = false;
cause = t2; cause = ex2;
} }
} else { } else {
if (invalidated.compareAndSet(false, true)) { if (invalidated.compareAndSet(false, true)) {
@ -119,11 +119,8 @@ class HttpTunnelingChannelHandler extends SimpleChannelUpstreamHandler {
} }
} finally { } finally {
reconnectLock.unlock(); reconnectLock.unlock();
if (success) { if (!success) {
e.getFuture().setSuccess(); throw cause;
} else {
assert cause != null;
e.getFuture().setFailure(cause);
} }
} }
} else { } else {
@ -155,7 +152,7 @@ class HttpTunnelingChannelHandler extends SimpleChannelUpstreamHandler {
return list; return list;
} }
void setOutputStream(ServletOutputStream outputStream) { void setOutputStream(ServletOutputStream outputStream) throws IOException {
reconnectLock.lock(); reconnectLock.lock();
try { try {
this.outputStream = outputStream; this.outputStream = outputStream;
@ -164,14 +161,8 @@ class HttpTunnelingChannelHandler extends SimpleChannelUpstreamHandler {
ChannelBuffer buffer = (ChannelBuffer) awaitingEvent.getMessage(); ChannelBuffer buffer = (ChannelBuffer) awaitingEvent.getMessage();
byte[] b = new byte[buffer.readableBytes()]; byte[] b = new byte[buffer.readableBytes()];
buffer.readBytes(b); buffer.readBytes(b);
try { outputStream.write(b);
outputStream.write(b); outputStream.flush();
outputStream.flush();
awaitingEvent.getFuture().setSuccess();
}
catch (IOException e) {
awaitingEvent.getFuture().setFailure(e);
}
} }
reconnectCondition.signalAll(); reconnectCondition.signalAll();
} }

View File

@ -58,10 +58,23 @@ public class HttpTunnelingServlet extends HttpServlet {
Channel channel = (Channel) session.getAttribute(CHANNEL_PROP); Channel channel = (Channel) session.getAttribute(CHANNEL_PROP);
HttpTunnelingChannelHandler handler = HttpTunnelingChannelHandler handler =
(HttpTunnelingChannelHandler) session.getAttribute(HANDLER_PROP); (HttpTunnelingChannelHandler) session.getAttribute(HANDLER_PROP);
if (handler.isStreaming()) { try {
streamResponse(request, response, session, handler, channel); if (handler.isStreaming()) {
} else { streamResponse(request, response, session, handler, channel);
pollResponse(channel, request, response, session, handler); } else {
pollResponse(channel, request, response, session, handler);
}
} finally {
try {
request.getInputStream().close();
} catch (IOException e) {
// Ignore.
}
try {
response.getOutputStream().close();
} catch (IOException e) {
// Ignore.
}
} }
} }