aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Ingebrigtsen2019-07-31 15:25:46 +0200
committerLars Ingebrigtsen2019-07-31 21:47:29 +0200
commitc8f1e17e6be1545557f10c3e8039e655ace6ab1c (patch)
treece71b81fb0037a5b2c970976bf2fb73d74348913
parent1ab6445bb3ed7e0ebe771692cbeda557a82b9381 (diff)
downloademacs-c8f1e17e6be1545557f10c3e8039e655ace6ab1c.tar.gz
emacs-c8f1e17e6be1545557f10c3e8039e655ace6ab1c.zip
Rewrite `url-dav-process-date-property' to use parse-time
* lisp/url/url-dav.el (url-dav-iso8601-regexp): Remove. (url-dav-process-date-property): Rewrite to use `parse-iso8601-time-string'.
-rw-r--r--lisp/url/url-dav.el67
1 files changed, 5 insertions, 62 deletions
diff --git a/lisp/url/url-dav.el b/lisp/url/url-dav.el
index a4cf0f0ec01..3159b695c14 100644
--- a/lisp/url/url-dav.el
+++ b/lisp/url/url-dav.el
@@ -33,6 +33,7 @@
33(require 'url-util) 33(require 'url-util)
34(require 'url-handlers) 34(require 'url-handlers)
35(require 'url-http) 35(require 'url-http)
36(require 'parse-time)
36 37
37(defvar url-dav-supported-protocols '(1 2) 38(defvar url-dav-supported-protocols '(1 2)
38 "List of supported DAV versions.") 39 "List of supported DAV versions.")
@@ -83,72 +84,14 @@ Returns nil if WebDAV is not supported."
83(defun url-dav-process-number-property (node) 84(defun url-dav-process-number-property (node)
84 (string-to-number (url-dav-node-text node))) 85 (string-to-number (url-dav-node-text node)))
85 86
86(defconst url-dav-iso8601-regexp
87 (let* ((dash "-?")
88 (colon ":?")
89 (4digit "\\([0-9][0-9][0-9][0-9]\\)")
90 (2digit "\\([0-9][0-9]\\)")
91 (date-fullyear 4digit)
92 (date-month 2digit)
93 (date-mday 2digit)
94 (time-hour 2digit)
95 (time-minute 2digit)
96 (time-second 2digit)
97 (time-secfrac "\\(\\.[0-9]+\\)?")
98 (time-numoffset (concat "[-+]\\(" time-hour "\\):" time-minute))
99 (time-offset (concat "Z" time-numoffset))
100 (partial-time (concat time-hour colon time-minute colon time-second
101 time-secfrac))
102 (full-date (concat date-fullyear dash date-month dash date-mday))
103 (full-time (concat partial-time time-offset))
104 (date-time (concat full-date "T" full-time)))
105 (list (concat "^" full-date)
106 (concat "T" partial-time)
107 (concat "Z" time-numoffset)))
108 "List of regular expressions matching ISO 8601 dates.
1091st regular expression matches the date.
1102nd regular expression matches the time.
1113rd regular expression matches the (optional) timezone specification.")
112
113(defun url-dav-process-date-property (node) 87(defun url-dav-process-date-property (node)
114 (require 'parse-time) 88 (let* ((date-string (url-dav-node-text node))
115 (let* ((date-re (nth 0 url-dav-iso8601-regexp)) 89 (time (parse-iso8601-time-string date-string)))
116 (time-re (nth 1 url-dav-iso8601-regexp))
117 (tz-re (nth 2 url-dav-iso8601-regexp))
118 (date-string (url-dav-node-text node))
119 re-start
120 time seconds minute hour fractional-seconds
121 day month year day-of-week dst tz)
122 ;; We need to populate 'time' with
123 ;; (SEC MIN HOUR DAY MON YEAR DOW DST TZ)
124
125 ;; Nobody else handles iso8601 correctly, let's do it ourselves.
126 (when (string-match date-re date-string re-start)
127 (setq year (string-to-number (match-string 1 date-string))
128 month (string-to-number (match-string 2 date-string))
129 day (string-to-number (match-string 3 date-string))
130 re-start (match-end 0))
131 (when (string-match time-re date-string re-start)
132 (setq hour (string-to-number (match-string 1 date-string))
133 minute (string-to-number (match-string 2 date-string))
134 seconds (string-to-number (match-string 3 date-string))
135 fractional-seconds (string-to-number (or
136 (match-string 4 date-string)
137 "0"))
138 re-start (match-end 0))
139 (when (string-match tz-re date-string re-start)
140 (setq tz (match-string 1 date-string)))
141 (url-debug 'dav "Parsed iso8601%s date" (if tz "tz" ""))
142 (setq time (list seconds minute hour day month year day-of-week dst tz))))
143
144 ;; Fall back to having Gnus do fancy things for us.
145 (when (not time)
146 (setq time (parse-time-string date-string)))
147
148 (if time 90 (if time
149 (setq time (encode-time time)) 91 (setq time (encode-time time))
150 (url-debug 'dav "Unable to decode date (%S) (%s)" 92 (url-debug 'dav "Unable to decode date (%S) (%s)"
151 (xml-node-name node) date-string)) 93 (xml-node-name node)
94 date-string))
152 time)) 95 time))
153 96
154(defun url-dav-process-boolean-property (node) 97(defun url-dav-process-boolean-property (node)