Skip to content

Instantly share code, notes, and snippets.

@rathwell
Created April 11, 2012 02:54
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rathwell/2356565 to your computer and use it in GitHub Desktop.
Save rathwell/2356565 to your computer and use it in GitHub Desktop.
Noir differences for GAE: app_servlet ns generated by lein appengine-new, and httpsession middleware for clustered environments. After running lein appengine-new, make the changes to app_servlet, and add the other 2 files to your project.
(ns my.ns.app_servlet
(:gen-class :extends javax.servlet.http.HttpServlet)
(:use [appengine-magic.servlet :only [make-servlet-service-method]]
[appengine-magic.multipart-params :only [wrap-multipart-params]])
(:require [appengine-magic.core :as gae]
[noir.util.gae :as noir-gae]
[noir.server.handler :as handler]
[my.ns.middleware.httpsession :as httpsession]))
;; custom middlewares
(handler/add-custom-middleware wrap-multipart-params)
;; load views (must manually load all routes)
(require 'my.ns.views.welcome)
;; def the ring handler (with httpsession - must also enable sessions in appengine-web.xml)
(def ring-handler
(httpsession/wrap-http-session-store
(noir-gae/gae-handler
{:session-store (httpsession/http-session-store "my-app-session")}))))
;; if you don't want sessions, the ring handler looks like:
;; (def ring-handler
;; (noir-gae/gae-handler {}))
;; def the appengine app
(gae/def-appengine-app my-site ring-handler
:war-root "/Users/me/Devel/my-app/war")
;; entry point
(defn -service [this request response]
((make-servlet-service-method my-site) this request response))
(ns my.ns.middleware.httpsession
(:import
(java.io ByteArrayInputStream ByteArrayOutputStream)
(java.io ObjectInputStream ObjectOutputStream))
(:use ring.middleware.session.store))
(declare ^:dynamic *session*)
(defn serialize [obj]
(let [bos (ByteArrayOutputStream.)]
(with-open [oos (ObjectOutputStream. bos)]
(.writeObject oos obj))
(.toByteArray bos)))
(defn deserialize [bytes]
(let [bis (ByteArrayInputStream. bytes)]
(with-open [ois (ObjectInputStream. bis)]
(.readObject ois))))
(deftype HttpSessionStore [session-key]
SessionStore
(read-session [_ _]
(let [val (.getAttribute *session* session-key)]
(if val (deserialize val) {})))
(write-session [_ key data]
(.setAttribute *session* session-key (serialize data))
key)
(delete-session [_ _]
(.removeAttribute *session* session-key)
nil))
(defn http-session-store [session-key]
(HttpSessionStore. session-key))
(defn wrap-http-session-store
[handler]
(fn [request]
(binding [*session* (.getSession (:request request))]
(handler request))))
(ns my.ns.views.welcome
(:use [noir.core :only (defpage)]))
(defpage "/welcome" []
"Welcome to Noir!")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment