diff --git a/src/gemini/gemini-parser.lisp b/src/gemini/gemini-parser.lisp index 2fba60d..f569f1a 100644 --- a/src/gemini/gemini-parser.lisp +++ b/src/gemini/gemini-parser.lisp @@ -247,8 +247,11 @@ (actual-port (if port (to-s port) (to-s +gemini-default-port+))) + (actual-host (if (iri:ipv6-address-p host) + (strcat "[" host "]") + host)) (iri (strcat scheme "://" - host ":" + actual-host ":" actual-port "/" actual-path))) (when query diff --git a/src/iri-parser.lisp b/src/iri-parser.lisp index b2d3bd7..db5f0cf 100644 --- a/src/iri-parser.lisp +++ b/src/iri-parser.lisp @@ -335,3 +335,15 @@ (defun absolute-url-p (url) (when-let ((iri (iri:iri-parse url :null-on-error t))) (not (null (uri:scheme iri))))) + +(defun ipv4-address-p (string) + (ignore-errors + (let ((bytes (mapcar #'parse-integer + (cl-ppcre:split "\\." + string)))) + (and (= (length bytes) + 4) + (every (lambda (a) (<= 0 a 255)) bytes))))) + +(defun ipv6-address-p (string) + (cl-ppcre:scan ":" string)) diff --git a/src/package.lisp b/src/package.lisp index 5d3a99b..e6ed1f5 100644 --- a/src/package.lisp +++ b/src/package.lisp @@ -676,7 +676,9 @@ :render-iri :make-iri :iri-parse - :absolute-url-p)) + :absolute-url-p + :ipv4-address-p + :ipv6-address-p)) (defpackage :x509 (:use