From 0a26e42b6f271bad2a95330d4de24334b5ce69c6 Mon Sep 17 00:00:00 2001 From: Jaidyn Ann <10477760+JadedCtrl@users.noreply.github.com> Date: Tue, 28 May 2024 23:12:36 -0500 Subject: [PATCH] Fix URL-encoding issue with port-numbers :80 and :443 would be redundantly added to HTTP and HTTPS URLs, respectively. --- src/mirror-img.lisp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/mirror-img.lisp b/src/mirror-img.lisp index 587453c..52b7544 100644 --- a/src/mirror-img.lisp +++ b/src/mirror-img.lisp @@ -151,10 +151,10 @@ already set)." “https://invalid.tld/dad alive.jpg” → “https://invalid.tld/dad%20alive.jpg”" (let ((uri (quri:uri uri))) (format nil "~@[~A://~]~A~@[:~A~]~A" - (quri:uri-scheme uri) - (quri:uri-host uri) - (quri:uri-port uri) - (url-encode-path (quri:uri-path uri))))) + (quri:uri-scheme uri) + (quri:uri-host uri) + (uri-explicit-port uri) + (url-encode-path (quri:uri-path uri))))) ;; string → string (defun url-encode-path (path) @@ -166,3 +166,15 @@ already set)." (lambda (a b) (format nil "~A/~A" a b)) (mapcar #'quri:url-encode path-parts)))) + +;; quri-uri → number +(defun uri-explicit-port (uri) + "Given a HTTP/HTTPS URI, return a port-number if it isn’t implied by the protocol. +That is, 443 is implied by HTTPS, so nil is returned; but 998 wouldn’t be implied." + (let ((scheme (quri:uri-scheme uri)) + (port (quri:uri-port uri))) + (unless (or (and (equal scheme "https") + (eq port 443)) + (and (equal scheme "http") + (eq port 80))) + port)))