読者です 読者をやめる 読者になる 読者になる

JavaScriptで作るWebサーバ

JavaScriptでWebサーバを作るといっても、Rhinoです。
きしださんとこにあったコードの単なるJavaScript化ですが。
Javaがインストールされていれば、以下のテキストファイル一つで簡易的なWebサーバになってしまうわけです。

webserver.js

importClass(com.sun.net.httpserver.HttpExchange);
importClass(com.sun.net.httpserver.HttpHandler);
importClass(com.sun.net.httpserver.HttpServer);
importClass(java.io.File);
importClass(java.io.IOException);
importClass(java.io.InputStream);
importClass(java.io.OutputStream);
importClass(java.io.PrintWriter);
importClass(java.net.InetSocketAddress);
importClass(java.util.HashMap);
importClass(java.util.Map);

var PORT = 8081;
var DOCUMENT_ROOT = "C:\\";

var contentTypes = new HashMap();
contentTypes.put("html", "text/html");
contentTypes.put("jpg", "image/jpeg");
contentTypes.put("png", "image/png");
contentTypes.put("gif", "image/gif");
contentTypes.put("css", "text/css");
contentTypes.put("js", "text/javascript");

var root = new File(DOCUMENT_ROOT);

var server = HttpServer.create(new InetSocketAddress("localhost", PORT), 0);

server.createContext("/", new HttpHandler({
    handle : function(he) {
        var path = he.getRequestURI().getPath();
        var f = new File(root, path);
        if(!f.exists()){
            //ファイルがない
            he.sendResponseHeaders(404, 0);
            sendMessage(he.getResponseBody(), "not found.");
            return;
        }
        if(f.isDirectory()){
            var indexFile = new File(f, "index.html");
            if(!indexFile.exists()){
                he.sendResponseHeaders(403, 0);
                sendMessage(he.getResponseBody(), "fobbiden.");
                return;
            }
            f = indexFile;
        }

        var idx = path.lastIndexOf(".");
        if(idx >= 0){
            var ext = path.substring(idx + 1);
            if(contentTypes.containsKey(ext)){
                he.getResponseHeaders().add(
                        "Content-Type", contentTypes.get(ext));
            }
        }

        he.sendResponseHeaders(200, f.length());
        var is = new java.io.FileInputStream(f);
        var res = he.getResponseBody();
        var buf = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 1024);
        var len;
        while((len = is.read(buf)) >= 0){
            res.write(buf, 0, len);
        }
        res.close();
        is.close();
    }
}));

server.start();

function sendMessage(res, message) {
        var pw = new PrintWriter(res);
        pw.println(message);
        pw.close();
        res.close();
}

java.lang.Thread.currentThread().suspend();

起動は、

jrunscript -f webserver.js

上記コードの場合、

http://localhost:8081/[Cドライブ配下のパス]

で、Cドライブ配下全部さらしちゃいます。