Created
September 26, 2013 17:21
-
-
Save bodil/6717477 to your computer and use it in GitHub Desktop.
Basic Webbit adapter for Ring.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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