/**
* Copyright (C) 2014 Red Hat, Inc, and individual contributors.
* Copyright (C) 2011-2012 VMware, Inc.
*/
package org.projectodd.sockjs;
import java.util.Arrays;
/**
* Handlers from sockjs-node's trans-htmlfile.coffee
*/
public class HtmlfileHandler {
private static final String IFRAME_TEMPLATE =
"<!doctype html>\n" +
"<html><head>\n" +
" <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n" +
" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n" +
"</head><body><h2>Don't panic!</h2>\n" +
" <script>\n" +
" document.domain = document.domain;\n" +
" var c = parent.{{ callback }};\n" +
" c.start();\n" +
" function p(d) {c.message(d);};\n" +
" window.onload = function() {c.stop();};\n" +
" </script>";
public DispatchFunction htmlfile = new DispatchFunction() {
@Override
public Object handle(SockJsRequest req, SockJsResponse res, Object data) throws SockJsException {
String callback = req.getQueryParameter("c");
if (callback == null) {
callback = req.getQueryParameter("callback");
}
if (callback == null) {
throw new DispatchException(500, "\"callback\" parameter required");
}
if (callback.matches("[^a-zA-Z0-9-_.]")) {
throw new DispatchException(500, "invalid \"callback\" parameter");
}
res.setHeader("Content-Type", "text/html; charset=UTF-8");
res.writeHead(200);
char[] safariPadding = new char[1024 - IFRAME_TEMPLATE.length() + 14];
Arrays.fill(safariPadding, ' ');
String iframeTemplate = IFRAME_TEMPLATE + new String(safariPadding) + "\r\n\r\n";
res.write(iframeTemplate.replace("{{ callback }}", callback));
Transport.register(req, server, new HtmlFileReceiver(req, res, server.options));
return true;
}
};
public HtmlfileHandler(SockJsServer server) {
this.server = server;
}
private SockJsServer server;
}