Skip to content

Commit

Permalink
added simple uri parser.
Browse files Browse the repository at this point in the history
  • Loading branch information
diasbruno committed Aug 18, 2024
1 parent 17711f1 commit 39d363b
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 1 deletion.
3 changes: 2 additions & 1 deletion routing/package.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@
#:response-data
#:request-content-length
#:write-response
#:unprocessable-entity))
#:unprocessable-entity
#:parse-uri))

(in-package :wst.routing)

Expand Down
8 changes: 8 additions & 0 deletions routing/routes.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,14 @@
(setf *routes* (append *routes* (list route)))
t))

(defun parse-uri (uri)
(let* ((hash-position (or (position #\# uri) (length uri)))
(query-position (or (position #\? uri) hash-position)))
(let ((path (str:substring 0 query-position uri))
(query (str:substring (1+ query-position) hash-position uri))
(hash (str:substring (1+ hash-position) (length uri) uri)))
(values path query hash))))

(declaim (ftype (function (symbol) t)
remove-route))
(defun remove-route (name)
Expand Down
40 changes: 40 additions & 0 deletions routing/test.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -318,3 +318,43 @@
"application/s-expression"))
(5am:is (equal (response-content rs) "(1 2 3)"))
(setf wst.routing::*any-route-handler* nil)))

(5am:def-test parse-request-uri-just-path ()
(let ((uri "/a/b/c"))
(multiple-value-bind (uri query-string hash)
(wst.routing:parse-uri uri)
(5am:is (string-equal uri "/a/b/c"))
(5am:is (string-equal query-string ""))
(5am:is (string-equal hash "")))))

(5am:def-test parse-request-uri-with-just-query ()
(let ((uri "/a/b/c?ok=1"))
(multiple-value-bind (uri query-string hash)
(wst.routing:parse-uri uri)
(5am:is (string-equal uri "/a/b/c"))
(5am:is (string-equal query-string "ok=1"))
(5am:is (string-equal hash "")))))

(5am:def-test parse-request-uri-with-just-hash ()
(let ((uri "/a/b/c#anchor"))
(multiple-value-bind (uri query-string hash)
(wst.routing:parse-uri uri)
(5am:is (string-equal uri "/a/b/c"))
(5am:is (string-equal query-string ""))
(5am:is (string-equal hash "anchor")))))

(5am:def-test parse-request-uri-with-query-and-hash ()
(let ((uri "/a/b/c?ok=1#anchor"))
(multiple-value-bind (uri query-string hash)
(wst.routing:parse-uri uri)
(5am:is (string-equal uri "/a/b/c"))
(5am:is (string-equal query-string "ok=1"))
(5am:is (string-equal hash "anchor")))))

(5am:def-test parse-request-root-uri-with-query-and-hash ()
(let ((uri "/?ok=1#anchor"))
(multiple-value-bind (uri query-string hash)
(wst.routing:parse-uri uri)
(5am:is (string-equal uri "/"))
(5am:is (string-equal query-string "ok=1"))
(5am:is (string-equal hash "anchor")))))

0 comments on commit 39d363b

Please sign in to comment.