diff options
author | Kyle Meyer <kyle@kyleam.com> | 2020-09-19 00:46:38 -0400 |
---|---|---|
committer | Kyle Meyer <kyle@kyleam.com> | 2020-09-19 11:23:29 -0400 |
commit | a913c5721aeee0feca1309705ac4d5004996e073 (patch) | |
tree | f9a0bdff7fd88ebef50f972202beba6a6c4ac8a2 | |
parent | dd52b69332f077644f792b49f1ea7c58397a0e97 (diff) | |
download | piem-a913c5721aeee0feca1309705ac4d5004996e073.tar.gz |
Escape message IDs when constructing URLs
Message IDs can include characters that must escaped before being
included in the path part of public-inbox URLs. Add a variant of
url-hexify-string that uses the same set of characters as
public-inbox's mid_escape().
Message-Id: <20200919044639.26871-2-kyle@kyleam.com>
-rw-r--r-- | piem-b4.el | 2 | ||||
-rw-r--r-- | piem.el | 14 |
2 files changed, 13 insertions, 3 deletions
@@ -66,7 +66,7 @@ (mid (piem-mid)) (buffer (condition-case nil (piem-download-and-decompress - (concat url mid "/t.mbox.gz")) + (concat url (piem-escape-mid mid) "/t.mbox.gz")) (error nil)))) (with-current-buffer buffer (write-region nil nil mbox-thread)) @@ -261,7 +261,7 @@ URL should be the top-level url for the inbox. If MID is non-nil, make the match specific for that message." (rx-to-string `(and ,(piem--ensure-trailing-slash url) - (group ,(or mid + (group ,(or (and mid (piem-escape-mid mid)) '(one-or-more (not (any "/" "\n"))))) "/" (group (zero-or-one (or "raw" @@ -403,6 +403,16 @@ buffer." ;;;; Download helpers +(defconst piem--unreserved-chars + (append url-unreserved-chars + ;; These extra characters follow what's used by + ;; public-inbox's mid_escape(). + (list ?! ?$ ?& ?' ?\( ?\) ?* ?+ ?, ?= ?: ?\; ?@))) + +(defun piem-escape-mid (mid) + "Escape MID for use in path part of a public-inbox URL." + (url-hexify-string mid piem--unreserved-chars)) + (defvar piem--has-gunzip) (defun piem-check-gunzip () "Return non-nil if gunzip is available." @@ -500,7 +510,7 @@ This function depends on :url being configured for entries in (when-let ((url (concat (or (piem-inbox-get :url) (user-error "Could not find inbox URL for current buffer")) - mid + (piem-escape-mid mid) (if message-only "/raw" "/t.mbox.gz"))) (buffer (url-retrieve-synchronously url 'silent))) (unwind-protect |