1 package net.sourceforge.guacamole.net.tunnel;
4 * Guacamole - Clientless Remote Desktop
5 * Copyright (C) 2010 Michael Jumper
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Affero General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Affero General Public License for more details.
17 * You should have received a copy of the GNU Affero General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 import java.io.Writer;
22 import java.io.IOException;
23 import java.io.UnsupportedEncodingException;
24 import java.util.concurrent.locks.ReentrantLock;
25 import javax.servlet.http.HttpServletRequest;
26 import javax.servlet.http.HttpServletResponse;
27 import net.sourceforge.guacamole.Client;
28 import net.sourceforge.guacamole.net.GuacamoleServlet;
29 import net.sourceforge.guacamole.GuacamoleException;
30 import net.sourceforge.guacamole.net.GuacamoleSession;
33 public class Outbound extends GuacamoleServlet {
36 protected void handleRequest(GuacamoleSession session, HttpServletRequest request, HttpServletResponse response) throws GuacamoleException {
38 session.getClient().waitForAuthorization();
40 ReentrantLock instructionStreamLock = session.getInstructionStreamLock();
41 instructionStreamLock.lock();
45 response.setContentType("text/plain");
46 Writer out = response.getWriter();
50 // Query new update from server
51 Client client = session.getClient();
53 // For all messages, until another stream is ready (we send at least one message)
55 while ((message = client.read()) != null) {
57 // Get message output bytes
58 out.write(message, 0, message.length);
60 response.flushBuffer();
62 // No more messages another stream can take over
63 if (instructionStreamLock.hasQueuedThreads())
68 if (message == null) {
70 throw new GuacamoleException("Disconnected.");
74 catch (GuacamoleException e) {
75 out.write("error:" + e.getMessage() + ";");
77 response.flushBuffer();
80 // End-of-instructions marker
83 response.flushBuffer();
86 catch (UnsupportedEncodingException e) {
87 throw new GuacamoleException("UTF-8 not supported by Java.", e);
89 catch (IOException e) {
90 throw new GuacamoleException("I/O error writing to servlet output stream.", e);
93 instructionStreamLock.unlock();