explicity show port number (thanks to Philipp Marek)
+cl-puri (1:1.5.7.2-1) unstable; urgency=medium
+
+ * Add support for square brackets around IPv6 addresses to
+ explicity show port number (thanks to Philipp Marek)
+
+ -- Kevin M. Rosenberg <kmr@debian.org> Tue, 29 Sep 2020 15:55:37 +0000
+
cl-puri (1:1.5.7.1-1) unstable; urgency=medium
* Rework test suite for newer versions of ASDF
cl-puri (1:1.5.7.1-1) unstable; urgency=medium
* Rework test suite for newer versions of ASDF
#:uri-host #:uri-port
#:uri-path
#:uri-query
#:uri-host #:uri-port
#:uri-path
#:uri-query
#:uri-fragment
#:uri-plist
#:uri-authority ; pseudo-slot accessor
#:uri-fragment
#:uri-plist
#:uri-authority ; pseudo-slot accessor
:initarg :parsed-path
:initform nil
:accessor .uri-parsed-path)
:initarg :parsed-path
:initform nil
:accessor .uri-parsed-path)
+ (is-ip6
+ :initarg :is-ip6
+ :initform nil
+ :accessor uri-is-ip6)
(hashcode
;; cached sxhash, so we don't have to compute it more than once.
:initarg :hashcode :initform nil :accessor uri-hashcode)))
(hashcode
;; cached sxhash, so we don't have to compute it more than once.
:initarg :hashcode :initform nil :accessor uri-hashcode)))
#\Rubout ;; (code-char #x7f)
;; `unwise':
#\{ #\} #\| #\\ #\^ #\[ #\] #\`))
#\Rubout ;; (code-char #x7f)
;; `unwise':
#\{ #\} #\| #\\ #\^ #\[ #\] #\`))
- "Excluded charcters from RFC2369 (http://www.ietf.org/rfc/rfc2396.txt 2.4.3)")
+ "Excluded charcters from RFC2396 (http://www.ietf.org/rfc/rfc2396.txt 2.4.3)")
(defun reserved-char-vector (chars &key except)
(do* ((a (make-array 128 :element-type 'bit :initial-element 0))
(defun reserved-char-vector (chars &key except)
(do* ((a (make-array 128 :element-type 'bit :initial-element 0))
(append *excluded-characters* '(#\& #\~ #\/ #\?))))
(defparameter *illegal-characters*
(append *excluded-characters* '(#\& #\~ #\/ #\?))))
(defparameter *illegal-characters*
- (reserved-char-vector (remove #\# *excluded-characters*)))
+ (reserved-char-vector (set-difference *excluded-characters*
+ '(#\# #\[ #\]))))
(defparameter *strict-illegal-query-characters*
(reserved-char-vector (append '(#\?) (remove #\# *excluded-characters*))))
(defparameter *illegal-query-characters*
(reserved-char-vector
*excluded-characters* :except '(#\^ #\| #\#)))
(defparameter *strict-illegal-query-characters*
(reserved-char-vector (append '(#\?) (remove #\# *excluded-characters*))))
(defparameter *illegal-query-characters*
(reserved-char-vector
*excluded-characters* :except '(#\^ #\| #\#)))
+(defparameter *valid-ip6-characters*
+ (reserved-char-vector
+ '#.(nconc (gen-char-range-list #\a #\f)
+ (gen-char-range-list #\A #\F)
+ (gen-char-range-list #\0 #\9)
+ '(#\: #\]))))
+
(defun parse-uri (thing &key (class 'uri) &aux escape)
(when (uri-p thing) (return-from parse-uri thing))
(setq escape (escape-p thing))
(defun parse-uri (thing &key (class 'uri) &aux escape)
(when (uri-p thing) (return-from parse-uri thing))
(setq escape (escape-p thing))
- (multiple-value-bind (scheme host port path query fragment)
+ (multiple-value-bind (scheme host port path query fragment is-ip6)
(parse-uri-string thing)
(when scheme
(setq scheme
(parse-uri-string thing)
(when scheme
(setq scheme
(make-instance 'uri
:scheme scheme
:host host
(make-instance 'uri
:scheme scheme
:host host
:port port
:path path
:query query
:port port
:path path
:query query
(make-instance class
:scheme scheme
:host host
(make-instance class
:scheme scheme
:host host
:port port
:path path
:query query
:port port
:path path
:query query
;; simulating:
;; ^(([^:/?#]+):)?
;; (//([^/?#]*))?
;; simulating:
;; ^(([^:/?#]+):)?
;; (//([^/?#]*))?
+ ;; May include a []-pair for ipv6
;; ([^?#]*)
;; (\?([^#]*))?
;; (#(.*))?
;; ([^?#]*)
;; (\?([^#]*))?
;; (#(.*))?
(tokval nil)
(scheme nil)
(host nil)
(tokval nil)
(scheme nil)
(host nil)
(port nil)
(path-components '())
(query nil)
(port nil)
(path-components '())
(query nil)
(#\? (return :question))
(#\# (return :hash))))
(:query (case c (#\# (return :hash))))
(#\? (return :question))
(#\# (return :hash))))
(:query (case c (#\# (return :hash))))
+ (:ip6 (case c
+ (#\] (return :close-bracket))))
(:rest)
(t (case c
(#\: (return :colon))
(#\? (return :question))
(:rest)
(t (case c
(#\: (return :colon))
(#\? (return :question))
+ (#\[ (return :open-bracket))
+ (#\] (return :close-bracket))
(#\# (return :hash))
(#\/ (return :slash)))))
(incf start)))
(#\# (return :hash))
(#\/ (return :slash)))))
(incf start)))
(setq state 6))
(:end (push "/" path-components)
(setq state 9))))
(setq state 6))
(:end (push "/" path-components)
(setq state 9))))
+ (66 ;; seen [<scheme>:]//[
+ (ecase (read-token :ip6 *valid-ip6-characters*)
+ (:string (setq host tokval)
+ (setq is-ip6 t)
+ (setq state 67))))
+ (67 ;; seen [<scheme>:]//[ip6]
+ (ecase (read-token t)
+ (:close-bracket (setq state 11))))
(4 ;; seen [<scheme>:]//
(ecase (read-token t)
(:colon (failure))
(:question (failure))
(:hash (failure))
(4 ;; seen [<scheme>:]//
(ecase (read-token t)
(:colon (failure))
(:question (failure))
(:hash (failure))
+ (:open-bracket (setq state 66))
(:slash
(if* (and (equalp "file" scheme)
(null host))
(:slash
(if* (and (equalp "file" scheme)
(null host))
(values
scheme host port
(apply #'concatenate 'string (nreverse path-components))
(values
scheme host port
(apply #'concatenate 'string (nreverse path-components))
+ query fragment is-ip6)))
;; URN parsing:
(15 ;; seen urn:, read nid now
(case (read-token :colon *valid-nid-characters*)
;; URN parsing:
(15 ;; seen urn:, read nid now
(case (read-token :colon *valid-nid-characters*)
(setf (uri-string uri)
(let ((scheme (uri-scheme uri))
(host (uri-host uri))
(setf (uri-string uri)
(let ((scheme (uri-scheme uri))
(host (uri-host uri))
+ (is-ip6 (uri-is-ip6 uri))
(port (uri-port uri))
(path (uri-path uri))
(query (uri-query uri))
(port (uri-port uri))
(path (uri-path uri))
(query (uri-query uri))
*reserved-characters* escape))
(when scheme ":")
(when (or host (eq :file scheme)) "//")
*reserved-characters* escape))
(when scheme ":")
(when (or host (eq :file scheme)) "//")
(when host
(encode-escaped-encoding
host *reserved-authority-characters* escape))
(when host
(encode-escaped-encoding
host *reserved-authority-characters* escape))
(when port ":")
(when port
#-allegro (format nil "~D" port)
(when port ":")
(when port
#-allegro (format nil "~D" port)