Build AWS with bundled jerbuild dependencies
ober
0cc31bead444e95244bb6db4cd79665f9c0b2b78
--- 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")) --- 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) --- 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) --- 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) --- 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) --- 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 --- 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) --- 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.