You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ah...@apache.org on 2012/09/10 22:55:52 UTC
[35/50] [abbrv] CLOUDSTACK-61 Console proxy has plenty of files with
CRLF line ending.
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0bf8c5a1/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java
----------------------------------------------------------------------
diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java
index d91a198..6cadeca 100644
--- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java
+++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java
@@ -14,8 +14,8 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package com.cloud.consoleproxy;
-
+package com.cloud.consoleproxy;
+
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
@@ -30,377 +30,377 @@ import com.cloud.consoleproxy.util.Logger;
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
-
-public class ConsoleProxyAjaxHandler implements HttpHandler {
- private static final Logger s_logger = Logger.getLogger(ConsoleProxyAjaxHandler.class);
-
- public ConsoleProxyAjaxHandler() {
- }
-
- public void handle(HttpExchange t) throws IOException {
- try {
- if(s_logger.isTraceEnabled())
- s_logger.trace("AjaxHandler " + t.getRequestURI());
-
- long startTick = System.currentTimeMillis();
-
- doHandle(t);
-
- if(s_logger.isTraceEnabled())
- s_logger.trace(t.getRequestURI() + " process time " + (System.currentTimeMillis() - startTick) + " ms");
- } catch (IOException e) {
- throw e;
- } catch (IllegalArgumentException e) {
- s_logger.warn("Exception, ", e);
- t.sendResponseHeaders(400, -1); // bad request
- } catch(Throwable e) {
- s_logger.error("Unexpected exception, ", e);
- t.sendResponseHeaders(500, -1); // server error
- } finally {
- t.close();
- }
- }
-
- private void doHandle(HttpExchange t) throws Exception, IllegalArgumentException {
- String queries = t.getRequestURI().getQuery();
- if(s_logger.isTraceEnabled())
- s_logger.trace("Handle AJAX request: " + queries);
-
- Map<String, String> queryMap = ConsoleProxyHttpHandlerHelper.getQueryMap(queries);
-
- String host = queryMap.get("host");
- String portStr = queryMap.get("port");
- String sid = queryMap.get("sid");
- String tag = queryMap.get("tag");
- String ticket = queryMap.get("ticket");
- String ajaxSessionIdStr = queryMap.get("sess");
- String eventStr = queryMap.get("event");
- String console_url = queryMap.get("consoleurl");
- String console_host_session = queryMap.get("sessionref");
-
- if(tag == null)
- tag = "";
-
- long ajaxSessionId = 0;
- int event = 0;
-
- int port;
-
- if(host == null || portStr == null || sid == null)
- throw new IllegalArgumentException();
-
- try {
- port = Integer.parseInt(portStr);
- } catch (NumberFormatException e) {
- s_logger.warn("Invalid number parameter in query string: " + portStr);
- throw new IllegalArgumentException(e);
- }
-
- if(ajaxSessionIdStr != null) {
- try {
- ajaxSessionId = Long.parseLong(ajaxSessionIdStr);
- } catch (NumberFormatException e) {
- s_logger.warn("Invalid number parameter in query string: " + ajaxSessionIdStr);
- throw new IllegalArgumentException(e);
- }
- }
-
- if(eventStr != null) {
- try {
- event = Integer.parseInt(eventStr);
- } catch (NumberFormatException e) {
- s_logger.warn("Invalid number parameter in query string: " + eventStr);
- throw new IllegalArgumentException(e);
- }
- }
-
- ConsoleProxyClient viewer = null;
- try {
- ConsoleProxyClientParam param = new ConsoleProxyClientParam();
- param.setClientHostAddress(host);
- param.setClientHostPort(port);
- param.setClientHostPassword(sid);
- param.setClientTag(tag);
- param.setTicket(ticket);
- param.setClientTunnelUrl(console_url);
- param.setClientTunnelSession(console_host_session);
-
- viewer = ConsoleProxy.getAjaxVncViewer(param, ajaxSessionIdStr);
- } catch(Exception e) {
-
- s_logger.warn("Failed to create viewer due to " + e.getMessage(), e);
-
- String[] content = new String[] {
- "<html><head></head><body>",
- "<div id=\"main_panel\" tabindex=\"1\">",
- "<p>Access is denied for the console session. Please close the window and retry again</p>",
- "</div></body></html>"
- };
-
- StringBuffer sb = new StringBuffer();
- for(int i = 0; i < content.length; i++)
- sb.append(content[i]);
-
- sendResponse(t, "text/html", sb.toString());
- return;
- }
-
- if(event != 0) {
- if(ajaxSessionId != 0 && ajaxSessionId == viewer.getAjaxSessionId()) {
- if(event == 7) {
- // client send over an event bag
- InputStream is = t.getRequestBody();
- handleClientEventBag(viewer, convertStreamToString(is, true));
- } else {
- handleClientEvent(viewer, event, queryMap);
- }
- sendResponse(t, "text/html", "OK");
- } else {
- if(s_logger.isDebugEnabled())
- s_logger.debug("Ajax request comes from a different session, id in request: " + ajaxSessionId + ", id in viewer: " + viewer.getAjaxSessionId());
-
- sendResponse(t, "text/html", "Invalid ajax client session id");
- }
- } else {
- if(ajaxSessionId != 0 && ajaxSessionId != viewer.getAjaxSessionId()) {
- s_logger.info("Ajax request comes from a different session, id in request: " + ajaxSessionId + ", id in viewer: " + viewer.getAjaxSessionId());
- handleClientKickoff(t, viewer);
- } else if(ajaxSessionId == 0) {
- if(s_logger.isDebugEnabled())
- s_logger.debug("Ajax request indicates a fresh client start");
-
- String title = queryMap.get("t");
- String guest = queryMap.get("guest");
- handleClientStart(t, viewer, title != null ? title : "", guest);
- } else {
-
- if(s_logger.isTraceEnabled())
- s_logger.trace("Ajax request indicates client update");
-
- handleClientUpdate(t, viewer);
- }
- }
- }
-
- private static String convertStreamToString(InputStream is, boolean closeStreamAfterRead) {
- BufferedReader reader = new BufferedReader(new InputStreamReader(is));
- StringBuilder sb = new StringBuilder();
- String line = null;
- try {
- while ((line = reader.readLine()) != null) {
- sb.append(line + "\n");
- }
- } catch (IOException e) {
- s_logger.warn("Exception while reading request body: ", e);
- } finally {
- if(closeStreamAfterRead) {
- try {
- is.close();
- } catch (IOException e) {
- }
- }
- }
- return sb.toString();
- }
-
- private void sendResponse(HttpExchange t, String contentType, String response) throws IOException {
- Headers hds = t.getResponseHeaders();
- hds.set("Content-Type", contentType);
-
- t.sendResponseHeaders(200, response.length());
- OutputStream os = t.getResponseBody();
- try {
- os.write(response.getBytes());
- } finally {
- os.close();
- }
- }
-
- @SuppressWarnings("deprecation")
- private void handleClientEventBag(ConsoleProxyClient viewer, String requestData) {
- if(s_logger.isTraceEnabled())
- s_logger.trace("Handle event bag, event bag: " + requestData);
-
- int start = requestData.indexOf("=");
- if(start < 0)
- start = 0;
- else if(start > 0)
- start++;
- String data = URLDecoder.decode(requestData.substring(start));
- String[] tokens = data.split("\\|");
- if(tokens != null && tokens.length > 0) {
- int count = 0;
- try {
- count = Integer.parseInt(tokens[0]);
- int parsePos = 1;
- int type, event, x, y, code, modifiers;
- for(int i = 0; i < count; i++) {
- type = Integer.parseInt(tokens[parsePos++]);
- if(type == 1) {
- // mouse event
- event = Integer.parseInt(tokens[parsePos++]);
- x = Integer.parseInt(tokens[parsePos++]);
- y = Integer.parseInt(tokens[parsePos++]);
- code = Integer.parseInt(tokens[parsePos++]);
- modifiers = Integer.parseInt(tokens[parsePos++]);
-
- Map<String, String> queryMap = new HashMap<String, String>();
- queryMap.put("event", String.valueOf(event));
- queryMap.put("x", String.valueOf(x));
- queryMap.put("y", String.valueOf(y));
- queryMap.put("code", String.valueOf(code));
- queryMap.put("modifier", String.valueOf(modifiers));
- handleClientEvent(viewer, event, queryMap);
- } else {
- // keyboard event
- event = Integer.parseInt(tokens[parsePos++]);
- code = Integer.parseInt(tokens[parsePos++]);
- modifiers = Integer.parseInt(tokens[parsePos++]);
-
- Map<String, String> queryMap = new HashMap<String, String>();
- queryMap.put("event", String.valueOf(event));
- queryMap.put("code", String.valueOf(code));
- queryMap.put("modifier", String.valueOf(modifiers));
- handleClientEvent(viewer, event, queryMap);
- }
- }
- } catch(NumberFormatException e) {
- s_logger.warn("Exception in handle client event bag: " + data + ", ", e);
- } catch(Exception e) {
- s_logger.warn("Exception in handle client event bag: " + data + ", ", e);
- } catch(OutOfMemoryError e) {
- s_logger.error("Unrecoverable OutOfMemory Error, exit and let it be re-launched");
- System.exit(1);
- }
- }
- }
-
- private void handleClientEvent(ConsoleProxyClient viewer, int event, Map<String, String> queryMap) {
- int code = 0;
- int x = 0, y = 0;
- int modifiers = 0;
-
- String str;
- switch(event) {
- case 1: // mouse move
- case 2: // mouse down
- case 3: // mouse up
- case 8: // mouse double click
- str = queryMap.get("x");
- if(str != null) {
- try {
- x = Integer.parseInt(str);
- } catch (NumberFormatException e) {
- s_logger.warn("Invalid number parameter in query string: " + str);
- throw new IllegalArgumentException(e);
- }
- }
- str = queryMap.get("y");
- if(str != null) {
- try {
- y = Integer.parseInt(str);
- } catch (NumberFormatException e) {
- s_logger.warn("Invalid number parameter in query string: " + str);
- throw new IllegalArgumentException(e);
- }
- }
-
- if(event != 1) {
- str = queryMap.get("code");
- try {
- code = Integer.parseInt(str);
- } catch (NumberFormatException e) {
- s_logger.warn("Invalid number parameter in query string: " + str);
- throw new IllegalArgumentException(e);
- }
-
- str = queryMap.get("modifier");
- try {
- modifiers = Integer.parseInt(str);
- } catch (NumberFormatException e) {
- s_logger.warn("Invalid number parameter in query string: " + str);
- throw new IllegalArgumentException(e);
- }
-
- if(s_logger.isTraceEnabled())
- s_logger.trace("Handle client mouse event. event: " + event + ", x: " + x + ", y: " + y + ", button: " + code + ", modifier: " + modifiers);
- } else {
- if(s_logger.isTraceEnabled())
- s_logger.trace("Handle client mouse move event. x: " + x + ", y: " + y);
- }
- viewer.sendClientMouseEvent(InputEventType.fromEventCode(event), x, y, code, modifiers);
- break;
-
- case 4: // key press
- case 5: // key down
- case 6: // key up
- str = queryMap.get("code");
- try {
- code = Integer.parseInt(str);
- } catch (NumberFormatException e) {
- s_logger.warn("Invalid number parameter in query string: " + str);
- throw new IllegalArgumentException(e);
- }
-
- str = queryMap.get("modifier");
- try {
- modifiers = Integer.parseInt(str);
- } catch (NumberFormatException e) {
- s_logger.warn("Invalid number parameter in query string: " + str);
- throw new IllegalArgumentException(e);
- }
-
- if(s_logger.isDebugEnabled())
- s_logger.debug("Handle client keyboard event. event: " + event + ", code: " + code + ", modifier: " + modifiers);
- viewer.sendClientRawKeyboardEvent(InputEventType.fromEventCode(event), code, modifiers);
- break;
-
- default :
- break;
- }
- }
-
- private void handleClientKickoff(HttpExchange t, ConsoleProxyClient viewer) throws IOException {
- String response = viewer.onAjaxClientKickoff();
- t.sendResponseHeaders(200, response.length());
- OutputStream os = t.getResponseBody();
- try {
- os.write(response.getBytes());
- } finally {
- os.close();
- }
- }
-
- private void handleClientStart(HttpExchange t, ConsoleProxyClient viewer, String title, String guest) throws IOException {
- List<String> languages = t.getRequestHeaders().get("Accept-Language");
- String response = viewer.onAjaxClientStart(title, languages, guest);
-
- Headers hds = t.getResponseHeaders();
- hds.set("Content-Type", "text/html");
- hds.set("Cache-Control", "no-cache");
- hds.set("Cache-Control", "no-store");
- t.sendResponseHeaders(200, response.length());
-
- OutputStream os = t.getResponseBody();
- try {
- os.write(response.getBytes());
- } finally {
- os.close();
- }
- }
-
- private void handleClientUpdate(HttpExchange t, ConsoleProxyClient viewer) throws IOException {
- String response = viewer.onAjaxClientUpdate();
-
- Headers hds = t.getResponseHeaders();
- hds.set("Content-Type", "text/javascript");
- t.sendResponseHeaders(200, response.length());
-
- OutputStream os = t.getResponseBody();
- try {
- os.write(response.getBytes());
- } finally {
- os.close();
- }
- }
-}
+
+public class ConsoleProxyAjaxHandler implements HttpHandler {
+ private static final Logger s_logger = Logger.getLogger(ConsoleProxyAjaxHandler.class);
+
+ public ConsoleProxyAjaxHandler() {
+ }
+
+ public void handle(HttpExchange t) throws IOException {
+ try {
+ if(s_logger.isTraceEnabled())
+ s_logger.trace("AjaxHandler " + t.getRequestURI());
+
+ long startTick = System.currentTimeMillis();
+
+ doHandle(t);
+
+ if(s_logger.isTraceEnabled())
+ s_logger.trace(t.getRequestURI() + " process time " + (System.currentTimeMillis() - startTick) + " ms");
+ } catch (IOException e) {
+ throw e;
+ } catch (IllegalArgumentException e) {
+ s_logger.warn("Exception, ", e);
+ t.sendResponseHeaders(400, -1); // bad request
+ } catch(Throwable e) {
+ s_logger.error("Unexpected exception, ", e);
+ t.sendResponseHeaders(500, -1); // server error
+ } finally {
+ t.close();
+ }
+ }
+
+ private void doHandle(HttpExchange t) throws Exception, IllegalArgumentException {
+ String queries = t.getRequestURI().getQuery();
+ if(s_logger.isTraceEnabled())
+ s_logger.trace("Handle AJAX request: " + queries);
+
+ Map<String, String> queryMap = ConsoleProxyHttpHandlerHelper.getQueryMap(queries);
+
+ String host = queryMap.get("host");
+ String portStr = queryMap.get("port");
+ String sid = queryMap.get("sid");
+ String tag = queryMap.get("tag");
+ String ticket = queryMap.get("ticket");
+ String ajaxSessionIdStr = queryMap.get("sess");
+ String eventStr = queryMap.get("event");
+ String console_url = queryMap.get("consoleurl");
+ String console_host_session = queryMap.get("sessionref");
+
+ if(tag == null)
+ tag = "";
+
+ long ajaxSessionId = 0;
+ int event = 0;
+
+ int port;
+
+ if(host == null || portStr == null || sid == null)
+ throw new IllegalArgumentException();
+
+ try {
+ port = Integer.parseInt(portStr);
+ } catch (NumberFormatException e) {
+ s_logger.warn("Invalid number parameter in query string: " + portStr);
+ throw new IllegalArgumentException(e);
+ }
+
+ if(ajaxSessionIdStr != null) {
+ try {
+ ajaxSessionId = Long.parseLong(ajaxSessionIdStr);
+ } catch (NumberFormatException e) {
+ s_logger.warn("Invalid number parameter in query string: " + ajaxSessionIdStr);
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ if(eventStr != null) {
+ try {
+ event = Integer.parseInt(eventStr);
+ } catch (NumberFormatException e) {
+ s_logger.warn("Invalid number parameter in query string: " + eventStr);
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ ConsoleProxyClient viewer = null;
+ try {
+ ConsoleProxyClientParam param = new ConsoleProxyClientParam();
+ param.setClientHostAddress(host);
+ param.setClientHostPort(port);
+ param.setClientHostPassword(sid);
+ param.setClientTag(tag);
+ param.setTicket(ticket);
+ param.setClientTunnelUrl(console_url);
+ param.setClientTunnelSession(console_host_session);
+
+ viewer = ConsoleProxy.getAjaxVncViewer(param, ajaxSessionIdStr);
+ } catch(Exception e) {
+
+ s_logger.warn("Failed to create viewer due to " + e.getMessage(), e);
+
+ String[] content = new String[] {
+ "<html><head></head><body>",
+ "<div id=\"main_panel\" tabindex=\"1\">",
+ "<p>Access is denied for the console session. Please close the window and retry again</p>",
+ "</div></body></html>"
+ };
+
+ StringBuffer sb = new StringBuffer();
+ for(int i = 0; i < content.length; i++)
+ sb.append(content[i]);
+
+ sendResponse(t, "text/html", sb.toString());
+ return;
+ }
+
+ if(event != 0) {
+ if(ajaxSessionId != 0 && ajaxSessionId == viewer.getAjaxSessionId()) {
+ if(event == 7) {
+ // client send over an event bag
+ InputStream is = t.getRequestBody();
+ handleClientEventBag(viewer, convertStreamToString(is, true));
+ } else {
+ handleClientEvent(viewer, event, queryMap);
+ }
+ sendResponse(t, "text/html", "OK");
+ } else {
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("Ajax request comes from a different session, id in request: " + ajaxSessionId + ", id in viewer: " + viewer.getAjaxSessionId());
+
+ sendResponse(t, "text/html", "Invalid ajax client session id");
+ }
+ } else {
+ if(ajaxSessionId != 0 && ajaxSessionId != viewer.getAjaxSessionId()) {
+ s_logger.info("Ajax request comes from a different session, id in request: " + ajaxSessionId + ", id in viewer: " + viewer.getAjaxSessionId());
+ handleClientKickoff(t, viewer);
+ } else if(ajaxSessionId == 0) {
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("Ajax request indicates a fresh client start");
+
+ String title = queryMap.get("t");
+ String guest = queryMap.get("guest");
+ handleClientStart(t, viewer, title != null ? title : "", guest);
+ } else {
+
+ if(s_logger.isTraceEnabled())
+ s_logger.trace("Ajax request indicates client update");
+
+ handleClientUpdate(t, viewer);
+ }
+ }
+ }
+
+ private static String convertStreamToString(InputStream is, boolean closeStreamAfterRead) {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(is));
+ StringBuilder sb = new StringBuilder();
+ String line = null;
+ try {
+ while ((line = reader.readLine()) != null) {
+ sb.append(line + "\n");
+ }
+ } catch (IOException e) {
+ s_logger.warn("Exception while reading request body: ", e);
+ } finally {
+ if(closeStreamAfterRead) {
+ try {
+ is.close();
+ } catch (IOException e) {
+ }
+ }
+ }
+ return sb.toString();
+ }
+
+ private void sendResponse(HttpExchange t, String contentType, String response) throws IOException {
+ Headers hds = t.getResponseHeaders();
+ hds.set("Content-Type", contentType);
+
+ t.sendResponseHeaders(200, response.length());
+ OutputStream os = t.getResponseBody();
+ try {
+ os.write(response.getBytes());
+ } finally {
+ os.close();
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ private void handleClientEventBag(ConsoleProxyClient viewer, String requestData) {
+ if(s_logger.isTraceEnabled())
+ s_logger.trace("Handle event bag, event bag: " + requestData);
+
+ int start = requestData.indexOf("=");
+ if(start < 0)
+ start = 0;
+ else if(start > 0)
+ start++;
+ String data = URLDecoder.decode(requestData.substring(start));
+ String[] tokens = data.split("\\|");
+ if(tokens != null && tokens.length > 0) {
+ int count = 0;
+ try {
+ count = Integer.parseInt(tokens[0]);
+ int parsePos = 1;
+ int type, event, x, y, code, modifiers;
+ for(int i = 0; i < count; i++) {
+ type = Integer.parseInt(tokens[parsePos++]);
+ if(type == 1) {
+ // mouse event
+ event = Integer.parseInt(tokens[parsePos++]);
+ x = Integer.parseInt(tokens[parsePos++]);
+ y = Integer.parseInt(tokens[parsePos++]);
+ code = Integer.parseInt(tokens[parsePos++]);
+ modifiers = Integer.parseInt(tokens[parsePos++]);
+
+ Map<String, String> queryMap = new HashMap<String, String>();
+ queryMap.put("event", String.valueOf(event));
+ queryMap.put("x", String.valueOf(x));
+ queryMap.put("y", String.valueOf(y));
+ queryMap.put("code", String.valueOf(code));
+ queryMap.put("modifier", String.valueOf(modifiers));
+ handleClientEvent(viewer, event, queryMap);
+ } else {
+ // keyboard event
+ event = Integer.parseInt(tokens[parsePos++]);
+ code = Integer.parseInt(tokens[parsePos++]);
+ modifiers = Integer.parseInt(tokens[parsePos++]);
+
+ Map<String, String> queryMap = new HashMap<String, String>();
+ queryMap.put("event", String.valueOf(event));
+ queryMap.put("code", String.valueOf(code));
+ queryMap.put("modifier", String.valueOf(modifiers));
+ handleClientEvent(viewer, event, queryMap);
+ }
+ }
+ } catch(NumberFormatException e) {
+ s_logger.warn("Exception in handle client event bag: " + data + ", ", e);
+ } catch(Exception e) {
+ s_logger.warn("Exception in handle client event bag: " + data + ", ", e);
+ } catch(OutOfMemoryError e) {
+ s_logger.error("Unrecoverable OutOfMemory Error, exit and let it be re-launched");
+ System.exit(1);
+ }
+ }
+ }
+
+ private void handleClientEvent(ConsoleProxyClient viewer, int event, Map<String, String> queryMap) {
+ int code = 0;
+ int x = 0, y = 0;
+ int modifiers = 0;
+
+ String str;
+ switch(event) {
+ case 1: // mouse move
+ case 2: // mouse down
+ case 3: // mouse up
+ case 8: // mouse double click
+ str = queryMap.get("x");
+ if(str != null) {
+ try {
+ x = Integer.parseInt(str);
+ } catch (NumberFormatException e) {
+ s_logger.warn("Invalid number parameter in query string: " + str);
+ throw new IllegalArgumentException(e);
+ }
+ }
+ str = queryMap.get("y");
+ if(str != null) {
+ try {
+ y = Integer.parseInt(str);
+ } catch (NumberFormatException e) {
+ s_logger.warn("Invalid number parameter in query string: " + str);
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ if(event != 1) {
+ str = queryMap.get("code");
+ try {
+ code = Integer.parseInt(str);
+ } catch (NumberFormatException e) {
+ s_logger.warn("Invalid number parameter in query string: " + str);
+ throw new IllegalArgumentException(e);
+ }
+
+ str = queryMap.get("modifier");
+ try {
+ modifiers = Integer.parseInt(str);
+ } catch (NumberFormatException e) {
+ s_logger.warn("Invalid number parameter in query string: " + str);
+ throw new IllegalArgumentException(e);
+ }
+
+ if(s_logger.isTraceEnabled())
+ s_logger.trace("Handle client mouse event. event: " + event + ", x: " + x + ", y: " + y + ", button: " + code + ", modifier: " + modifiers);
+ } else {
+ if(s_logger.isTraceEnabled())
+ s_logger.trace("Handle client mouse move event. x: " + x + ", y: " + y);
+ }
+ viewer.sendClientMouseEvent(InputEventType.fromEventCode(event), x, y, code, modifiers);
+ break;
+
+ case 4: // key press
+ case 5: // key down
+ case 6: // key up
+ str = queryMap.get("code");
+ try {
+ code = Integer.parseInt(str);
+ } catch (NumberFormatException e) {
+ s_logger.warn("Invalid number parameter in query string: " + str);
+ throw new IllegalArgumentException(e);
+ }
+
+ str = queryMap.get("modifier");
+ try {
+ modifiers = Integer.parseInt(str);
+ } catch (NumberFormatException e) {
+ s_logger.warn("Invalid number parameter in query string: " + str);
+ throw new IllegalArgumentException(e);
+ }
+
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("Handle client keyboard event. event: " + event + ", code: " + code + ", modifier: " + modifiers);
+ viewer.sendClientRawKeyboardEvent(InputEventType.fromEventCode(event), code, modifiers);
+ break;
+
+ default :
+ break;
+ }
+ }
+
+ private void handleClientKickoff(HttpExchange t, ConsoleProxyClient viewer) throws IOException {
+ String response = viewer.onAjaxClientKickoff();
+ t.sendResponseHeaders(200, response.length());
+ OutputStream os = t.getResponseBody();
+ try {
+ os.write(response.getBytes());
+ } finally {
+ os.close();
+ }
+ }
+
+ private void handleClientStart(HttpExchange t, ConsoleProxyClient viewer, String title, String guest) throws IOException {
+ List<String> languages = t.getRequestHeaders().get("Accept-Language");
+ String response = viewer.onAjaxClientStart(title, languages, guest);
+
+ Headers hds = t.getResponseHeaders();
+ hds.set("Content-Type", "text/html");
+ hds.set("Cache-Control", "no-cache");
+ hds.set("Cache-Control", "no-store");
+ t.sendResponseHeaders(200, response.length());
+
+ OutputStream os = t.getResponseBody();
+ try {
+ os.write(response.getBytes());
+ } finally {
+ os.close();
+ }
+ }
+
+ private void handleClientUpdate(HttpExchange t, ConsoleProxyClient viewer) throws IOException {
+ String response = viewer.onAjaxClientUpdate();
+
+ Headers hds = t.getResponseHeaders();
+ hds.set("Content-Type", "text/javascript");
+ t.sendResponseHeaders(200, response.length());
+
+ OutputStream os = t.getResponseBody();
+ try {
+ os.write(response.getBytes());
+ } finally {
+ os.close();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0bf8c5a1/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxImageHandler.java
----------------------------------------------------------------------
diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxImageHandler.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxImageHandler.java
index 9c00948..5e10149 100644
--- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxImageHandler.java
+++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxImageHandler.java
@@ -14,87 +14,87 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package com.cloud.consoleproxy;
-
+package com.cloud.consoleproxy;
+
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Map;
-
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Map;
+
import com.cloud.consoleproxy.util.Logger;
-import com.sun.net.httpserver.Headers;
-import com.sun.net.httpserver.HttpExchange;
-import com.sun.net.httpserver.HttpHandler;
-
-public class ConsoleProxyAjaxImageHandler implements HttpHandler {
- private static final Logger s_logger = Logger.getLogger(ConsoleProxyAjaxImageHandler.class);
-
- public void handle(HttpExchange t) throws IOException {
- try {
- if(s_logger.isDebugEnabled())
- s_logger.debug("AjaxImageHandler " + t.getRequestURI());
-
- long startTick = System.currentTimeMillis();
-
- doHandle(t);
-
- if(s_logger.isDebugEnabled())
- s_logger.debug(t.getRequestURI() + "Process time " + (System.currentTimeMillis() - startTick) + " ms");
- } catch (IOException e) {
- throw e;
- } catch (IllegalArgumentException e) {
- s_logger.warn("Exception, ", e);
- t.sendResponseHeaders(400, -1); // bad request
- } catch(OutOfMemoryError e) {
- s_logger.error("Unrecoverable OutOfMemory Error, exit and let it be re-launched");
- System.exit(1);
- } catch(Throwable e) {
- s_logger.error("Unexpected exception, ", e);
- t.sendResponseHeaders(500, -1); // server error
- } finally {
- t.close();
- }
- }
-
- private void doHandle(HttpExchange t) throws Exception, IllegalArgumentException {
- String queries = t.getRequestURI().getQuery();
- Map<String, String> queryMap = ConsoleProxyHttpHandlerHelper.getQueryMap(queries);
-
- String host = queryMap.get("host");
- String portStr = queryMap.get("port");
- String sid = queryMap.get("sid");
- String tag = queryMap.get("tag");
- String ticket = queryMap.get("ticket");
- String keyStr = queryMap.get("key");
- String console_url = queryMap.get("consoleurl");
- String console_host_session = queryMap.get("sessionref");
- String w = queryMap.get("w");
+import com.sun.net.httpserver.Headers;
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+
+public class ConsoleProxyAjaxImageHandler implements HttpHandler {
+ private static final Logger s_logger = Logger.getLogger(ConsoleProxyAjaxImageHandler.class);
+
+ public void handle(HttpExchange t) throws IOException {
+ try {
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("AjaxImageHandler " + t.getRequestURI());
+
+ long startTick = System.currentTimeMillis();
+
+ doHandle(t);
+
+ if(s_logger.isDebugEnabled())
+ s_logger.debug(t.getRequestURI() + "Process time " + (System.currentTimeMillis() - startTick) + " ms");
+ } catch (IOException e) {
+ throw e;
+ } catch (IllegalArgumentException e) {
+ s_logger.warn("Exception, ", e);
+ t.sendResponseHeaders(400, -1); // bad request
+ } catch(OutOfMemoryError e) {
+ s_logger.error("Unrecoverable OutOfMemory Error, exit and let it be re-launched");
+ System.exit(1);
+ } catch(Throwable e) {
+ s_logger.error("Unexpected exception, ", e);
+ t.sendResponseHeaders(500, -1); // server error
+ } finally {
+ t.close();
+ }
+ }
+
+ private void doHandle(HttpExchange t) throws Exception, IllegalArgumentException {
+ String queries = t.getRequestURI().getQuery();
+ Map<String, String> queryMap = ConsoleProxyHttpHandlerHelper.getQueryMap(queries);
+
+ String host = queryMap.get("host");
+ String portStr = queryMap.get("port");
+ String sid = queryMap.get("sid");
+ String tag = queryMap.get("tag");
+ String ticket = queryMap.get("ticket");
+ String keyStr = queryMap.get("key");
+ String console_url = queryMap.get("consoleurl");
+ String console_host_session = queryMap.get("sessionref");
+ String w = queryMap.get("w");
String h = queryMap.get("h");
-
+
int key = 0;
int width = 144;
int height = 110;
-
- if(tag == null)
- tag = "";
-
- int port;
- if(host == null || portStr == null || sid == null)
- throw new IllegalArgumentException();
-
- try {
- port = Integer.parseInt(portStr);
- } catch (NumberFormatException e) {
- s_logger.warn("Invalid numeric parameter in query string: " + portStr);
- throw new IllegalArgumentException(e);
- }
-
- try {
+
+ if(tag == null)
+ tag = "";
+
+ int port;
+ if(host == null || portStr == null || sid == null)
+ throw new IllegalArgumentException();
+
+ try {
+ port = Integer.parseInt(portStr);
+ } catch (NumberFormatException e) {
+ s_logger.warn("Invalid numeric parameter in query string: " + portStr);
+ throw new IllegalArgumentException(e);
+ }
+
+ try {
if (keyStr != null)
- key = Integer.parseInt(keyStr);
+ key = Integer.parseInt(keyStr);
if(null != w)
width = Integer.parseInt(w);
@@ -102,58 +102,58 @@ public class ConsoleProxyAjaxImageHandler implements HttpHandler {
height = Integer.parseInt(h);
} catch (NumberFormatException e) {
- s_logger.warn("Invalid numeric parameter in query string: " + keyStr);
- throw new IllegalArgumentException(e);
- }
+ s_logger.warn("Invalid numeric parameter in query string: " + keyStr);
+ throw new IllegalArgumentException(e);
+ }
- ConsoleProxyClientParam param = new ConsoleProxyClientParam();
- param.setClientHostAddress(host);
- param.setClientHostPort(port);
- param.setClientHostPassword(sid);
- param.setClientTag(tag);
- param.setTicket(ticket);
- param.setClientTunnelUrl(console_url);
- param.setClientTunnelSession(console_host_session);
+ ConsoleProxyClientParam param = new ConsoleProxyClientParam();
+ param.setClientHostAddress(host);
+ param.setClientHostPort(port);
+ param.setClientHostPassword(sid);
+ param.setClientTag(tag);
+ param.setTicket(ticket);
+ param.setClientTunnelUrl(console_url);
+ param.setClientTunnelSession(console_host_session);
- ConsoleProxyClient viewer = ConsoleProxy.getVncViewer(param);
+ ConsoleProxyClient viewer = ConsoleProxy.getVncViewer(param);
- if (key == 0) {
- Image scaledImage = viewer.getClientScaledImage(width, height);
- BufferedImage bufferedImage = new BufferedImage(width, height,
- BufferedImage.TYPE_3BYTE_BGR);
- Graphics2D bufImageGraphics = bufferedImage.createGraphics();
- bufImageGraphics.drawImage(scaledImage, 0, 0, null);
- ByteArrayOutputStream bos = new ByteArrayOutputStream(8196);
- javax.imageio.ImageIO.write(bufferedImage, "jpg", bos);
- byte[] bs = bos.toByteArray();
- Headers hds = t.getResponseHeaders();
- hds.set("Content-Type", "image/jpeg");
- hds.set("Cache-Control", "no-cache");
- hds.set("Cache-Control", "no-store");
- t.sendResponseHeaders(200, bs.length);
- OutputStream os = t.getResponseBody();
- os.write(bs);
- os.close();
- } else {
- AjaxFIFOImageCache imageCache = viewer.getAjaxImageCache();
- byte[] img = imageCache.getImage(key);
-
- if(img != null) {
- Headers hds = t.getResponseHeaders();
- hds.set("Content-Type", "image/jpeg");
- t.sendResponseHeaders(200, img.length);
-
- OutputStream os = t.getResponseBody();
- try {
- os.write(img, 0, img.length);
- } finally {
- os.close();
- }
- } else {
- if(s_logger.isInfoEnabled())
- s_logger.info("Image has already been swept out, key: " + key);
- t.sendResponseHeaders(404, -1);
- }
- }
- }
-}
+ if (key == 0) {
+ Image scaledImage = viewer.getClientScaledImage(width, height);
+ BufferedImage bufferedImage = new BufferedImage(width, height,
+ BufferedImage.TYPE_3BYTE_BGR);
+ Graphics2D bufImageGraphics = bufferedImage.createGraphics();
+ bufImageGraphics.drawImage(scaledImage, 0, 0, null);
+ ByteArrayOutputStream bos = new ByteArrayOutputStream(8196);
+ javax.imageio.ImageIO.write(bufferedImage, "jpg", bos);
+ byte[] bs = bos.toByteArray();
+ Headers hds = t.getResponseHeaders();
+ hds.set("Content-Type", "image/jpeg");
+ hds.set("Cache-Control", "no-cache");
+ hds.set("Cache-Control", "no-store");
+ t.sendResponseHeaders(200, bs.length);
+ OutputStream os = t.getResponseBody();
+ os.write(bs);
+ os.close();
+ } else {
+ AjaxFIFOImageCache imageCache = viewer.getAjaxImageCache();
+ byte[] img = imageCache.getImage(key);
+
+ if(img != null) {
+ Headers hds = t.getResponseHeaders();
+ hds.set("Content-Type", "image/jpeg");
+ t.sendResponseHeaders(200, img.length);
+
+ OutputStream os = t.getResponseBody();
+ try {
+ os.write(img, 0, img.length);
+ } finally {
+ os.close();
+ }
+ } else {
+ if(s_logger.isInfoEnabled())
+ s_logger.info("Image has already been swept out, key: " + key);
+ t.sendResponseHeaders(404, -1);
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0bf8c5a1/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAuthenticationResult.java
----------------------------------------------------------------------
diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAuthenticationResult.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAuthenticationResult.java
index d9563b9..26ee9b3 100644
--- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAuthenticationResult.java
+++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAuthenticationResult.java
@@ -14,68 +14,68 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package com.cloud.consoleproxy;
-
-// duplicated class
-public class ConsoleProxyAuthenticationResult {
- private boolean success;
- private boolean isReauthentication;
- private String host;
- private int port;
- private String tunnelUrl;
- private String tunnelSession;
-
- public ConsoleProxyAuthenticationResult() {
- success = false;
- isReauthentication = false;
- port = 0;
- }
-
- public boolean isSuccess() {
- return success;
- }
-
- public void setSuccess(boolean success) {
- this.success = success;
- }
-
- public boolean isReauthentication() {
- return isReauthentication;
- }
-
- public void setReauthentication(boolean isReauthentication) {
- this.isReauthentication = isReauthentication;
- }
-
- public String getHost() {
- return host;
- }
-
- public void setHost(String host) {
- this.host = host;
- }
-
- public int getPort() {
- return port;
- }
-
- public void setPort(int port) {
- this.port = port;
- }
-
- public String getTunnelUrl() {
- return tunnelUrl;
- }
-
- public void setTunnelUrl(String tunnelUrl) {
- this.tunnelUrl = tunnelUrl;
- }
-
- public String getTunnelSession() {
- return tunnelSession;
- }
-
- public void setTunnelSession(String tunnelSession) {
- this.tunnelSession = tunnelSession;
- }
-}
+package com.cloud.consoleproxy;
+
+// duplicated class
+public class ConsoleProxyAuthenticationResult {
+ private boolean success;
+ private boolean isReauthentication;
+ private String host;
+ private int port;
+ private String tunnelUrl;
+ private String tunnelSession;
+
+ public ConsoleProxyAuthenticationResult() {
+ success = false;
+ isReauthentication = false;
+ port = 0;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+
+ public boolean isReauthentication() {
+ return isReauthentication;
+ }
+
+ public void setReauthentication(boolean isReauthentication) {
+ this.isReauthentication = isReauthentication;
+ }
+
+ public String getHost() {
+ return host;
+ }
+
+ public void setHost(String host) {
+ this.host = host;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ public String getTunnelUrl() {
+ return tunnelUrl;
+ }
+
+ public void setTunnelUrl(String tunnelUrl) {
+ this.tunnelUrl = tunnelUrl;
+ }
+
+ public String getTunnelSession() {
+ return tunnelSession;
+ }
+
+ public void setTunnelSession(String tunnelSession) {
+ this.tunnelSession = tunnelSession;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0bf8c5a1/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyBaseServerFactoryImpl.java
----------------------------------------------------------------------
diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyBaseServerFactoryImpl.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyBaseServerFactoryImpl.java
index 2706184..c9ad8ab 100644
--- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyBaseServerFactoryImpl.java
+++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyBaseServerFactoryImpl.java
@@ -14,8 +14,8 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package com.cloud.consoleproxy;
-
+package com.cloud.consoleproxy;
+
import java.io.IOException;
import java.net.InetSocketAddress;
@@ -23,26 +23,26 @@ import javax.net.ssl.SSLServerSocket;
import com.cloud.consoleproxy.util.Logger;
import com.sun.net.httpserver.HttpServer;
-
-public class ConsoleProxyBaseServerFactoryImpl implements ConsoleProxyServerFactory {
- private static final Logger s_logger = Logger.getLogger(ConsoleProxyBaseServerFactoryImpl.class);
-
- @Override
- public void init(byte[] ksBits, String ksPassword) {
- }
-
- @Override
- public HttpServer createHttpServerInstance(int port) throws IOException {
- if(s_logger.isInfoEnabled())
- s_logger.info("create HTTP server instance at port: " + port);
- return HttpServer.create(new InetSocketAddress(port), 5);
- }
-
- @Override
- public SSLServerSocket createSSLServerSocket(int port) throws IOException {
- if(s_logger.isInfoEnabled())
- s_logger.info("SSL server socket is not supported in ConsoleProxyBaseServerFactoryImpl");
-
- return null;
- }
-}
+
+public class ConsoleProxyBaseServerFactoryImpl implements ConsoleProxyServerFactory {
+ private static final Logger s_logger = Logger.getLogger(ConsoleProxyBaseServerFactoryImpl.class);
+
+ @Override
+ public void init(byte[] ksBits, String ksPassword) {
+ }
+
+ @Override
+ public HttpServer createHttpServerInstance(int port) throws IOException {
+ if(s_logger.isInfoEnabled())
+ s_logger.info("create HTTP server instance at port: " + port);
+ return HttpServer.create(new InetSocketAddress(port), 5);
+ }
+
+ @Override
+ public SSLServerSocket createSSLServerSocket(int port) throws IOException {
+ if(s_logger.isInfoEnabled())
+ s_logger.info("SSL server socket is not supported in ConsoleProxyBaseServerFactoryImpl");
+
+ return null;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0bf8c5a1/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyClientListener.java
----------------------------------------------------------------------
diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyClientListener.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyClientListener.java
index 89097d8..43a0bab 100644
--- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyClientListener.java
+++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyClientListener.java
@@ -14,12 +14,12 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package com.cloud.consoleproxy;
-
-public interface ConsoleProxyClientListener {
- void onFramebufferSizeChange(int w, int h);
- void onFramebufferUpdate(int x, int y, int w, int h);
-
- void onClientConnected();
- void onClientClose();
-}
+package com.cloud.consoleproxy;
+
+public interface ConsoleProxyClientListener {
+ void onFramebufferSizeChange(int w, int h);
+ void onFramebufferUpdate(int x, int y, int w, int h);
+
+ void onClientConnected();
+ void onClientClose();
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0bf8c5a1/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyCmdHandler.java
----------------------------------------------------------------------
diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyCmdHandler.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyCmdHandler.java
index 5471dea..408eb04 100644
--- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyCmdHandler.java
+++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyCmdHandler.java
@@ -14,57 +14,57 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package com.cloud.consoleproxy;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-
+package com.cloud.consoleproxy;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+
import com.cloud.consoleproxy.util.Logger;
-import com.sun.net.httpserver.Headers;
-import com.sun.net.httpserver.HttpExchange;
-import com.sun.net.httpserver.HttpHandler;
-
-public class ConsoleProxyCmdHandler implements HttpHandler {
- private static final Logger s_logger = Logger.getLogger(ConsoleProxyCmdHandler.class);
-
- public void handle(HttpExchange t) throws IOException {
- try {
- Thread.currentThread().setName("Cmd Thread " +
- Thread.currentThread().getId() + " " + t.getRemoteAddress());
- s_logger.info("CmdHandler " + t.getRequestURI());
- doHandle(t);
- } catch (Exception e) {
- s_logger.error(e.toString(), e);
- String response = "Not found";
- t.sendResponseHeaders(404, response.length());
- OutputStream os = t.getResponseBody();
- os.write(response.getBytes());
- os.close();
- } catch(OutOfMemoryError e) {
- s_logger.error("Unrecoverable OutOfMemory Error, exit and let it be re-launched");
- System.exit(1);
- } catch (Throwable e) {
- s_logger.error(e.toString(), e);
- } finally {
- t.close();
- }
- }
-
- public void doHandle(HttpExchange t) throws Exception {
- String path = t.getRequestURI().getPath();
- int i = path.indexOf("/", 1);
- String cmd = path.substring(i + 1);
- s_logger.info("Get CMD request for " + cmd);
- if (cmd.equals("getstatus")) {
- ConsoleProxyClientStatsCollector statsCollector = ConsoleProxy.getStatsCollector();
-
- Headers hds = t.getResponseHeaders();
- hds.set("Content-Type", "text/plain");
- t.sendResponseHeaders(200, 0);
- OutputStreamWriter os = new OutputStreamWriter(t.getResponseBody());
- statsCollector.getStatsReport(os);
- os.close();
- }
- }
-}
+import com.sun.net.httpserver.Headers;
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+
+public class ConsoleProxyCmdHandler implements HttpHandler {
+ private static final Logger s_logger = Logger.getLogger(ConsoleProxyCmdHandler.class);
+
+ public void handle(HttpExchange t) throws IOException {
+ try {
+ Thread.currentThread().setName("Cmd Thread " +
+ Thread.currentThread().getId() + " " + t.getRemoteAddress());
+ s_logger.info("CmdHandler " + t.getRequestURI());
+ doHandle(t);
+ } catch (Exception e) {
+ s_logger.error(e.toString(), e);
+ String response = "Not found";
+ t.sendResponseHeaders(404, response.length());
+ OutputStream os = t.getResponseBody();
+ os.write(response.getBytes());
+ os.close();
+ } catch(OutOfMemoryError e) {
+ s_logger.error("Unrecoverable OutOfMemory Error, exit and let it be re-launched");
+ System.exit(1);
+ } catch (Throwable e) {
+ s_logger.error(e.toString(), e);
+ } finally {
+ t.close();
+ }
+ }
+
+ public void doHandle(HttpExchange t) throws Exception {
+ String path = t.getRequestURI().getPath();
+ int i = path.indexOf("/", 1);
+ String cmd = path.substring(i + 1);
+ s_logger.info("Get CMD request for " + cmd);
+ if (cmd.equals("getstatus")) {
+ ConsoleProxyClientStatsCollector statsCollector = ConsoleProxy.getStatsCollector();
+
+ Headers hds = t.getResponseHeaders();
+ hds.set("Content-Type", "text/plain");
+ t.sendResponseHeaders(200, 0);
+ OutputStreamWriter os = new OutputStreamWriter(t.getResponseBody());
+ statsCollector.getStatsReport(os);
+ os.close();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0bf8c5a1/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyHttpHandlerHelper.java
----------------------------------------------------------------------
diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyHttpHandlerHelper.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyHttpHandlerHelper.java
index cf2027b..7756d01 100644
--- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyHttpHandlerHelper.java
+++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyHttpHandlerHelper.java
@@ -14,61 +14,61 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package com.cloud.consoleproxy;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import com.cloud.consoleproxy.util.Logger;
-
-public class ConsoleProxyHttpHandlerHelper {
- private static final Logger s_logger = Logger.getLogger(ConsoleProxyHttpHandlerHelper.class);
-
- public static Map<String, String> getQueryMap(String query) {
- String[] params = query.split("&");
- Map<String, String> map = new HashMap<String, String>();
- for (String param : params) {
- String[] paramTokens = param.split("=");
- if(paramTokens != null && paramTokens.length == 2) {
- String name = param.split("=")[0];
- String value = param.split("=")[1];
- map.put(name, value);
- } else if (paramTokens.length == 3) {
- // very ugly, added for Xen tunneling url
- String name = paramTokens[0];
- String value = paramTokens[1] + "=" + paramTokens[2];
- map.put(name, value);
- } else {
- if(s_logger.isDebugEnabled())
- s_logger.debug("Invalid paramemter in URL found. param: " + param);
- }
- }
-
- // This is a ugly solution for now. We will do encryption/decryption translation
- // here to make it transparent to rest of the code.
- if(map.get("token") != null) {
- ConsoleProxyPasswordBasedEncryptor encryptor = new ConsoleProxyPasswordBasedEncryptor(
- ConsoleProxy.getEncryptorPassword());
-
- ConsoleProxyClientParam param = encryptor.decryptObject(ConsoleProxyClientParam.class, map.get("token"));
- if(param != null) {
- if(param.getClientHostAddress() != null)
- map.put("host", param.getClientHostAddress());
- if(param.getClientHostPort() != 0)
- map.put("port", String.valueOf(param.getClientHostPort()));
- if(param.getClientTag() != null)
- map.put("tag", param.getClientTag());
- if(param.getClientHostPassword() != null)
- map.put("sid", param.getClientHostPassword());
- if(param.getClientTunnelUrl() != null)
- map.put("consoleurl", param.getClientTunnelUrl());
- if(param.getClientTunnelSession() != null)
- map.put("sessionref", param.getClientTunnelSession());
- if(param.getTicket() != null)
- map.put("ticket", param.getTicket());
- }
- }
-
- return map;
- }
-}
+package com.cloud.consoleproxy;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.cloud.consoleproxy.util.Logger;
+
+public class ConsoleProxyHttpHandlerHelper {
+ private static final Logger s_logger = Logger.getLogger(ConsoleProxyHttpHandlerHelper.class);
+
+ public static Map<String, String> getQueryMap(String query) {
+ String[] params = query.split("&");
+ Map<String, String> map = new HashMap<String, String>();
+ for (String param : params) {
+ String[] paramTokens = param.split("=");
+ if(paramTokens != null && paramTokens.length == 2) {
+ String name = param.split("=")[0];
+ String value = param.split("=")[1];
+ map.put(name, value);
+ } else if (paramTokens.length == 3) {
+ // very ugly, added for Xen tunneling url
+ String name = paramTokens[0];
+ String value = paramTokens[1] + "=" + paramTokens[2];
+ map.put(name, value);
+ } else {
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("Invalid paramemter in URL found. param: " + param);
+ }
+ }
+
+ // This is a ugly solution for now. We will do encryption/decryption translation
+ // here to make it transparent to rest of the code.
+ if(map.get("token") != null) {
+ ConsoleProxyPasswordBasedEncryptor encryptor = new ConsoleProxyPasswordBasedEncryptor(
+ ConsoleProxy.getEncryptorPassword());
+
+ ConsoleProxyClientParam param = encryptor.decryptObject(ConsoleProxyClientParam.class, map.get("token"));
+ if(param != null) {
+ if(param.getClientHostAddress() != null)
+ map.put("host", param.getClientHostAddress());
+ if(param.getClientHostPort() != 0)
+ map.put("port", String.valueOf(param.getClientHostPort()));
+ if(param.getClientTag() != null)
+ map.put("tag", param.getClientTag());
+ if(param.getClientHostPassword() != null)
+ map.put("sid", param.getClientHostPassword());
+ if(param.getClientTunnelUrl() != null)
+ map.put("consoleurl", param.getClientTunnelUrl());
+ if(param.getClientTunnelSession() != null)
+ map.put("sessionref", param.getClientTunnelSession());
+ if(param.getTicket() != null)
+ map.put("ticket", param.getTicket());
+ }
+ }
+
+ return map;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0bf8c5a1/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyLoggerFactory.java
----------------------------------------------------------------------
diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyLoggerFactory.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyLoggerFactory.java
index 701ad7a..ff66de3 100644
--- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyLoggerFactory.java
+++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyLoggerFactory.java
@@ -14,76 +14,76 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package com.cloud.consoleproxy;
+package com.cloud.consoleproxy;
import com.cloud.consoleproxy.util.Logger;
import com.cloud.consoleproxy.util.LoggerFactory;
-
-public class ConsoleProxyLoggerFactory implements LoggerFactory {
- public ConsoleProxyLoggerFactory() {
- }
-
- public Logger getLogger(Class<?> clazz) {
- return new Log4jLogger(org.apache.log4j.Logger.getLogger(clazz));
- }
-
- public static class Log4jLogger extends Logger {
- private org.apache.log4j.Logger logger;
-
- public Log4jLogger(org.apache.log4j.Logger logger) {
- this.logger = logger;
- }
-
- public boolean isTraceEnabled() {
- return logger.isTraceEnabled();
- }
-
- public boolean isDebugEnabled() {
- return logger.isDebugEnabled();
- }
-
- public boolean isInfoEnabled() {
- return logger.isInfoEnabled();
- }
-
- public void trace(Object message) {
- logger.trace(message);
- }
-
- public void trace(Object message, Throwable exception) {
- logger.trace(message, exception);
- }
-
- public void info(Object message) {
- logger.info(message);
- }
-
- public void info(Object message, Throwable exception) {
- logger.info(message, exception);
- }
-
- public void debug(Object message) {
- logger.debug(message);
- }
-
- public void debug(Object message, Throwable exception) {
- logger.debug(message, exception);
- }
-
- public void warn(Object message) {
- logger.warn(message);
- }
-
- public void warn(Object message, Throwable exception) {
- logger.warn(message, exception);
- }
-
- public void error(Object message) {
- logger.error(message);
- }
-
- public void error(Object message, Throwable exception) {
- logger.error(message, exception);
- }
- }
-}
+
+public class ConsoleProxyLoggerFactory implements LoggerFactory {
+ public ConsoleProxyLoggerFactory() {
+ }
+
+ public Logger getLogger(Class<?> clazz) {
+ return new Log4jLogger(org.apache.log4j.Logger.getLogger(clazz));
+ }
+
+ public static class Log4jLogger extends Logger {
+ private org.apache.log4j.Logger logger;
+
+ public Log4jLogger(org.apache.log4j.Logger logger) {
+ this.logger = logger;
+ }
+
+ public boolean isTraceEnabled() {
+ return logger.isTraceEnabled();
+ }
+
+ public boolean isDebugEnabled() {
+ return logger.isDebugEnabled();
+ }
+
+ public boolean isInfoEnabled() {
+ return logger.isInfoEnabled();
+ }
+
+ public void trace(Object message) {
+ logger.trace(message);
+ }
+
+ public void trace(Object message, Throwable exception) {
+ logger.trace(message, exception);
+ }
+
+ public void info(Object message) {
+ logger.info(message);
+ }
+
+ public void info(Object message, Throwable exception) {
+ logger.info(message, exception);
+ }
+
+ public void debug(Object message) {
+ logger.debug(message);
+ }
+
+ public void debug(Object message, Throwable exception) {
+ logger.debug(message, exception);
+ }
+
+ public void warn(Object message) {
+ logger.warn(message);
+ }
+
+ public void warn(Object message, Throwable exception) {
+ logger.warn(message, exception);
+ }
+
+ public void error(Object message) {
+ logger.error(message);
+ }
+
+ public void error(Object message, Throwable exception) {
+ logger.error(message, exception);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0bf8c5a1/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyMonitor.java
----------------------------------------------------------------------
diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyMonitor.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyMonitor.java
index be5df6e..030b2f4 100644
--- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyMonitor.java
+++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyMonitor.java
@@ -34,120 +34,120 @@ import com.cloud.consoleproxy.util.Logger;
// itself and the shell script will re-launch console proxy
//
public class ConsoleProxyMonitor {
- private static final Logger s_logger = Logger.getLogger(ConsoleProxyMonitor.class);
-
- private String[] _argv;
- private Map<String, String> _argMap = new HashMap<String, String>();
-
- private volatile Process _process;
- private boolean _quit = false;
-
- public ConsoleProxyMonitor(String[] argv) {
- _argv = argv;
-
- for(String arg : _argv) {
- String[] tokens = arg.split("=");
- if(tokens.length == 2) {
- s_logger.info("Add argument " + tokens[0] + "=" + tokens[1] + " to the argument map");
+ private static final Logger s_logger = Logger.getLogger(ConsoleProxyMonitor.class);
+
+ private String[] _argv;
+ private Map<String, String> _argMap = new HashMap<String, String>();
+
+ private volatile Process _process;
+ private boolean _quit = false;
+
+ public ConsoleProxyMonitor(String[] argv) {
+ _argv = argv;
+
+ for(String arg : _argv) {
+ String[] tokens = arg.split("=");
+ if(tokens.length == 2) {
+ s_logger.info("Add argument " + tokens[0] + "=" + tokens[1] + " to the argument map");
- _argMap.put(tokens[0].trim(), tokens[1].trim());
- } else {
- s_logger.warn("unrecognized argument, skip adding it to argument map");
- }
- }
- }
-
- private void run() {
- Runtime.getRuntime().addShutdownHook(new Thread() {
- @Override
- public void run() {
- _quit = true;
- onShutdown();
- }
- });
-
- while(!_quit) {
- String cmdLine = getLaunchCommandLine();
-
- s_logger.info("Launch console proxy process with command line: " + cmdLine);
-
- try {
- _process = Runtime.getRuntime().exec(cmdLine);
- } catch (IOException e) {
- s_logger.error("Unexpected exception ", e);
- System.exit(1);
- }
-
- boolean waitSucceeded = false;
- int exitCode = 0;
- while(!waitSucceeded) {
- try {
- exitCode = _process.waitFor();
- waitSucceeded = true;
-
- if(s_logger.isInfoEnabled())
- s_logger.info("Console proxy process exits with code: " + exitCode);
- } catch (InterruptedException e) {
- if(s_logger.isInfoEnabled())
- s_logger.info("InterruptedException while waiting for termination of console proxy, will retry");
- }
- }
- }
- }
-
- private String getLaunchCommandLine() {
- StringBuffer sb = new StringBuffer("java ");
- String jvmOptions = _argMap.get("jvmoptions");
-
- if(jvmOptions != null)
- sb.append(jvmOptions);
-
- for(Map.Entry<String, String> entry : _argMap.entrySet()) {
- if(!"jvmoptions".equalsIgnoreCase(entry.getKey()))
- sb.append(" ").append(entry.getKey()).append("=").append(entry.getValue());
- }
-
- return sb.toString();
- }
-
- private void onShutdown() {
- if(_process != null) {
- if(s_logger.isInfoEnabled())
- s_logger.info("Console proxy monitor shuts dwon, terminate console proxy process");
- _process.destroy();
- }
- }
+ _argMap.put(tokens[0].trim(), tokens[1].trim());
+ } else {
+ s_logger.warn("unrecognized argument, skip adding it to argument map");
+ }
+ }
+ }
+
+ private void run() {
+ Runtime.getRuntime().addShutdownHook(new Thread() {
+ @Override
+ public void run() {
+ _quit = true;
+ onShutdown();
+ }
+ });
+
+ while(!_quit) {
+ String cmdLine = getLaunchCommandLine();
+
+ s_logger.info("Launch console proxy process with command line: " + cmdLine);
+
+ try {
+ _process = Runtime.getRuntime().exec(cmdLine);
+ } catch (IOException e) {
+ s_logger.error("Unexpected exception ", e);
+ System.exit(1);
+ }
+
+ boolean waitSucceeded = false;
+ int exitCode = 0;
+ while(!waitSucceeded) {
+ try {
+ exitCode = _process.waitFor();
+ waitSucceeded = true;
+
+ if(s_logger.isInfoEnabled())
+ s_logger.info("Console proxy process exits with code: " + exitCode);
+ } catch (InterruptedException e) {
+ if(s_logger.isInfoEnabled())
+ s_logger.info("InterruptedException while waiting for termination of console proxy, will retry");
+ }
+ }
+ }
+ }
+
+ private String getLaunchCommandLine() {
+ StringBuffer sb = new StringBuffer("java ");
+ String jvmOptions = _argMap.get("jvmoptions");
+
+ if(jvmOptions != null)
+ sb.append(jvmOptions);
+
+ for(Map.Entry<String, String> entry : _argMap.entrySet()) {
+ if(!"jvmoptions".equalsIgnoreCase(entry.getKey()))
+ sb.append(" ").append(entry.getKey()).append("=").append(entry.getValue());
+ }
+
+ return sb.toString();
+ }
+
+ private void onShutdown() {
+ if(_process != null) {
+ if(s_logger.isInfoEnabled())
+ s_logger.info("Console proxy monitor shuts dwon, terminate console proxy process");
+ _process.destroy();
+ }
+ }
- private static void configLog4j() {
- URL configUrl = System.class.getResource("/conf/log4j-cloud.xml");
- if(configUrl == null)
- configUrl = ClassLoader.getSystemResource("log4j-cloud.xml");
-
- if(configUrl == null)
- configUrl = ClassLoader.getSystemResource("conf/log4j-cloud.xml");
-
- if(configUrl != null) {
- try {
- System.out.println("Configure log4j using " + configUrl.toURI().toString());
- } catch (URISyntaxException e1) {
- e1.printStackTrace();
- }
+ private static void configLog4j() {
+ URL configUrl = System.class.getResource("/conf/log4j-cloud.xml");
+ if(configUrl == null)
+ configUrl = ClassLoader.getSystemResource("log4j-cloud.xml");
+
+ if(configUrl == null)
+ configUrl = ClassLoader.getSystemResource("conf/log4j-cloud.xml");
+
+ if(configUrl != null) {
+ try {
+ System.out.println("Configure log4j using " + configUrl.toURI().toString());
+ } catch (URISyntaxException e1) {
+ e1.printStackTrace();
+ }
- try {
- File file = new File(configUrl.toURI());
-
- System.out.println("Log4j configuration from : " + file.getAbsolutePath());
- DOMConfigurator.configureAndWatch(file.getAbsolutePath(), 10000);
- } catch (URISyntaxException e) {
- System.out.println("Unable to convert log4j configuration Url to URI");
- }
- } else {
- System.out.println("Configure log4j with default properties");
- }
- }
-
- public static void main(String[] argv) {
- configLog4j();
- (new ConsoleProxyMonitor(argv)).run();
- }
+ try {
+ File file = new File(configUrl.toURI());
+
+ System.out.println("Log4j configuration from : " + file.getAbsolutePath());
+ DOMConfigurator.configureAndWatch(file.getAbsolutePath(), 10000);
+ } catch (URISyntaxException e) {
+ System.out.println("Unable to convert log4j configuration Url to URI");
+ }
+ } else {
+ System.out.println("Configure log4j with default properties");
+ }
+ }
+
+ public static void main(String[] argv) {
+ configLog4j();
+ (new ConsoleProxyMonitor(argv)).run();
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/0bf8c5a1/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyResourceHandler.java
----------------------------------------------------------------------
diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyResourceHandler.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyResourceHandler.java
index f9dc21e..7d16047 100644
--- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyResourceHandler.java
+++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyResourceHandler.java
@@ -14,168 +14,168 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package com.cloud.consoleproxy;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
+package com.cloud.consoleproxy;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
import com.cloud.consoleproxy.util.Logger;
-import com.sun.net.httpserver.Headers;
-import com.sun.net.httpserver.HttpExchange;
-import com.sun.net.httpserver.HttpHandler;
-
-public class ConsoleProxyResourceHandler implements HttpHandler {
- private static final Logger s_logger = Logger.getLogger(ConsoleProxyResourceHandler.class);
-
- static Map<String, String> s_mimeTypes;
- static {
- s_mimeTypes = new HashMap<String, String>();
- s_mimeTypes.put("jar", "application/java-archive");
- s_mimeTypes.put("js", "text/javascript");
- s_mimeTypes.put("css", "text/css");
- s_mimeTypes.put("jpg", "image/jpeg");
- s_mimeTypes.put("html", "text/html");
- s_mimeTypes.put("htm", "text/html");
- s_mimeTypes.put("log", "text/plain");
- }
-
- static Map<String, String> s_validResourceFolders;
- static {
- s_validResourceFolders = new HashMap<String, String>();
- s_validResourceFolders.put("applet", "");
- s_validResourceFolders.put("logs", "");
- s_validResourceFolders.put("images", "");
- s_validResourceFolders.put("js", "");
- s_validResourceFolders.put("css", "");
- s_validResourceFolders.put("html", "");
- }
-
- public ConsoleProxyResourceHandler() {
- }
-
- public void handle(HttpExchange t) throws IOException {
- try {
- if(s_logger.isDebugEnabled())
- s_logger.debug("Resource Handler " + t.getRequestURI());
-
- long startTick = System.currentTimeMillis();
-
- doHandle(t);
-
- if(s_logger.isDebugEnabled())
- s_logger.debug(t.getRequestURI() + " Process time " + (System.currentTimeMillis() - startTick) + " ms");
- } catch (IOException e) {
- throw e;
- } catch(Throwable e) {
- s_logger.error("Unexpected exception, ", e);
- t.sendResponseHeaders(500, -1); // server error
- } finally {
- t.close();
- }
- }
-
- @SuppressWarnings("deprecation")
- private void doHandle(HttpExchange t) throws Exception {
- String path = t.getRequestURI().getPath();
-
- if(s_logger.isInfoEnabled())
- s_logger.info("Get resource request for " + path);
-
- int i = path.indexOf("/", 1);
- String filepath = path.substring(i + 1);
- i = path.lastIndexOf(".");
- String extension = (i == -1) ? "" : path.substring(i + 1);
- String contentType = getContentType(extension);
-
- if(!validatePath(filepath)) {
- if(s_logger.isInfoEnabled())
- s_logger.info("Resource access is forbidden, uri: " + path);
-
- t.sendResponseHeaders(403, -1); // forbidden
- return;
- }
-
- File f = new File ("./" + filepath);
- if(f.exists()) {
- long lastModified = f.lastModified();
- String ifModifiedSince = t.getRequestHeaders().getFirst("If-Modified-Since");
- if (ifModifiedSince != null) {
- long d = Date.parse(ifModifiedSince);
- if (d + 1000 >= lastModified) {
- Headers hds = t.getResponseHeaders();
- hds.set("Content-Type", contentType);
- t.sendResponseHeaders(304, -1);
-
- if(s_logger.isInfoEnabled())
- s_logger.info("Sent 304 file has not been " +
- "modified since " + ifModifiedSince);
- return;
- }
- }
-
- long length = f.length();
- Headers hds = t.getResponseHeaders();
- hds.set("Content-Type", contentType);
- hds.set("Last-Modified", new Date(lastModified).toGMTString());
- t.sendResponseHeaders(200, length);
- responseFileContent(t, f);
-
- if(s_logger.isInfoEnabled())
- s_logger.info("Sent file " + path + " with content type " + contentType);
- } else {
- if(s_logger.isInfoEnabled())
- s_logger.info("file does not exist" + path);
- t.sendResponseHeaders(404, -1);
- }
- }
-
- private static String getContentType(String extension) {
- String key = extension.toLowerCase();
- if(s_mimeTypes.containsKey(key)) {
- return s_mimeTypes.get(key);
- }
- return "application/octet-stream";
- }
-
- private static void responseFileContent(HttpExchange t, File f) throws Exception {
- OutputStream os = t.getResponseBody();
- FileInputStream fis = new FileInputStream(f);
- while (true) {
- byte[] b = new byte[8192];
- int n = fis.read(b);
- if (n < 0) {
- break;
- }
- os.write(b, 0, n);
- }
- fis.close();
- os.close();
- }
-
- private static boolean validatePath(String path) {
- int i = path.indexOf("/");
- if(i == -1) {
- if(s_logger.isInfoEnabled())
- s_logger.info("Invalid resource path: can not start at resource root");
- return false;
- }
-
- if(path.contains("..")) {
- if(s_logger.isInfoEnabled())
- s_logger.info("Invalid resource path: contains relative up-level navigation");
-
- return false;
- }
-
- return isValidResourceFolder(path.substring(0, i));
- }
-
- private static boolean isValidResourceFolder(String name) {
- return s_validResourceFolders.containsKey(name);
- }
-}
+import com.sun.net.httpserver.Headers;
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+
+public class ConsoleProxyResourceHandler implements HttpHandler {
+ private static final Logger s_logger = Logger.getLogger(ConsoleProxyResourceHandler.class);
+
+ static Map<String, String> s_mimeTypes;
+ static {
+ s_mimeTypes = new HashMap<String, String>();
+ s_mimeTypes.put("jar", "application/java-archive");
+ s_mimeTypes.put("js", "text/javascript");
+ s_mimeTypes.put("css", "text/css");
+ s_mimeTypes.put("jpg", "image/jpeg");
+ s_mimeTypes.put("html", "text/html");
+ s_mimeTypes.put("htm", "text/html");
+ s_mimeTypes.put("log", "text/plain");
+ }
+
+ static Map<String, String> s_validResourceFolders;
+ static {
+ s_validResourceFolders = new HashMap<String, String>();
+ s_validResourceFolders.put("applet", "");
+ s_validResourceFolders.put("logs", "");
+ s_validResourceFolders.put("images", "");
+ s_validResourceFolders.put("js", "");
+ s_validResourceFolders.put("css", "");
+ s_validResourceFolders.put("html", "");
+ }
+
+ public ConsoleProxyResourceHandler() {
+ }
+
+ public void handle(HttpExchange t) throws IOException {
+ try {
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("Resource Handler " + t.getRequestURI());
+
+ long startTick = System.currentTimeMillis();
+
+ doHandle(t);
+
+ if(s_logger.isDebugEnabled())
+ s_logger.debug(t.getRequestURI() + " Process time " + (System.currentTimeMillis() - startTick) + " ms");
+ } catch (IOException e) {
+ throw e;
+ } catch(Throwable e) {
+ s_logger.error("Unexpected exception, ", e);
+ t.sendResponseHeaders(500, -1); // server error
+ } finally {
+ t.close();
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ private void doHandle(HttpExchange t) throws Exception {
+ String path = t.getRequestURI().getPath();
+
+ if(s_logger.isInfoEnabled())
+ s_logger.info("Get resource request for " + path);
+
+ int i = path.indexOf("/", 1);
+ String filepath = path.substring(i + 1);
+ i = path.lastIndexOf(".");
+ String extension = (i == -1) ? "" : path.substring(i + 1);
+ String contentType = getContentType(extension);
+
+ if(!validatePath(filepath)) {
+ if(s_logger.isInfoEnabled())
+ s_logger.info("Resource access is forbidden, uri: " + path);
+
+ t.sendResponseHeaders(403, -1); // forbidden
+ return;
+ }
+
+ File f = new File ("./" + filepath);
+ if(f.exists()) {
+ long lastModified = f.lastModified();
+ String ifModifiedSince = t.getRequestHeaders().getFirst("If-Modified-Since");
+ if (ifModifiedSince != null) {
+ long d = Date.parse(ifModifiedSince);
+ if (d + 1000 >= lastModified) {
+ Headers hds = t.getResponseHeaders();
+ hds.set("Content-Type", contentType);
+ t.sendResponseHeaders(304, -1);
+
+ if(s_logger.isInfoEnabled())
+ s_logger.info("Sent 304 file has not been " +
+ "modified since " + ifModifiedSince);
+ return;
+ }
+ }
+
+ long length = f.length();
+ Headers hds = t.getResponseHeaders();
+ hds.set("Content-Type", contentType);
+ hds.set("Last-Modified", new Date(lastModified).toGMTString());
+ t.sendResponseHeaders(200, length);
+ responseFileContent(t, f);
+
+ if(s_logger.isInfoEnabled())
+ s_logger.info("Sent file " + path + " with content type " + contentType);
+ } else {
+ if(s_logger.isInfoEnabled())
+ s_logger.info("file does not exist" + path);
+ t.sendResponseHeaders(404, -1);
+ }
+ }
+
+ private static String getContentType(String extension) {
+ String key = extension.toLowerCase();
+ if(s_mimeTypes.containsKey(key)) {
+ return s_mimeTypes.get(key);
+ }
+ return "application/octet-stream";
+ }
+
+ private static void responseFileContent(HttpExchange t, File f) throws Exception {
+ OutputStream os = t.getResponseBody();
+ FileInputStream fis = new FileInputStream(f);
+ while (true) {
+ byte[] b = new byte[8192];
+ int n = fis.read(b);
+ if (n < 0) {
+ break;
+ }
+ os.write(b, 0, n);
+ }
+ fis.close();
+ os.close();
+ }
+
+ private static boolean validatePath(String path) {
+ int i = path.indexOf("/");
+ if(i == -1) {
+ if(s_logger.isInfoEnabled())
+ s_logger.info("Invalid resource path: can not start at resource root");
+ return false;
+ }
+
+ if(path.contains("..")) {
+ if(s_logger.isInfoEnabled())
+ s_logger.info("Invalid resource path: contains relative up-level navigation");
+
+ return false;
+ }
+
+ return isValidResourceFolder(path.substring(0, i));
+ }
+
+ private static boolean isValidResourceFolder(String name) {
+ return s_validResourceFolders.containsKey(name);
+ }
+}