Build AWS with bundled jerbuild dependencies

ober

0cc31bead444e95244bb6db4cd79665f9c0b2b78

diff --git a/.jerbuild b/.jerbuild
index 1d416ca..e17a594 100644
--- a/.jerbuild
+++ b/.jerbuild
@@ -2,10 +2,8 @@
 
 (entry "aws.ss")
 (output "jerboa-aws")
-(requires "cc" "OpenSSL headers/libs" "../chez-https/src" "../chez-ssl/src")
-(notes "Uses chez-https plus the chez-ssl C shim. jerboa-native-rs and DuckDB are not required.")
-(libdirs "lib"
-         "../chez-https/src"
-         "../chez-ssl/src")
-(extra-sources "../chez-ssl/chez_ssl_shim.c")
-(extra-ldflags "-lssl" "-lcrypto")
+(requires "cc" "cargo")
+(notes "Uses the jerbuild-bundled jerboa-native-rs crate for Rustls HTTPS.")
+(libdirs "lib")
+(rust-crates
+  ("@bundle/jerboa-native-rs/Cargo.toml" features: "tls"))
diff --git a/lib/jerboa-aws/api.sls b/lib/jerboa-aws/api.sls
index 20ac315..00ee973 100644
--- a/lib/jerboa-aws/api.sls
+++ b/lib/jerboa-aws/api.sls
@@ -12,7 +12,7 @@
 
   (import (except (chezscheme) hashtable?)
           (jerboa-aws creds)
-          (jerboa-aws crypto)
+          (except (jerboa-aws crypto) bytevector-append)
           (jerboa-aws sigv4)
           (jerboa-aws uri)
           (jerboa-aws time)
diff --git a/lib/jerboa-aws/crypto.sls b/lib/jerboa-aws/crypto.sls
index 1e62af2..44294c3 100644
--- a/lib/jerboa-aws/crypto.sls
+++ b/lib/jerboa-aws/crypto.sls
@@ -4,7 +4,7 @@
 
 (library (jerboa-aws crypto)
   (export sha256 hex-encode hmac-sha256 bytevector-append)
-  (import (chezscheme))
+  (import (except (chezscheme) bytevector-append))
 
   ;; SHA256 hash, returns bytevector
   (define (sha256 data)
diff --git a/lib/jerboa-aws/json-api.sls b/lib/jerboa-aws/json-api.sls
index 23fb495..8cefe7a 100644
--- a/lib/jerboa-aws/json-api.sls
+++ b/lib/jerboa-aws/json-api.sls
@@ -11,7 +11,7 @@
           aws-json-request aws-json-action
           AWSJsonClient AWSJsonClientError)
 
-  (import (chezscheme)
+  (import (except (chezscheme) bytevector-append)
           (jerboa-aws creds)
           (jerboa-aws crypto)
           (jerboa-aws sigv4)
diff --git a/lib/jerboa-aws/lambda/api.sls b/lib/jerboa-aws/lambda/api.sls
index ec9538c..1b27c2e 100644
--- a/lib/jerboa-aws/lambda/api.sls
+++ b/lib/jerboa-aws/lambda/api.sls
@@ -4,7 +4,7 @@
 
 (library (jerboa-aws lambda api)
   (export LambdaClient lambda-rest-request)
-  (import (chezscheme)
+  (import (except (chezscheme) bytevector-append)
           (jerboa-aws creds)
           (jerboa-aws crypto)
           (jerboa-aws sigv4)
diff --git a/lib/jerboa-aws/request.sls b/lib/jerboa-aws/request.sls
index e493915..07acddc 100644
--- a/lib/jerboa-aws/request.sls
+++ b/lib/jerboa-aws/request.sls
@@ -1,11 +1,79 @@
 #!chezscheme
-;;; (jerboa-aws request) -- HTTPS HTTP client via chez-https (native TLS)
-;;; Re-exports chez-https API for AWS API calls
+;;; (jerboa-aws request) -- HTTPS HTTP client via bundled Rustls
+;;; Re-exports the old chez-https-shaped API for AWS API calls.
 
 (library (jerboa-aws request)
   (export http-get http-post http-put http-delete http-head
           request-status request-text request-content
           request-headers request-close)
-  (import (chezscheme) (chez-https))
+  (import (chezscheme)
+          (prefix (std net request) req:))
+
+  ;; Compatibility shim for the old chez-https call shape used by the AWS
+  ;; modules: (http-post url 'headers: '(("x" :: "y")) 'data: body).
+  (define (kw-ref args key default)
+    (let loop ([xs args])
+      (cond
+        [(or (null? xs) (null? (cdr xs))) default]
+        [(eq? (car xs) key) (cadr xs)]
+        [else (loop (cddr xs))])))
+
+  (define (header-name h)
+    (if (pair? h) (car h) (error 'http-request "bad header" h)))
+
+  (define (header-value h)
+    (cond
+      [(and (pair? h)
+            (pair? (cdr h))
+            (eq? (cadr h) '::)
+            (pair? (cddr h)))
+       (caddr h)]
+      [(pair? h) (cdr h)]
+      [else (error 'http-request "bad header" h)]))
+
+  (define (normalize-header h)
+    (let ([name (header-name h)]
+          [value (header-value h)])
+      (cons name (if (string? value) value (format "~a" value)))))
+
+  (define (normalize-headers headers)
+    (let loop ([rest (or headers '())] [out '()])
+      (cond
+        [(null? rest) (reverse out)]
+        [else
+         (let ([h (normalize-header (car rest))])
+           ;; std/net/request writes Host itself; duplicate Host lines can
+           ;; change what AWS verifies against the SigV4 canonical request.
+           (loop (cdr rest)
+                 (if (and (string? (car h)) (string-ci=? (car h) "Host"))
+                   out
+                   (cons h out))))])))
+
+  (define (headers args)
+    (normalize-headers (kw-ref args 'headers: '())))
+
+  (define (data args)
+    (kw-ref args 'data: #f))
+
+  (define (http-get url . args)
+    (req:http-get url (headers args) #f))
+
+  (define (http-post url . args)
+    (req:http-post url (headers args) (data args)))
+
+  (define (http-put url . args)
+    (req:http-put url (headers args) (data args)))
+
+  (define (http-delete url . args)
+    (req:http-delete url (headers args) #f))
+
+  (define (http-head url . args)
+    (req:http-head url (headers args) #f))
+
+  (define request-status req:request-status)
+  (define request-text req:request-text)
+  (define request-content req:request-content)
+  (define request-headers req:request-headers)
+  (define request-close req:request-close)
 
   ) ;; end library
diff --git a/lib/jerboa-aws/s3/api.sls b/lib/jerboa-aws/s3/api.sls
index 7b1887c..ac40b2c 100644
--- a/lib/jerboa-aws/s3/api.sls
+++ b/lib/jerboa-aws/s3/api.sls
@@ -7,7 +7,7 @@
           s3-request s3-request/xml s3-request/check
           s3-get s3-put s3-delete s3-head)
 
-  (import (chezscheme)
+  (import (except (chezscheme) bytevector-append)
           (jerboa-aws creds)
           (jerboa-aws crypto)
           (jerboa-aws sigv4)
diff --git a/lib/jerboa-aws/sigv4.sls b/lib/jerboa-aws/sigv4.sls
index c2fb475..3f161cc 100644
--- a/lib/jerboa-aws/sigv4.sls
+++ b/lib/jerboa-aws/sigv4.sls
@@ -4,7 +4,7 @@
 (library (jerboa-aws sigv4)
   (export sigv4-sign)
 
-  (import (chezscheme)
+  (import (except (chezscheme) bytevector-append)
           (jerboa-aws crypto))
 
   ;; Sign an AWS request using SigV4.