;;;; Programmer: Kevin M. Rosenberg
;;;; Date Started: July 2003
;;;;
-;;;; $Id: uri.lisp,v 1.6 2003/08/08 23:40:13 kevin Exp $
+;;;; $Id: uri.lisp,v 1.9 2003/08/10 07:38:37 kevin Exp $
;;;;
;;;; This file and Wol are Copyright (c) 2003 by Kevin M. Rosenberg
;;;; *************************************************************************
(in-package #:wol)
-(defun uri->recode-uri-sans-session-id (uri)
- (let ((parsed-path (puri:uri-parsed-path uri)))
- (cond
- ((and (eq :absolute (first parsed-path))
- (is-raw-session-id (second parsed-path)))
- (values (copy-uri uri :place t
- :parsed-path
- (list* :absolute (cddr parsed-path)))
- (raw-session-id->session-id (second parsed-path))))
- (t
- (values uri nil)))))
+(defun req-recode-uri-sans-session-id (req)
+ (let ((ppath (puri:uri-parsed-path (request-uri req))))
+ (when (is-raw-session-id (second ppath))
+ (let ((new-path (list* (car ppath) (cddr ppath))))
+ (setf (uri-parsed-path (request-uri req)) new-path)
+ (setf (uri-parsed-path (request-raw-uri req)) new-path))
+ (setf (request-decoded-uri-path req)
+ (uridecode-string (uri-path (request-raw-uri req))))
+ (raw-session-id->session-id (second ppath)))))
(defun request-cookies (req)
(aif (aserve-request req)
when (eq :cookie (car h))
collect (cdr h))))
+(defun header-lines-matching (key headers)
+ (loop for hdr in headers
+ when (eq key (car hdr))
+ collect (cdr hdr)))
+
+(defun set-cookies-in-headers (headers)
+ (header-lines-matching :set-cookie headers))
+
+(defun cookies-in-headers (headers)
+ (header-lines-matching :cookie headers))
+
(defun cookie-session-key (ent cookies)
+ "Return the session key from the alist of cookies"
(let ((name (project-name (entity-project ent))))
(cdr (assoc name cookies :test #'string-equal))))
-(defun url-session-key (url)
- "Return a session key encoded in a URL"
- nil)
-
(defun compute-uris (req ent)
"Compute URI's of a request"
- (compute-session req ent)
- (multiple-value-bind (page plists query)
- (decode-url (puri:uri-path (request-raw-uri req)))
- (when page
- (setf (request-page req) (base-page-name page ent)))
- (when plists
- (setf (request-plist req) (car plists))
- (setf (request-next-plists req) (cdr plists))
- (when (null page)
- (awhen (getf (request-plist req) :page)
- (setf (request-page req) it))))
- (setf (request-uri-query req) query)))
+ (let ((url-session-id (req-recode-uri-sans-session-id req)))
+ (compute-session req ent url-session-id)
+
+ (multiple-value-bind (page plists query)
+ (decode-url (puri:uri-path (request-raw-uri req)))
+ (when page
+ (setf (request-page req) (base-page-name page ent)))
+ (when plists
+ (setf (request-plist req) (car plists))
+ (setf (request-next-plists req) (cdr plists))
+ (when (null page)
+ (awhen (getf (request-plist req) :page)
+ (setf (request-page req) it))))
+ (setf (request-uri-query req) query))))
;;; URI Functions
(url-plist (append (list :page page) plist))
(prefix (project-prefix (entity-project ent))))
(concatenate 'string
+ prefix
(if (and session
(websession-key session)
- (eq :url (websession-method session)))
- (format nil "/~~~A~~/" (websession-key session))
+ (not (eq :cookies (websession-method session))))
+ (format nil "~~~A~~/" (websession-key session))
"")
- prefix
(if (null plist)
(concatenate 'string page ".html")
(concatenate 'string
(let ((str (plist-to-compressed-string plist)))
(if base64
(string-to-base64-string str :uri t)
- (escape-uri-field str))))
+ (uriencode-string str))))
(defun url-string-to-plist (str &key (base64 t))
(let ((decode (if base64
(base64-string-to-string str :uri t)
- (unescape-uri-field str))))
+ (uridecode-string str))))
(when decode
(ignore-errors (compressed-string-to-plist decode)))))
(prin1-to-string (nreverse output)))
(push (compress-elem (car list)) output)
(push (cadr list) output)))
+
(defun compress-elem (elem)
"Encode a plist elem"
(push (cadr elist) output))))
(defun decompress-elem (elem)
- (case elem
- (:N :next-page)
- (:T :posted)
- (:O :object-id)
- (:S :session-id)
- (:L :lang)
- (:G :logged)
- (:C :caller)
- (:D :db)
-
- ;; For posting to lookup-func1
- (:F :func)
- (:K :key)
- (:B :subobjects)
- (:A :labels)
- (:E :english-only)
- (:R :format)
-
- (:X :xml)
- (:P :page)
+ (if (> (length (symbol-name elem)) 1)
+ elem
+ (case (char-upcase (schar (symbol-name elem ) 0))
+ (#\N :next-page)
+ (#\T :posted)
+ (#\O :object-id)
+ (#\S :session-id)
+ (#\L :lang)
+ (#\G :logged)
+ (#\C :caller)
+ (#\D :db)
+
+ ;; For posting to lookup-func1
+ (#\F :func)
+ (#\K :key)
+ (#\B :subobjects)
+ (#\A :labels)
+ (#\E :english-only)
+ (#\R :format)
+
+ (#\X :xml)
+ (#\P :page)
+
+ (otherwise elem))))
+
+
+
+
- (otherwise elem)))