summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyle Meyer <kyle@kyleam.com>2020-09-19 00:46:38 -0400
committerKyle Meyer <kyle@kyleam.com>2020-09-19 11:23:29 -0400
commita913c5721aeee0feca1309705ac4d5004996e073 (patch)
treef9a0bdff7fd88ebef50f972202beba6a6c4ac8a2
parentdd52b69332f077644f792b49f1ea7c58397a0e97 (diff)
downloadpiem-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.el2
-rw-r--r--piem.el14
2 files changed, 13 insertions, 3 deletions
diff --git a/piem-b4.el b/piem-b4.el
index b77d111..596e563 100644
--- a/piem-b4.el
+++ b/piem-b4.el
@@ -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))
diff --git a/piem.el b/piem.el
index dd2b30e..7c6ca6f 100644
--- a/piem.el
+++ b/piem.el
@@ -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