Implementation notes
History
Ystok-URI is based on
- uri.lisp from
portableaserve, Jochen Schmidt;
- uri.cl, Franz, Inc.
- puri, a well-known portable follower
of the above two, which does not support percent-encoding/decoding.
Implementation details
- URIs are represented by instances of a Common Lisp structure type.
- Percent-encoding and decoding are supported for all components.
The path and query parts are first split into elements
then decoded.
- By default, all component (except uri-string cache) are stored percent-decoded.
Use cautiously if you overwrite this default behavior!
- Decoded userinfo is stored in plist with indicators :user and :password.
- The print-object never outputs the password.
- On changing any "public" component slot via setf, the following internal
cache slots are not cleared automatically:
%parsed-path% - should be affected by (setf uri-path),
string - should be affected by (setf uri-any_slot) except password.
You must invoke clear-cache explicitly.
- Query
- when decoded, query is always stored parsed as an alist of the form:
((parameter . value) ...),
- the *query-char-p* special and query-char-p key parameter allow more
(national) characters to be accepted not percent-encoded inside a query part.
- Fragment
- the empty string is accepted as a fragment if # is present;
- the *fragment-char-p* special and fragment-char-p key parameter allow more
(national) characters to be accepted not percent-encoded inside a fragment part.
Compatibility notes
- A completely empty URI is represented as "#".
In contrast, Franz and PURI implementations replace an empty URI by "/".
- As a URI object is represented as a structure (not a CLOS object),
its slot accessors are ordinary (not generic!) functions.
Unsupported features
- URN.
- Interning URI.