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,7 +279,12 @@ 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"));
// Stream data to response, ensuring output stream is closed
try {
// Detach tunnel and throw error if EOF (and we haven't sent any // Detach tunnel and throw error if EOF (and we haven't sent any
// data yet. // data yet.
@@ -313,6 +318,12 @@ public abstract class GuacamoleHTTPTunnelServlet extends HttpServlet {
out.write("0.;"); out.write("0.;");
out.flush(); out.flush();
response.flushBuffer(); response.flushBuffer();
}
// Always close output stream
finally {
out.close();
}
} }
catch (GuacamoleException e) { catch (GuacamoleException e) {
@@ -375,16 +386,33 @@ 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
Reader input = new InputStreamReader(
request.getInputStream(), "UTF-8");
// Transfer data from input stream to tunnel output, ensuring
// input is always closed
try {
// Buffer
int length;
char[] buffer = new char[8192]; char[] buffer = new char[8192];
int length; // Transfer data using buffer
while (tunnel.isOpen() && while (tunnel.isOpen() &&
(length = input.read(buffer, 0, buffer.length)) != -1) (length = input.read(buffer, 0, buffer.length)) != -1)
writer.write(buffer, 0, length); writer.write(buffer, 0, length);
}
// Close input stream in all cases
finally {
input.close();
}
} }
catch (IOException e) { catch (IOException e) {