branch: elpa/hyperdrive
commit 736f2e9d0303686b06a820568113fcc56766bf23
Author: Joseph Turner <[email protected]>
Commit: Joseph Turner <[email protected]>
Change: (hyperdrive--fill) Check writability based on Allow header
This change involves setting the default value of the hyperdrive
writablep slot to unknown, a breaking change which may require that
users clear their persisted value for hyperdrive-hyperdrives.
---
hyperdrive-lib.el | 20 +++++++++++---------
1 file changed, 11 insertions(+), 9 deletions(-)
diff --git a/hyperdrive-lib.el b/hyperdrive-lib.el
index 211e8f1cb0..1243277a2d 100644
--- a/hyperdrive-lib.el
+++ b/hyperdrive-lib.el
@@ -77,7 +77,7 @@ Passes ARGS to `format-message'."
"Represents a hyperdrive."
(public-key nil :documentation "Hyperdrive's public key.")
(seed nil :documentation "Seed (always and only present for writable
hyperdrives).")
- (writablep nil :documentation "Whether the drive is writable.")
+ (writablep 'unknown :documentation "Whether the drive is writable.")
(petname nil :documentation "Petname.")
;; TODO: Where to invalidate old domains?
(domains nil :documentation "List of DNSLink domains which resolve to the
drive's public-key.")
@@ -402,12 +402,6 @@ When a writable ENTRY is not found and CREATEP is non-nil,
create
a new buffer for ENTRY."
(declare (indent defun))
;; TODO: Add `find-file'-like interface. See
<https://todo.sr.ht/~ushin/ushin/16>
- ;; TODO: When possible, check whether drive is writable with a HEAD request,
and set writablep in the
- ;; struct. If the hyperdrive already exists in hyperdrive-hyperdrives,
there's no need to send a HEAD
- ;; request, since the value will never change. We only need to send a HEAD
request when calling
- ;; `hyperdrive-open-url' on an unknown URL. Since `hyperdrive-complete-url'
only returns a URL, we'll
- ;; need to parse the URL and then call `gethash' (or refactor
`hyperdrive-complete-url').
- ;; See: <https://github.com/RangerMauve/hypercore-fetch/issues/60>.
(implemented)
;; FIXME: Some of the synchronous filling functions we've added now cause
this to be blocking,
;; which is very noticeable when a file can't be loaded from the gateway and
eventually times out.
(let ((hyperdrive (hyperdrive-entry-hyperdrive entry)))
@@ -532,19 +526,27 @@ The following ENTRY slots are filled:
The following ENTRY hyperdrive slots are filled:
- public-key
+- writablep (when headers include Allow)
- domains (merged with current persisted value)
Returns filled ENTRY."
(pcase-let* (((cl-struct hyperdrive-entry hyperdrive) entry)
- ((map link content-length content-type etag last-modified)
headers)
+ ((cl-struct hyperdrive writablep domains) hyperdrive)
+ ((map link content-length content-type etag last-modified
allow) headers)
;; If URL hostname was a DNSLink domain, entry doesn't yet have
a public-key slot.
(public-key (progn
(string-match hyperdrive--public-key-re link)
(match-string 1 link)))
(persisted-hyperdrive (gethash public-key
hyperdrive-hyperdrives))
- (domain (car (hyperdrive-domains hyperdrive))))
+ (domain (car domains)))
(when last-modified
(setf last-modified (encode-time (parse-time-string last-modified))))
+ (when (and allow (eq 'unknown writablep))
+ (setf (hyperdrive-writablep hyperdrive) (pcase-exhaustive allow
+ ;; TODO: The Allow header
array is
+ ;; serialized. Why isn't it an
alist?
+ ("HEAD,GET,PUT,DELETE" t)
+ ("HEAD,GET" nil))))
(setf (hyperdrive-entry-size entry) (when content-length
(ignore-errors
(cl-parse-integer content-length)))