aws/request: Overwrite (web http)'s DEFAULT-VAL-WRITER.
authorRicardo Wurmus <rekado@elephly.net>
Tue, 7 Jul 2020 18:19:56 +0000 (20:19 +0200)
committerRicardo Wurmus <rekado@elephly.net>
Tue, 7 Jul 2020 18:19:56 +0000 (20:19 +0200)
The DEFAULT-VAL-WRITER procedure in Guile's (web http) module causes
values in headers to be quoted when they contain a semicolon.

The Authorization header that AWS expects contains a field
SignedHeaders whose value is a semicolon-separated list of header
names.  When this list is quoted AWS considers the opening quote
character to be part of the name of the first header and the closing
quote character to be part of the name of the last header.

* aws/request.scm (my-default-val-writer): New procedure; replace the
definition of DEFAULT-VAL-WRITER in Guile's (web http).

aws/request.scm

index 5773398842281206212bcac336de166bac90cf21..abaabb7127503ac4aa7e55c7f3c97760218a88c0 100644 (file)
@@ -1,5 +1,5 @@
 ;;; guile-aws --- Scheme DSL for the AWS APIs
-;;; Copyright © 2019 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2019, 2020 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; Guile-AWS is free software: you can redistribute it and/or modify
 ;;; it under the terms of the GNU General Public License as published
 (define (hexify bv)
   (format #f "~{~2,'0x~}" (bytevector->u8-list bv)))
 
+;; XXX: Guile's default-val-writer corrupts the Authorization header,
+;; because it wraps the value of the SignedHeaders field in quotes.
+;; This confuses AWS.
+(define (my-default-val-writer k val port)
+  (if (or (string-index val #\,)
+          (string-index val #\"))
+      ((@@ (web http) write-qstring) val port)
+      ((@@ (web http) put-string) port val)))
+(module-set!
+ (resolve-module '(web http))
+ 'default-val-writer my-default-val-writer)
+
 \f
 ;; See https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html
 (define* (serialize-aws-value thing #:key (path '()) n (depth 0))