From 5b681c40455d3619afb96a8335a94cd2a411e0c6 Mon Sep 17 00:00:00 2001 From: "Kevin M. Rosenberg" Date: Fri, 15 Aug 2003 14:05:41 +0000 Subject: [PATCH] r5504: *** empty log message *** --- classes.lisp | 10 ++-- tests.lisp | 89 ++++++++++++++++++++++++++++++----- uri.lisp | 129 +++++++++++++++++++++++++++++++++------------------ 3 files changed, 167 insertions(+), 61 deletions(-) diff --git a/classes.lisp b/classes.lisp index 766fce0..27d1654 100644 --- a/classes.lisp +++ b/classes.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: July 2003 ;;;; -;;;; $Id: classes.lisp,v 1.8 2003/08/10 17:56:44 kevin Exp $ +;;;; $Id: classes.lisp,v 1.9 2003/08/15 14:04:57 kevin Exp $ ;;;; ;;;; This file and Wol are Copyright (c) 2001-2003 by Kevin M. Rosenberg ;;;; ************************************************************************* @@ -89,11 +89,11 @@ (defvar *active-projects* (make-hash-table :test 'equal)) -(defvar +asp-header+ "lsp") -(defvar +full-asp-header+ "/lsp") +(eval-when (:compile-toplevel :load-toplevel :execute) + (defvar +plist-header+ "sdata" + "string that starts an encoded plist")) -(defvar +plist-header+ "/sdata" - "string that starts an encoded plist") +(defconstant +plist-header-length+ (length +plist-header+)) (defparameter *wol-version* '(0 1 0)) diff --git a/tests.lisp b/tests.lisp index c2f91ea..d1b2d21 100644 --- a/tests.lisp +++ b/tests.lisp @@ -2,7 +2,7 @@ ;;;; ************************************************************************* ;;;; FILE IDENTIFICATION ;;;; -;;;; Id: $Id: tests.lisp,v 1.3 2003/08/10 17:56:44 kevin Exp $ +;;;; Id: $Id: tests.lisp,v 1.4 2003/08/15 14:04:57 kevin Exp $ ;;;; Purpose: Self Test suite for WOL ;;;; ;;;; ************************************************************************* @@ -25,53 +25,118 @@ ;; Keyed URL Tests (defclass test-keyed-url (test-case) - ((req :accessor req))) + ((req :accessor req) + (ent :accessor ent))) (defmethod set-up ((self test-keyed-url)) (let ((uri (parse-uri "/~abcdefg~/index.html"))) (setf (req self) (make-instance 'wol::http-request :raw-uri uri :decoded-uri-path (render-uri uri nil) - :uri uri)))) + :uri uri)) + (setf (ent self) (make-instance 'wol::entity + :project (make-instance 'wol::wol-project + :project-prefix "/"))))) (def-test-method test-returned-session ((self test-keyed-url) :run nil) - (assert-equal "abcdefg" (req-recode-uri-sans-session-id (req self)))) + (assert-equal "abcdefg" (req-recode-uri-sans-session-id (req self) + (ent self)))) (def-test-method test-recomputed-uri ((self test-keyed-url) :run nil) - (req-recode-uri-sans-session-id (req self)) + (req-recode-uri-sans-session-id (req self) (ent self)) (assert-equal (render-uri (request-uri (req self)) nil) "/index.html")) (def-test-method test-decoded-uri ((self test-keyed-url) :run nil) - (req-recode-uri-sans-session-id (req self)) + (req-recode-uri-sans-session-id (req self) (ent self)) (assert-equal (request-decoded-uri-path (req self)) "/index.html")) + +(defclass test-keyed-url-2 (test-case) + ((req :accessor req) + (ent :accessor ent))) + +(defmethod set-up ((self test-keyed-url-2)) + (let ((uri (parse-uri "/app/~abcdefg~/index.html"))) + (setf (req self) (make-instance 'wol::http-request + :raw-uri uri + :decoded-uri-path (render-uri uri nil) + :uri uri)) + (setf (ent self) (make-instance 'wol::entity + :project (make-instance 'wol::wol-project + :project-prefix "/app/"))))) + +(def-test-method test-returned-session ((self test-keyed-url-2) :run nil) + (assert-equal "abcdefg" (req-recode-uri-sans-session-id (req self) + (ent self)))) + +(def-test-method test-recomputed-uri ((self test-keyed-url-2) :run nil) + (req-recode-uri-sans-session-id (req self) (ent self)) + (assert-equal (render-uri (request-uri (req self)) nil) + "/app/index.html")) + +(def-test-method test-decoded-uri ((self test-keyed-url-2) :run nil) + (req-recode-uri-sans-session-id (req self) (ent self)) + (assert-equal (request-decoded-uri-path (req self)) + "/app/index.html")) + ;;; Non-keyed URL tests (defclass test-non-keyed-url (test-case) - ((req :accessor req))) + ((req :accessor req) + (ent :accessor ent))) (defmethod set-up ((self test-non-keyed-url)) (let ((uri (parse-uri "/index.html"))) (setf (req self) (make-instance 'wol::http-request :raw-uri uri :decoded-uri-path (render-uri uri nil) - :uri uri)))) + :uri uri)) + (setf (ent self) (make-instance 'wol::entity + :project (make-instance 'wol::wol-project + :project-prefix "/"))))) (def-test-method test-returned-session ((self test-non-keyed-url) :run nil) - (assert-false (req-recode-uri-sans-session-id (req self)))) + (assert-false (req-recode-uri-sans-session-id (req self) (ent self)))) (def-test-method test-recomputed-uri ((self test-non-keyed-url) :run nil) - (req-recode-uri-sans-session-id (req self)) + (req-recode-uri-sans-session-id (req self) (ent self)) (assert-equal (render-uri (request-uri (req self)) nil) "/index.html")) (def-test-method test-decoded-uri ((self test-non-keyed-url) :run nil) - (req-recode-uri-sans-session-id (req self)) + (req-recode-uri-sans-session-id (req self) (ent self)) (assert-equal (request-decoded-uri-path (req self)) "/index.html")) +(defclass test-non-keyed-url-2 (test-case) + ((req :accessor req) + (ent :accessor ent))) + +(defmethod set-up ((self test-non-keyed-url-2)) + (let ((uri (parse-uri "/app1/index.html"))) + (setf (req self) (make-instance 'wol::http-request + :raw-uri uri + :decoded-uri-path (render-uri uri nil) + :uri uri)) + (setf (ent self) (make-instance 'wol::entity + :project (make-instance 'wol::wol-project + :project-prefix "/app1/"))))) + +(def-test-method test-returned-session ((self test-non-keyed-url-2) :run nil) + (assert-false (req-recode-uri-sans-session-id (req self) (ent self)))) + +(def-test-method test-recomputed-uri ((self test-non-keyed-url-2) :run nil) + (req-recode-uri-sans-session-id (req self) (ent self)) + (assert-equal (render-uri (request-uri (req self)) nil) + "/app1/index.html")) + +(def-test-method test-decoded-uri ((self test-non-keyed-url-2) :run nil) + (req-recode-uri-sans-session-id (req self) (ent self)) + (assert-equal (request-decoded-uri-path (req self)) + "/app1/index.html")) + ;;; Test server (defclass test-server (test-case) @@ -299,7 +364,9 @@ (defparameter *all-tests* (make-instance 'all-tests)) (add-test *all-tests* (get-suite test-keyed-url)) +(add-test *all-tests* (get-suite test-keyed-url-2)) (add-test *all-tests* (get-suite test-non-keyed-url)) +(add-test *all-tests* (get-suite test-non-keyed-url-2)) (add-test *all-tests* (get-suite test-server)) (add-test *all-tests* (get-suite test-two-projects)) (add-test *all-tests* (get-suite test-sessions)) diff --git a/uri.lisp b/uri.lisp index 76eab37..751684d 100644 --- a/uri.lisp +++ b/uri.lisp @@ -7,27 +7,46 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: July 2003 ;;;; -;;;; $Id: uri.lisp,v 1.10 2003/08/10 17:56:44 kevin Exp $ +;;;; $Id: uri.lisp,v 1.11 2003/08/15 14:04:57 kevin Exp $ ;;;; ;;;; This file and Wol are Copyright (c) 2003 by Kevin M. Rosenberg ;;;; ************************************************************************* (in-package #:wol) -(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) - (net.aserve:get-cookie-values it) - (loop for h in (request-headers req) +(defun path->session-id (path ent) + "Returns session-id,remainder-path" + (let ((prefix (project-prefix (entity-project ent)))) + (when (and (> (length path) (length prefix)) + (string= prefix (subseq path 0 (length prefix)))) + (let ((sans-prefix (subseq path (length prefix)))) + (when (char= #\~ (schar sans-prefix 0)) + (let* ((len (length sans-prefix)) + (next-tilde (position-char #\~ sans-prefix 1 len)) + (next-slash (position-char #\/ sans-prefix 1 len))) + (when (and next-tilde next-slash + (< next-tilde next-slash)) + (values + (subseq sans-prefix 0 (1+ next-tilde)) + (subseq sans-prefix (1+ next-tilde)))))))))) + + +(defun req-recode-uri-sans-session-id (req ent) + (multiple-value-bind (raw-session-id remainder) + (path->session-id (request-decoded-uri-path req) ent) + (when raw-session-id + (let ((new-path (concatenate 'string (project-prefix + (entity-project ent)) + (subseq remainder 1)))) + (setf (uri-path (request-uri req)) new-path) + (setf (uri-path (request-raw-uri req)) new-path) + (setf (request-decoded-uri-path req) new-path)) + (raw-session-id->session-id raw-session-id)))) + + (defun request-cookies (req) + (aif (aserve-request req) + (net.aserve:get-cookie-values it) + (loop for h in (request-headers req) when (eq :cookie (car h)) collect (cdr h)))) @@ -47,50 +66,71 @@ (let ((name (project-name (entity-project ent)))) (cdr (assoc name cookies :test #'string-equal)))) +(defun entity-project-prefix-string (ent) + (let ((prefix (project-prefix (entity-project ent)))) + (if (= 1 (length prefix)) + "" + (subseq prefix 1 (1- (length prefix)))))) + (defun compute-uris (req ent) "Compute URI's of a request" - (let ((url-session-id (req-recode-uri-sans-session-id req))) - (compute-session req ent url-session-id) + (let* ((url-session-id (req-recode-uri-sans-session-id req ent)) + (uri (request-raw-uri req)) + (ppath (puri:uri-parsed-path uri)) + (prefix-string (entity-project-prefix-string ent))) + + (assert (eq (first ppath) :absolute)) + + (cond + ((zerop (length prefix-string)) + ;; strip :absolute + (setq ppath (cdr ppath))) + ((string-equal (second ppath) (entity-project-prefix-string ent)) + (setq ppath (cddr ppath))) + (t + (warn "Non-prefix path ~S" ppath) + (return-from compute-uris nil))) - (multiple-value-bind (page plists query) - (decode-url (puri:uri-path (request-raw-uri req))) + (compute-session req ent url-session-id) + (multiple-value-bind (page plists) (decode-url ppath) (when page - (setf (request-page req) (base-page-name page ent))) + (setf (request-page req) (base-page-name page))) (when plists - (setf (request-url-plist req) (car plists)) - (setf (request-url-next-plists req) (cdr plists)) - (when (null page) - (awhen (getf (request-url-plist req) :page) - (setf (request-page req) it)))) - (setf (request-uri-query req) query)))) - + (setf (request-url-plist req) (car plists)) + (setf (request-url-next-plists req) (cdr plists)) + (when (null page) + (awhen (getf (request-url-plist req) :page) + (setf (request-page req) it)))) + (setf (request-uri-query req) (puri:uri-query uri))))) + ;;; URI Functions -(defun base-page-name (page ent) +(defun base-page-name (page) "Return the base page name for a html url" - (let ((len-prefix (length (project-prefix (entity-project ent))))) - (assert (>= (length page) len-prefix)) - (string-strip-ending (subseq page len-prefix) - '(".html" ".lsp")))) + (string-strip-ending page '(".html" ".lsp"))) (defun split-plist-url (url) (string-delimited-string-to-list url +plist-header+)) -(defun decode-url (url) +(defun is-plist-header (str) + (string= +plist-header+ (subseq str 0 +plist-header-length+))) + +(defun decode-url (ppath) "Decode raw url. Returns (values `.html' list-of-plists query)" + (when (is-raw-session-id (car ppath)) + (setq ppath (cdr ppath))) (let* ((plists '()) - (qsplit (delimited-string-to-list url #\?)) - (query (cadr qsplit)) - (split (split-plist-url (car qsplit))) - (page-name - (when (and (plusp (length (car split))) - (not (string= +full-asp-header+ (car split))) - (not (string-starts-with +full-asp-header+ (car split)))) - (car split)))) - (dolist (elem (cdr split)) - (push (url-string-to-plist elem) plists)) - (values page-name (nreverse plists) query))) + (page-name (unless (is-plist-header (car ppath)) + (prog1 + (car ppath) + (setq ppath (cdr ppath)))))) + (dolist (elem ppath) + (if (is-plist-header elem) + (push (url-string-to-plist (subseq elem +plist-header-length+)) + plists) + (warn "Non plist header found in url ~S" elem))) + (values page-name (nreverse plists)))) @@ -108,7 +148,6 @@ (if (null plist) (concatenate 'string page ".html") (concatenate 'string - +asp-header+ (concatenate 'string +plist-header+ (plist-to-url-string url-plist))))))) -- 2.34.1