CLOVER🍀

That was when it all began.

Undertowで遊んでみる

こちらで紹介された、Undertowが面白そうだったので、久々にClojureで書くことを兼ねて遊んでみました。

WildFly の Web 基盤、Undertow の紹介
http://emamotor.blogspot.jp/2013/12/introduction-undertow.html

Undertow
http://undertow.io/

紹介されていた内容を、ScalaClojureで、かつスクリプト形式で移植。

Scala(scalas)

Scalaは、scalasを使ってやります。scalasって何?な方は、こちらへ。

http://d.hatena.ne.jp/Kazuhira/20130425/1366901339

書いたコードは、こちら。
HelloWorldServer.scala

#!/usr/bin/env scalas

/***
scalaVersion := "2.10.3"

libraryDependencies += "io.undertow" % "undertow-core" % "1.0.0.Beta27"
*/

import io.undertow.Undertow
import io.undertow.server.{HttpHandler, HttpServerExchange}
import io.undertow.util.Headers

val server =
  Undertow
    .builder
    .addListener(8080, "localhost")
    .setHandler(new HttpHandler {
      @throws(classOf[Exception])
      override def handleRequest(exchange: HttpServerExchange): Unit = {
        exchange.getResponseHeaders.put(Headers.CONTENT_TYPE, "text/plain")
        exchange.getResponseSender.send("Hello World")
      }
    })
    .build

server.start()
println("HelloWorldServer is running!")

実行するには、スクリプトに実行権限を付与してください。

$ chmod a+x HelloWorldServer.scala

実行。

$ ./HelloWorldServer.scala

ちなみに、相変わらずこのscalasの実行形態は重たいです。

Clojure(lein-exec)

Clojureは、lein-execプラグインで。lein-execプラグインが何?って方は、こちらへ。

http://d.hatena.ne.jp/Kazuhira/20130820/1377006828

hello-world-server.clj

(require '[leiningen.exec :as exec])

(exec/deps '[[io.undertow/undertow-core "1.0.0.Beta27"]])

(ns hello-world-server
  (:import (io.undertow Undertow)
           (io.undertow.server HttpHandler HttpServerExchange)
           (io.undertow.util Headers)))

(let [^Undertow server (-> (Undertow/builder)
                           (.addListener 8080 "localhost")
                           (.setHandler
                            (proxy [HttpHandler] []
                              (handleRequest [^HttpServerExchange exchange]
                                (-> (. exchange getResponseHeaders)
                                    (.put (Headers/CONTENT_TYPE) "text/plain"))
                                (-> (. exchange getResponseSender)
                                    (.send "Hello World")))))
                           (.build))]
  (. server start)
  (println "HelloWorldServer is running!")
  (read-line))

Clojureでやると、プログラムが終わってしまうのでread-lineで止めました…。Enterを打つと、終了します。

こちらは、実行権限の付与はいりません。実行。

$ lein exec hello-world-server.clj

ScalaClojureいずれの場合も

$ curl localhost:8080
Hello World

という確認結果になります。…そりゃあそうですが。

ホントは、以下にあるServletのサンプルも書こうと思ったのですけど。

https://github.com/undertow-io/undertow/tree/master/examples/src/main/java/io/undertow/examples/servlet

scalasでやると、トップレベルのClassが作れないのでインナークラスのデフォルトコンストラクタができなくて動かず、Clojureスクリプト型式までは動かすところまでちょっと辿り着かなかったので、ここまでで。

こういうライブラリというかサーバフレームワークみたいなものも、いろいろ遊んでみたいんですけどねぇ。ちょっと深堀りするところまでは、今は手が回りそうにないかなぁ…。