(= baseops* (table)) (extend respond (req) (baseops* req!op) (it req)) ; TODO using one of srv's defop etc. should wipe name in baseops* (mac defop-base (name . body) (w/uniq request `(do (wipe (srvops* ',name) (redirector* ',name)) (= (baseops* ',name) (fn (,request) (w/req ,request ,@body)))))) (def cook (k v (o persistent)) (push (list k v persistent) req!cookies-to-set)) (def rmcook (k) (push k req!cookies-to-remove)) (def pr-cookies () (each cook req!cookies-to-set (whenlet (k v (o persistent)) cook (pr "Set-Cookie: " k "=" v) (when persistent (pr "; expires=Sun, 17-Jan-2038 19:14:07 GMT")) (prn))) (each k req!cookies-to-remove (prn "Set-Cookie: " k "=; expires=Thu, 01 Jan 1970 00:00:00 GMT"))) (def html-content () (prn header*) (pr-cookies) (prn)) (def redirect (url) (prn rdheader*) (pr-cookies) (prn "Location: " url) (prn)) (= bfnurl* "/b") (defop-base b (aif (fns* (sym (arg "fnid"))) (it) (redirect "deadlink"))) (mac baform (f . body) `(tag (form method 'post action bfnurl*) (fnid-field (fnid ,f)) ,@body)) (def bflink (f) (string bfnurl* "?fnid=" (fnid f))) (mac w/blink (expr . body) `(tag (a href (bflink (fn () ,expr))) ,@body)) (mac onblink (text . body) `(w/blink (do ,@body) (pr ,text)))
Arc’s srv defines
defop | outputs a text/html content type |
defop-raw | outputs a text/html content type, and allows additional headers to be added |
defopr | outputs a redirect |
defopr-raw | outputs a redirect, and allows additional headers to be added |
with associated derived definitions such as w/link
, w/rlink
, aform
, arform
, and so on.
This hack defines a defop-base
which outputs no headers at all. The op can then choose whether to output an HTML page or a redirect, or to issue a redirect while also setting a cookie, etc.
(defop-base show (if (authorized) (do (html-content) (whitepage (pr "The secret is: foo"))) (do (cook "login-return" "show") (redirect "/login"))))
The request object is passed implicitly in a base op, which avoids having to pass req
through to the utility functions like html-content
, cook
, and redirect
.
This hack depends on arc3.1, extend0, implicitreq0, and srv-misc1.
Using the hackinator:
$ hack \ ycombinator.com/arc/arc3.1.tar \ awwx.ws/defarc0.patch \ awwx.ws/defarc-ac0.patch \ awwx.ws/extend0.arc \ awwx.ws/scheme0.arc \ awwx.ws/defvar1.patch \ awwx.ws/defvar2.arc \ awwx.ws/implicit2.arc \ awwx.ws/implicitreq0.arc \ awwx.ws/srv-misc1.arc \ awwx.ws/baseop1.arc
Same as Arc.