Ensure I/O streams are closed when done in GuacamoleHTTPTunnelServlet.

This commit is contained in:
Michael Jumper
2013-01-29 15:00:12 -08:00
parent fbe1339623
commit 0705f7099f

View File

@@ -279,40 +279,51 @@ public abstract class GuacamoleHTTPTunnelServlet extends HttpServlet {
response.setContentType("application/octet-stream"); response.setContentType("application/octet-stream");
response.setHeader("Cache-Control", "no-cache"); response.setHeader("Cache-Control", "no-cache");
Writer out = new BufferedWriter(new OutputStreamWriter(response.getOutputStream(), "UTF-8")); // Get writer for response
Writer out = new BufferedWriter(new OutputStreamWriter(
response.getOutputStream(), "UTF-8"));
// Detach tunnel and throw error if EOF (and we haven't sent any // Stream data to response, ensuring output stream is closed
// data yet. try {
char[] message = reader.read();
if (message == null)
throw new GuacamoleResourceNotFoundException("Tunnel reached end of stream.");
// For all messages, until another stream is ready (we send at least one message) // Detach tunnel and throw error if EOF (and we haven't sent any
do { // data yet.
char[] message = reader.read();
if (message == null)
throw new GuacamoleResourceNotFoundException("Tunnel reached end of stream.");
// Get message output bytes // For all messages, until another stream is ready (we send at least one message)
out.write(message, 0, message.length); do {
// Flush if we expect to wait // Get message output bytes
if (!reader.available()) { out.write(message, 0, message.length);
out.flush();
response.flushBuffer();
}
// No more messages another stream can take over // Flush if we expect to wait
if (tunnel.hasQueuedReaderThreads()) if (!reader.available()) {
break; out.flush();
response.flushBuffer();
}
} while (tunnel.isOpen() && (message = reader.read()) != null); // No more messages another stream can take over
if (tunnel.hasQueuedReaderThreads())
break;
// Close tunnel immediately upon EOF } while (tunnel.isOpen() && (message = reader.read()) != null);
if (message == null)
tunnel.close();
// End-of-instructions marker // Close tunnel immediately upon EOF
out.write("0.;"); if (message == null)
out.flush(); tunnel.close();
response.flushBuffer();
// End-of-instructions marker
out.write("0.;");
out.flush();
response.flushBuffer();
}
// Always close output stream
finally {
out.close();
}
} }
catch (GuacamoleException e) { catch (GuacamoleException e) {
@@ -375,15 +386,32 @@ public abstract class GuacamoleHTTPTunnelServlet extends HttpServlet {
// Send data // Send data
try { try {
// Get writer from tunnel
GuacamoleWriter writer = tunnel.acquireWriter(); GuacamoleWriter writer = tunnel.acquireWriter();
Reader input = new InputStreamReader(request.getInputStream(), "UTF-8"); // Get input reader for HTTP stream
char[] buffer = new char[8192]; Reader input = new InputStreamReader(
request.getInputStream(), "UTF-8");
int length; // Transfer data from input stream to tunnel output, ensuring
while (tunnel.isOpen() && // input is always closed
(length = input.read(buffer, 0, buffer.length)) != -1) try {
writer.write(buffer, 0, length);
// Buffer
int length;
char[] buffer = new char[8192];
// Transfer data using buffer
while (tunnel.isOpen() &&
(length = input.read(buffer, 0, buffer.length)) != -1)
writer.write(buffer, 0, length);
}
// Close input stream in all cases
finally {
input.close();
}
} }
catch (IOException e) { catch (IOException e) {