Skip to content

Instantly share code, notes, and snippets.

@bodil
Created September 26, 2013 17:21
Show Gist options
  • Save bodil/6717477 to your computer and use it in GitHub Desktop.
Save bodil/6717477 to your computer and use it in GitHub Desktop.
Basic Webbit adapter for Ring.
(ns ring.adapter.webbit
(:require [clojure.string :as s]
[clojure.java.io :as io])
(:import [org.webbitserver WebServer WebServers HttpHandler]
[java.io File InputStream]))
(defn- transform-headers [headers]
(apply hash-map (mapcat (fn [e] [(s/lower-case (.getKey e))
(.getValue e)]) headers)))
(defn- ringify-request [req]
(let [[uri query] (s/split (.uri req) #"\?" 2)]
{:server-port 1337
:server-name "unknown" ; Webbit is not helpful here
:remote-addr (-> (.remoteAddress req)
.getAddress
.getHostAddress
str)
:uri uri
:scheme "http"
:request-method (s/lower-case (.method req))
:query-string query
:content-type (.header req "Content-Type")
:content-length (count (.body req))
:headers (transform-headers (.allHeaders req))
:body (.body req)}))
(defn- deringify-response [ring-res res]
(.status res (:status ring-res))
(doseq [[k v] (:headers ring-res)] (.header res (name k) v))
(let [body (:body ring-res)]
(cond
(string? body) (.content res body)
(seq? body) (doseq [e body] (.content res e))
(instance? File body) (.content res (slurp body))
(instance? InputStream body) (.content res (slurp body))))
(.end res))
(defn- adapt-ring-handler [ring-handler]
(reify HttpHandler
(handleHttpRequest [this req res control]
(future
(-> (ring-handler (ringify-request req))
(deringify-response res))))))
(defn run-webbit [handler {:keys [port] :or {:port 1337}}]
(-> (WebServers/createWebServer port)
(.add (adapt-ring-handler handler))
.start
.get))
(defonce running-server (atom nil))
(defn stop-webbit []
(swap! running-server #(do (when-not (nil? %1) (.get (.stop %1))) nil)))
(defn start-webbit [handler options]
(stop-webbit)
(reset! running-server (run-webbit handler options)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment