mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-06 13:17:41 +00:00
Ensure I/O streams are closed when done in GuacamoleHTTPTunnelServlet.
This commit is contained in:
@@ -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) {
|
||||||
|
Reference in New Issue
Block a user