1 ;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10; Package: wol -*-
2 ;;;; *************************************************************************
3 ;;;; FILE IDENTIFICATION
6 ;;;; Purpose: URI functions for wol
7 ;;;; Programmer: Kevin M. Rosenberg
8 ;;;; Date Started: July 2003
10 ;;;; $Id: uri.lisp,v 1.5 2003/08/08 09:03:45 kevin Exp $
12 ;;;; This file and Wol are Copyright (c) 2003 by Kevin M. Rosenberg
13 ;;;; *************************************************************************
18 (defun request-decompile-uri (req ent)
19 "returns (VALUE PAGE PLIST QUERY-ALIST)"
20 (multiple-value-bind (page plists query)
21 (decode-url (puri:uri-path (request-raw-uri req)))
23 (setf (request-page req) (base-page-name page ent)))
25 (setf (request-plist req) (car plists))
26 (setf (request-next-plists req) (cdr plists))
28 (awhen (getf (request-plist req) :page)
29 (setf (request-page req) it))))
30 (setf (request-uri-query req) query))
36 (defun base-page-name (page ent)
37 "Return the base page name for a html url"
38 (let ((len-prefix (length (project-prefix (entity-project ent)))))
39 (assert (>= (length page) len-prefix))
40 (string-strip-ending (subseq page len-prefix)
43 (defun split-plist-url (url)
44 (string-delimited-string-to-list url +plist-header+))
46 (defun decode-url (url)
47 "Decode raw url. Returns (values `<pagename>.html' list-of-plists query)"
49 (qsplit (delimited-string-to-list url #\?))
51 (split (split-plist-url (car qsplit)))
53 (when (and (plusp (length (car split)))
54 (not (string= +full-asp-header+ (car split)))
55 (not (string-starts-with +full-asp-header+ (car split))))
57 (dolist (elem (cdr split))
58 (push (url-string-to-plist elem) plists))
59 (values page-name (nreverse plists) query)))
64 (defun make-html-url (page ent &optional query-args)
65 (make-url (concatenate 'string page ".html")
66 :base-dir (project-prefix
68 :vars query-args :format :xhtml))
71 (defun make-wol-url (page ent &optional plist)
72 (let ((url-plist (append (list :page page) plist))
73 (prefix (project-prefix (entity-project ent))))
75 (concatenate 'string prefix page ".lsp")
79 (concatenate 'string +plist-header+
80 (plist-to-url-string url-plist))))))
85 (defun plist-to-url-string (plist &key (base64 t))
86 (let ((str (plist-to-compressed-string plist)))
88 (string-to-base64-string str :uri t)
89 (escape-uri-field str))))
91 (defun url-string-to-plist (str &key (base64 t))
92 (let ((decode (if base64
93 (base64-string-to-string str :uri t)
94 (unescape-uri-field str))))
96 (ignore-errors (compressed-string-to-plist decode)))))
98 (defun plist-to-compressed-string (plist)
99 "Decode an encoded plist"
100 (assert (evenp (length plist)))
102 (list plist (cddr list)))
104 (prin1-to-string (nreverse output)))
105 (push (compress-elem (car list)) output)
106 (push (cadr list) output)))
108 (defun compress-elem (elem)
109 "Encode a plist elem"
133 (defun compressed-string-to-plist (encoded-str)
134 (let ((encoded (ignore-errors (read-from-string encoded-str)))
137 (cmsg "invalid encoded string")
139 (gen-invalid-encoded-str encoded-str)
141 (assert (evenp (length encoded)))
142 (do* ((elist encoded (cddr elist)))
143 ((null elist) (nreverse output))
144 (push (decompress-elem (car elist)) output)
145 (push (cadr elist) output))))
147 (defun decompress-elem (elem)
158 ;; For posting to lookup-func1