gooφ is a Gopher implementation written in Clojure. It comes with the following features:
The library can be installed from Clojars:
A Gopher request is represented as a map. It has the following keys:
The routing module checks whether a path from the request map matches a pattern and evaluates the corresponding body upon success.
(use 'goophi.core)
(use 'goophi.routing)
(use 'goophi.response)
;; construct request map for testing purposes
(defn- ->request
[path]
{:path path})
(def hello-world
(route
"*"
[]
(menu-entity (info "hello world"))))
(print-text-stream (hello-world (->request "/")))
-> ihello world fake (NULL) 0
-> .
Placeholders can also be used, which are bound to vars.
(def route-with-vars
(route
"/blog/articles/:category"
[category]
(menu-entity (info (str "Articles from category " category)))))
(print-text-stream (route-with-vars (->request "/blog/articles/programming")))
-> iArticles from category programming fake (NULL) 0
-> .
gooφ has a built-in filesystem module with gophermap support.
(use 'goophi.fs)
(def fs-example
(route
"*"
[:as req]
(get-contents "./example-pub" (:path req))))
(print-text-stream (fs-example (->request "docs/hello.txt")))
-> |\__/,| (`\
-> _.|o o |_ ) )
-> -(((---(((--------
-> .
URLs are displayed on an HTML redirection page.
(use 'goophi.redirect)
(def redirect-example
(route
"URL\\:*"
[:as req]
(if-let [url (selector->url (:path req))]
(redirect url)
(menu-entity (info "Not found.")))))
(print-text-stream
(redirect-example (->request "URL:https://dixieflatline.de")))
-> <!DOCTYPE html> ...
Build Aleph compatible request handlers with the tcp module.
(require '[aleph.tcp :as tcp]
'[goophi.tcp :refer [aleph-handler]])
(def my-routes
(routes
("*"
[:as req]
(or (get-contents "./example-pub" (:path req))
(menu-entity (info "Not found."))))))
(tcp/start-server
(aleph-handler my-routes)
{:port 70})
Read or change the request map by composing a custom request handler.
(defn log-request
[handler]
(fn [req]
(printf "address: %s, path: %s\n"
(:remote-addr req)
(:path req))
(flush)
(handler req)))
(def my-app
(-> my-routes
log-request))
(def s (tcp/start-server
(aleph-handler my-app)
{:port 70}))
Can you improve this documentation?Edit on GitHub
cljdoc is a website building & hosting documentation for Clojure/Script libraries
× close