;;;; Programmer: Kevin M. Rosenberg
;;;; Date Started: July 2003
;;;;
-;;;; $Id: project.lisp,v 1.3 2003/07/18 21:34:18 kevin Exp $
+;;;; $Id: project.lisp,v 1.7 2003/08/08 09:03:45 kevin Exp $
;;;;
;;;; This file and Wol are Copyright (c) 2001-2003 by Kevin M. Rosenberg
;;;; *************************************************************************
(sessions t) (session-lifetime 18000)
(reap-interval 300) server
(connector :modlisp))
-
(unless server
(setq server
(ecase connector
(make-instance 'http-request
:method (net.aserve:request-method as-req)
;;:host (net.aserve:request-host as-req)
- :raw-uri (net.uri:render-uri
- (net.aserve:request-raw-uri as-req)
- nil)
- :uri (net.uri:render-uri
- (net.aserve:request-uri as-req)
- nil)
+ :raw-uri (puri:intern-uri
+ (net.uri:render-uri
+ (net.aserve:request-raw-uri as-req) nil))
+ :uri (puri:intern-uri
+ (net.uri:render-uri
+ (net.aserve:request-uri as-req) nil))
:protocol (net.aserve:request-protocol as-req)
:protocol-string
(net.aserve:request-protocol-string as-req)
(let ((req
(make-instance 'http-request
:host (header-value command :host)
- :raw-uri (header-value command :url)
- :uri (create-uri (header-value command :host)
- (awhen (header-value
- command :server-ip-port)
- (parse-integer it))
- (header-value command :url))
- :protocol (ensure-keyword (header-value command :server-protocol))
+ :raw-uri (aif (ignore-errors
+ (puri:intern-uri (header-value command :url)))
+ it
+ (header-value command :url))
+ :uri (aif (ignore-errors
+ (puri:intern-uri (command->uri command)))
+ it
+ (command->uri command))
+ :protocol (ensure-keyword
+ (header-value command :server-protocol))
:protocol-string (header-value command :server-protocol)
:method (ensure-keyword (header-value command :method))
:posted-content (header-value command :posted-content)
(defun header-slot-value (req slot)
(header-value (request-headers req) slot))
-(defun create-uri (host port page)
- (format nil "http://~A:~D~A" host port page))
+(defun command->uri (command)
+ (format nil "http://~A:~D~A"
+ (header-value command :host)
+ (header-value command :server-ip-port)
+ (header-value command :url)))
(defun is-index-request (req ent)
- (string= (request-raw-uri req)
+ (string= (puri:uri-path (request-raw-uri req))
(project-prefix (entity-project ent))))
-(defun redirect-entity (page ent)
- (redirect-to-location
- (format nil "~A~A" (project-prefix (entity-project ent)) page)))
+(defun redirect-entity (page req ent &optional plist)
+ (let ((proj (entity-project ent))
+ (url (make-wol-url page ent plist)))
+ (ecase (project-connector proj)
+ (:aserve
+ (net.aserve:with-http-response
+ ((aserve-request req)
+ (entity-aserve-entity ent)
+ :response net.aserve:*response-moved-permanently*)
+ (net.aserve:with-http-body
+ ((aserve-request req)
+ (entity-aserve-entity ent)
+ :headers `((:location . ,url))))))
+ (:modlisp
+ (redirect-to-location url)))))
(defun dispatch-request (req ent)
(let ((proj (entity-project ent)))
(if (is-index-request req ent)
- (redirect-entity (project-index proj) ent)
+ (redirect-entity (project-index proj) req ent)
(progn
(request-decompile-uri req ent)
(compute-session req ent)
(defun request-matches-prefix (req prefix)
"Returns project if request matches project"
- (string-starts-with prefix (request-raw-uri req)))
+ (string-starts-with prefix (puri:uri-path (request-raw-uri req))))
(defun dispatch-to-handler (req ent)
(let ((next-page (funcall handler req ent)))
(typecase next-page
(string
- (redirect-entity next-page ent))
+ (redirect-entity next-page req ent))
+ (cons
+ (redirect-entity (car next-page) req ent (cadr next-page)))
(null
t)
(t
(defun wol-version-string ()
(format nil "~{~D~^.~}" *wol-version*))
-
+
+(defun alist-key->keyword (alist)
+ (loop for a in alist
+ collect (cons (kmrcl:ensure-keyword (car a)) (cdr a))))
+
(defun request-query (req &key (uri t) (post t))
- (append
- (when (and uri (request-uri-query req))
- (aif (request-query-alist req)
- it
- (setf (request-query-alist req)
- (query-to-alist (request-uri-query req)))))
- (when (and post (request-posted-content req))
- (query-to-alist (request-posted-content req)))))
+ (aif (aserve-request req)
+ (alist-key->keyword
+ (net.aserve:request-query it :uri uri :post post))
+ (let ((desired (cons uri post)))
+ (if (equal desired (request-desired-query req))
+ ;; Same desired as cached
+ (request-query-alist req)
+ (progn
+ (setf (request-desired-query req) desired)
+ (setf (request-query-alist req)
+ (append
+ (when (and uri (request-uri-query req))
+ (query-to-alist (request-uri-query req)))
+ (when (and post (request-posted-content req))
+ (query-to-alist (request-posted-content req))))))))))
(defun request-query-value (key req &key (uri t) (post t))
- (cdr (assoc key (request-query req :uri uri :post post)
- :test 'equal)))
+ (aif (aserve-request req)
+ (net.aserve:request-query-value (string key) it :uri uri :post post)
+ (cdr (assoc key (request-query req :uri uri :post post)
+ :test 'equal))))
(defun websession-variable (ws name)
(when ws
(defmacro with-wol-page ((req ent
+ &key (format :html) (precompute t) headers)
+ &body body)
+ `(ecase (project-connector (entity-project ,ent))
+ (:aserve
+ (net.aserve:with-http-response
+ ((aserve-request ,req)
+ (entity-aserve-entity ,ent)
+ :content-type (ml::format-string ,format))
+ (net.aserve:with-http-body
+ ((aserve-request ,req)
+ (entity-aserve-entity ,ent)
+ :headers ,headers)
+ (let ((*html-stream* net.html.generator:*html-stream*))
+ ,@body))))
+ (:modlisp
+ (%with-wol-page (,req ,ent :format ,format :precompute ,precompute
+ :headers ,headers)
+ ,@body))))
+
+
+(defmacro %with-wol-page ((req ent
&key (format :html) (precompute t) headers)
&body body)
+ (declare (ignore req ent))
(let ((fmt (gensym "FMT-"))
(precomp (gensym "PRE-"))
(result (gensym "RES-"))
(:body
(:h1 "Not Found")
(:p "The request for "
- (:b (:write-string (request-uri req)))
+ (:b (:write-string (render-uri (request-uri req) nil)))
" was not found on this server.")
(:hr)
(:div (:i "WOL "