From 59d3ff58df9283d2cf8909a2b95d5d39d2a9961c Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Thu, 16 Jan 2014 21:56:47 -0800 Subject: [PATCH] updates --- foobar/foo.gif | Bin 0 -> 23688 bytes server.rkt | 23 ++++++++--------------- 2 files changed, 8 insertions(+), 15 deletions(-) create mode 100644 foobar/foo.gif diff --git a/foobar/foo.gif b/foobar/foo.gif new file mode 100644 index 0000000000000000000000000000000000000000..a7b2fb64ac319fd7db9157d47ecae6b8fcd65273 GIT binary patch literal 23688 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 . procedure?) - (λ(req string-arg) - (logger req) - (define filename string-arg) - (response/xexpr (route-proc (build-path PROJECT_ROOT filename))))) + (λ(req . string-args) + (logger req) + (define path (apply build-path PROJECT_ROOT (flatten string-args))) + (response/xexpr (route-proc path)))) (define-values (start url) (dispatch-rules @@ -29,19 +29,12 @@ ;; (as if the url is split on slashes into a list before matching) ;; dashboard page: works on any url of form /dir/dir/dir/poldash.html ;; todo: figure out how to use world:DASHBOARD_NAME here - [((string-arg) ... "poldash.html") (λ(req . string-args) - (logger req) - (define subdirs (flatten string-args)) - (define dir (apply build-path PROJECT_ROOT subdirs)) - (response/xexpr (route-dashboard dir)))] + [((string-arg) ... "poldash.html") (route-wrapper route-dashboard)] ;; raw viewer: works on any url of form /dir/dir/raw/name.html ;; (pattern matcher automatically takes out the "raw") - [((string-arg) ... "raw" (string-arg)) (λ(req . string-args) - (logger req) - (define path (apply build-path PROJECT_ROOT (flatten string-args))) - (response/xexpr (route-raw path)))] - [("xexpr" (string-arg)) (route-wrapper route-xexpr)] - [("html" (string-arg)) (route-wrapper route-html)] + [((string-arg) ... "raw" (string-arg)) (route-wrapper route-raw)] + [((string-arg) ... "xexpr" (string-arg)) (route-wrapper route-xexpr)] +;; [((string-arg) ... "force" (string-arg)) (route-wrapper route-force)] [else (λ(req) ;; because it's the "else" route, can't use string-arg matcher (logger req)