Commit3e594802Recorded25 Mar 2026Repositorysigil-youtube

Remove local url-encode-value and build-query-string, import from (sigil http)

Message

Sub-modules now import build-query-string directly from (sigil http) instead of re-exporting through (youtube). Test updated for uppercase hex encoding (%3D vs %3d) which is RFC 3986 compliant.

Changed
 src/youtube.sgl           | 40 +---------------------------------------
 src/youtube/analytics.sgl |  1 +
 src/youtube/live.sgl      |  1 +
 src/youtube/playlist.sgl  |  1 +
 src/youtube/upload.sgl    |  1 +
 test/youtube-test.sgl     |  3 ++-
 6 files changed, 7 insertions(+), 40 deletions(-)
Diff
src/youtube.sglmodified
@@ -15,6 +15,7 @@
15
(sigil string)
16
(sigil struct)
17
(sigil json)
+18
(only (sigil http) url-encode-value build-query-string)
19
(sigil http client))
20
21
(export ;; Client
@@ -54,8 +55,6 @@
55
youtube-post/json
56
youtube-put/json
57
youtube-delete/json
−57
url-encode-value
−58
build-query-string
58
check-youtube-response
59
60
;; Parsing
@@ -119,43 +118,6 @@
118
(apply string-append (youtube-client-upload-url client)
119
(map (lambda (p) (string-append "/" p)) parts)))
120
−122
;; No shared url-encode exists in sigil-http (known gap).
−123
(define (url-encode-value s)
−124
(let ((len (string-length s)))
−125
(let loop ((i 0) (acc '()))
−126
(if (>= i len)
−127
(list->string (reverse acc))
−128
(let ((c (string-ref s i)))
−129
(cond
−130
((or (char-alphabetic? c)
−131
(char-numeric? c)
−132
(char=? c #\-)
−133
(char=? c #\_)
−134
(char=? c #\.)
−135
(char=? c #\~))
−136
(loop (+ i 1) (cons c acc)))
−137
((char=? c #\space)
−138
(loop (+ i 1) (cons #\+ acc)))
−139
(else
−140
(let ((n (char->integer c)))
−141
(loop (+ i 1)
−142
(append (reverse (string->list
−143
(string-append "%"
−144
(if (< n 16) "0" "")
−145
(number->string n 16))))
−146
acc))))))))))
−147
−148
;;; Pairs with #f values are omitted.
−149
(define (build-query-string params)
−150
(let ((parts (filter (lambda (p) (cdr p)) params)))
−151
(if (null? parts)
−152
""
−153
(string-append "?"
−154
(string-join
−155
(map (lambda (p)
−156
(string-append (car p) "=" (url-encode-value (cdr p))))
−157
parts)
−158
"&")))))
121
122
;;; Append api-key to query params if client has one and no access-token.
123
(define (maybe-add-api-key client params)
src/youtube/analytics.sglmodified
@@ -15,6 +15,7 @@
15
(sigil dict)
16
(sigil string)
17
(sigil json)
+18
(only (sigil http) build-query-string)
19
(sigil http client)
20
(youtube))
21
src/youtube/live.sglmodified
@@ -13,6 +13,7 @@
13
(sigil string)
14
(sigil struct)
15
(sigil json)
+16
(only (sigil http) build-query-string)
17
(sigil http client)
18
(youtube))
19
src/youtube/playlist.sglmodified
@@ -13,6 +13,7 @@
13
(sigil string)
14
(sigil struct)
15
(sigil json)
+16
(only (sigil http) build-query-string)
17
(sigil http client)
18
(youtube))
19
src/youtube/upload.sglmodified
@@ -13,6 +13,7 @@
13
(sigil string)
14
(sigil struct)
15
(sigil json)
+16
(only (sigil http) build-query-string)
17
(sigil http client)
18
(youtube))
19
test/youtube-test.sglmodified
@@ -9,6 +9,7 @@
9
(sigil struct)
10
(sigil json)
11
(sigil test)
+12
(only (sigil http request) url-encode-value build-query-string)
13
(youtube))
14
15
;; ---------------------------------------------------------------
@@ -225,7 +226,7 @@
226
(assert-equal "foo%26bar" (url-encode-value "foo&bar")))
227
228
(test "encode equals sign"
−228
(assert-equal "key%3dvalue" (url-encode-value "key=value")))
+229
(assert-equal "key%3Dvalue" (url-encode-value "key=value")))
230
231
(test "preserve unreserved characters"
232
(assert-equal "a-b_c.d~e" (url-encode-value "a-b_c.d~e"))))