bend-kit-sigv4 Releases (14): 0.11.0.1 0x450da016e4b470c8debd79963b0d016c indexed https://jend.leeeet.dev/files.txt?path=bend-kit-sigv4@0.11.0.1 0.11.0.0 0x93d9e539b1d685f3a89004f676461769 unindexed https://jend.leeeet.dev/files.txt?path=bend-kit-sigv4@0.11.0.0 0.10.0.0 0x63ab59898ee245e2de7797f7c60c56e5 unindexed https://jend.leeeet.dev/files.txt?path=bend-kit-sigv4@0.10.0.0 0.9.0.0 0x51e6e3b8d21b5c1907cbcd1c46547423 unindexed https://jend.leeeet.dev/files.txt?path=bend-kit-sigv4@0.9.0.0 0.8.0.0 0x1a01f25088652d149bb31654f4b8f483 unindexed https://jend.leeeet.dev/files.txt?path=bend-kit-sigv4@0.8.0.0 0.7.0.0 0xabdccaa8d0f5c9ed056e46070a6d0fcd unindexed https://jend.leeeet.dev/files.txt?path=bend-kit-sigv4@0.7.0.0 0.6.0.0 0x45ef2efe873a6c667f11706c0d2c8c7e unindexed https://jend.leeeet.dev/files.txt?path=bend-kit-sigv4@0.6.0.0 0.5.0.1 0x082979278a2f65cf40a99432b04fd522 unindexed https://jend.leeeet.dev/files.txt?path=bend-kit-sigv4@0.5.0.1 0.5.0.0 0x60d520324b5f16e48d172c8ae02e45ec unindexed https://jend.leeeet.dev/files.txt?path=bend-kit-sigv4@0.5.0.0 0.4.0.0 0xfdf0579efc451db8c0008cf700859d2f unindexed https://jend.leeeet.dev/files.txt?path=bend-kit-sigv4@0.4.0.0 0.3.0.1 0x4c4b00ef0a80f9d624ff3bb43f078771 unindexed https://jend.leeeet.dev/files.txt?path=bend-kit-sigv4@0.3.0.1 0.3.0.0 0x13a4c1132d1672691f192cde90ce4305 unindexed https://jend.leeeet.dev/files.txt?path=bend-kit-sigv4@0.3.0.0 0.2.0.0 0x6577a17f6f183c79beccab58756c9821 unindexed https://jend.leeeet.dev/files.txt?path=bend-kit-sigv4@0.2.0.0 0.1.0.0 0xd9e30dc59605e5bbc12885881ec50202 unindexed https://jend.leeeet.dev/files.txt?path=bend-kit-sigv4@0.1.0.0 Definitions (168, 1 to 100 shown): Sigv4.Credentials (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=Credentials) # Text (path, query, header values) is a String of code points; non-ASCII is sent as UTF-8. # S3 decodes and re-encodes wire escapes once; other services encode an escaped wire path twice. # SigV4 encoding keeps only A-Z a-z 0-9 - _ . ~ and uses uppercase %XX. # date is the x-amz-date form, YYYYMMDDTHHMMSSZ. token is "" for long-term keys. type Credentials is Data: Credentials{access: String, secret: String, token: String} Sigv4.utf8.c3 (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=utf8.c3) # Code points to UTF-8 octets, one Char per octet. acc is reversed. def utf8.c3(three: Bool, +c: U32, acc: String) -> String: Sigv4.utf8.c2 (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=utf8.c2) def utf8.c2(two: Bool, +c: U32, acc: String) -> String: Sigv4.utf8.c1 (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=utf8.c1) def utf8.c1(one: Bool, +c: U32, acc: String) -> String: Sigv4.utf8.go (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=utf8.go) def utf8.go(s: String, acc: String) -> String: Sigv4.utf8 (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=utf8) def utf8(s: String) -> String: Sigv4.encode (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=encode) # SigV4 URI encoding of text: UTF-8, then every octet but the unreserved ones as %XX. slash keeps '/'. def encode(s: String, slash: Bool) -> String: Sigv4.dec.of (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=dec.of) def dec.of(m: Maybe<&2, String>, +raw: String) -> String: Sigv4.norm (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=norm) # A wire component, re-encoded. A malformed escape stays literal, so its '%' is encoded. def norm(s: String) -> String: Sigv4.norms (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=norms) def norms(xs: List<&2, String>) -> List<&2, String>: Sigv4.wire.segs (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=wire.segs) # Non-S3 services encode the wire path a second time; '%' becomes '%25'. def wire.segs(xs: List<&2, String>) -> List<&2, String>: Sigv4.dots.seg (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=dots.seg) # Canonical URI (RFC 3986 §5.2.4 for services other than s3): "" and "." segments drop, ".." pops. def dots.seg(skip: Bool, up: Bool, +seg: String, st: List<&2, String>) -> List<&2, String>: Sigv4.dots (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=dots) def dots(xs: List<&2, String>, st: List<&2, String>) -> List<&2, String>: Sigv4.uri.slash (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=uri.slash) def uri.slash(empty: Bool, trail: Bool, +body: String) -> String: Sigv4.uri.dots (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=uri.dots) def uri.dots(+path: String) -> String: Sigv4.uri.s3 (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=uri.s3) # S3 signs the path as sent: each segment re-encoded, nothing removed. def uri.s3(empty: Bool, +path: String) -> String: Sigv4.uri.if (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=uri.if) def uri.if(s3: Bool, +path: String) -> String: Sigv4.uri (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=uri) def uri(+service: String, +path: String) -> String: Sigv4.pair (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=pair) # Canonical query: split on '&', each "k=v" (a bare "k" is "k="), re-encoded, sorted by key then value. def pair(xs: List<&2, String>) -> Sigma<&2, &2, String, _ => String>: Sigv4.pairs.if (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=pairs.if) def pairs.if(empty: Bool, +h: String, rest: List<&2, Sigma<&2, &2, String, _ => String>>) -> List<&2, Sigma<&2, &2, String, _ => String>>: Sigv4.pairs (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=pairs) def pairs(xs: List<&2, String>) -> List<&2, Sigma<&2, &2, String, _ => String>>: Sigv4.pair.le.of (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=pair.le.of) def pair.le.of(c: Cmp, av: String, bv: String) -> Bool: Sigv4.pair.le (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=pair.le) def pair.le(a: Sigma<&2, &2, String, _ => String>, b: Sigma<&2, &2, String, _ => String>) -> Bool: Sigv4.pairs.show (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=pairs.show) def pairs.show(xs: List<&2, Sigma<&2, &2, String, _ => String>>) -> List<&2, String>: Sigv4.query (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=query) def query(q: String) -> String: Sigv4.squash.if (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=squash.if) # Canonical headers: lowercase names, trimmed values with space runs squashed, sorted by name, # and a repeated name's values joined by ',' in the order given. def squash.if(space: Bool, sp: Bool, +c: U32, rest: String) -> String: Sigv4.squash (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=squash) def squash(s: String, sp: Bool) -> String: Sigv4.hdrs.low (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=hdrs.low) def hdrs.low(xs: List<&2, Sigma<&2, &2, String, _ => String>>) -> List<&2, Sigma<&2, &2, String, _ => String>>: Sigv4.name.le (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=name.le) def name.le(a: Sigma<&2, &2, String, _ => String>, b: Sigma<&2, &2, String, _ => String>) -> Bool: Sigv4.grp.if (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=grp.if) def grp.if(same: Bool, +n: String, +v: String, +pn: String, +pv: String, rest: List<&2, Sigma<&2, &2, String, _ => String>>) -> List<&2, Sigma<&2, &2, String, _ => String>>: Sigv4.grp.add (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=grp.add) def grp.add(acc: List<&2, Sigma<&2, &2, String, _ => String>>, +n: String, +v: String) -> List<&2, Sigma<&2, &2, String, _ => String>>: Sigv4.grp (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=grp) def grp(xs: List<&2, Sigma<&2, &2, String, _ => String>>, acc: List<&2, Sigma<&2, &2, String, _ => String>>) -> List<&2, Sigma<&2, &2, String, _ => String>>: Sigv4.headers (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=headers) def headers(hs: List<&2, Sigma<&2, &2, String, _ => String>>) -> List<&2, Sigma<&2, &2, String, _ => String>>: Sigv4.names (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=names) def names(xs: List<&2, Sigma<&2, &2, String, _ => String>>) -> List<&2, String>: Sigv4.lines (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=lines) def lines(xs: List<&2, Sigma<&2, &2, String, _ => String>>) -> String: Sigv4.signed (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=signed) # The SignedHeaders value for headers hs. def signed(hs: List<&2, Sigma<&2, &2, String, _ => String>>) -> String: Sigv4.canonical (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=canonical) # The canonical request. hs must hold every header to sign, host included. phash is the # payload's lowercase hex SHA-256, or "UNSIGNED-PAYLOAD". def canonical(+service: String, +method: String, +path: String, +q: String, +hs: List<&2, Sigma<&2, &2, String, _ => String>>, +phash: String) -> String: Sigv4.scope (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=scope) def scope(+date: String, +region: String, +service: String) -> String: Sigv4.to_sign (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=to_sign) # The string to sign, from the hex SHA-256 of the canonical request. def to_sign(+date: String, +scope: String, +hash: String) -> String: Sigv4.header (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=header) def header(+access: String, +scope: String, +signed: String, +sig: String) -> String: Sigv4.hex.of (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=hex.of) def hex.of(r: Result<&1, &1, U32 & String, U32 & Array>) -> Result<&1, &1, U32 & String, String>: Sigv4.sha.words (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=sha.words) # Hex SHA-256 of a byte string. def sha.words(b: Bytes.Bytes) -> IO(Result<&1, &1, U32 & String, U32 & Array>): Sigv4.sha (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=sha) def sha(+s: String) -> IO(Result<&1, &1, U32 & String, String>): Sigv4.mac.words (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=mac.words) def mac.words(+kn: U32, kb: Array, d: Bytes.Bytes) -> IO(Result<&1, &1, U32 & String, U32 & Array>): Sigv4.words (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=words) def words(b: Bytes.Bytes) -> Result<&1, &1, U32 & String, U32 & Array>: Sigv4.mac (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=mac) # HMAC-SHA256 of msg under the key k holds, or k's failure. def mac(k: Result<&1, &1, U32 & String, U32 & Array>, +msg: String) -> IO(Result<&1, &1, U32 & String, U32 & Array>): Sigv4.key (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=key) # The signing key: HMAC(HMAC(HMAC(HMAC("AWS4" + secret, day), region), service), "aws4_request"). def key(+secret: String, +day: String, +region: String, +service: String) -> IO(Result<&1, &1, U32 & String, U32 & Array>): Sigv4.signature.of (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=signature.of) def signature.of(h: Result<&1, &1, U32 & String, String>, +secret: String, +date: String, +region: String, +service: String) -> IO(Result<&1, &1, U32 & String, String>): Sigv4.signature (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=signature) # The hex signature of a canonical request. def signature(+secret: String, +date: String, +region: String, +service: String, +creq: String) -> IO(Result<&1, &1, U32 & String, String>): Sigv4.header.of (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=header.of) def header.of(r: Result<&1, &1, U32 & String, String>, +access: String, +scope: String, +signed: String) -> Result<&1, &1, U32 & String, String>: Sigv4.sign (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=sign) # The Authorization header over exactly the headers hs: the general form, for any header set. # hs must include host and x-amz-date, and x-amz-security-token for temporary credentials; # creds.token is not added here (authorize.hash adds it). Send every header in hs. def sign(creds: Credentials, +region: String, +service: String, +date: String, +method: String, +path: String, +q: String, +hs: List<&2, Sigma<&2, &2, String, _ => String>>, +phash: String) -> IO(Result<&1, &1, U32 & String, String>): Sigv4.token.hdr (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=token.hdr) def token.hdr(empty: Bool, +token: String) -> List<&2, Sigma<&2, &2, String, _ => String>>: Sigv4.authorize.hash (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=authorize.hash) # The Authorization header over host;x-amz-content-sha256;x-amz-date, plus x-amz-security-token # when creds has a token. Send those headers with these values. phash: the payload's hex # SHA-256, or "UNSIGNED-PAYLOAD". def authorize.hash(creds: Credentials, +region: String, +service: String, +date: String, +method: String, +path: String, +q: String, +host: String, +phash: String) -> IO(Result<&1, &1, U32 & String, String>): Sigv4.authorize.pair (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=authorize.pair) def authorize.pair(r: Result<&1, &1, U32 & String, String>, +phash: String) -> Result<&1, &1, U32 & String, String & String>: Sigv4.authorize.of (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=authorize.of) def authorize.of(h: Result<&1, &1, U32 & String, String>, creds: Credentials, +region: String, +service: String, +date: String, +method: String, +path: String, +q: String, +host: String) -> IO(Result<&1, &1, U32 & String, String & String>): Sigv4.authorize (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=authorize) # authorize.hash over the payload's SHA-256. Done{(authorization, x-amz-content-sha256)}. def authorize(creds: Credentials, +region: String, +service: String, +date: String, +method: String, +path: String, +q: String, +host: String, payload: Bytes.Bytes) -> IO(Result<&1, &1, U32 & String, String & String>): Sigv4.token.q (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=token.q) def token.q(empty: Bool, +token: String) -> String: Sigv4.presign.query (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=presign.query) # The query a presigned request adds to q, before X-Amz-Signature. def presign.query(+access: String, +token: String, +scope: String, +date: String, +expires: U32, +q: String) -> String: Sigv4.presign.of (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=presign.of) def presign.of(r: Result<&1, &1, U32 & String, String>, +cq: String) -> Result<&1, &1, U32 & String, String>: Sigv4.presign.go (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=presign.go) def presign.go(+creds: Credentials, +region: String, +service: String, +date: String, +method: String, +path: String, +q: String, +host: String, +expires: U32) -> IO(Result<&1, &1, U32 & String, String>): Sigv4.presign.if (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=presign.if) def presign.if(ok: Bool, +creds: Credentials, +region: String, +service: String, +date: String, +method: String, +path: String, +q: String, +host: String, +expires: U32) -> IO(Result<&1, &1, U32 & String, String>): Sigv4.presign (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=presign) # A presigned URL's query, signing host only over UNSIGNED-PAYLOAD, valid for expires seconds, # 1 to 604800 (else Fail EINVAL). Request https://{host}{path}?{result} with no auth headers. def presign(+creds: Credentials, +region: String, +service: String, +date: String, +method: String, +path: String, +q: String, +host: String, +expires: U32) -> IO(Result<&1, &1, U32 & String, String>): Sigv4.Style (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=Style) # Path: {endpoint}/{bucket}/{key}. Virtual: {bucket}.{endpoint host}/{key}. type Style is Data: Path{} Virtual{} Sigv4.Config (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=Config) # endpoint: scheme://host[:port], as https://s3.us-east-1.amazonaws.com or http://127.0.0.1:9000. Its path is ignored. type Config is Data: Config{endpoint: String, region: String, style: Style, creds: Credentials} Sigv4.Client (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=Client) type Client is Type: Client{cfg: Config, http: Hairpin.Client} Sigv4.Err (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=Err) # ErrNet: no response. ErrSign: the signer failed. ErrConfig: a bad endpoint or a missing setting. # ErrS3: any status outside 2xx, redirects included, with S3's error Code and Message ("" when there is no # error body, as for HEAD). ErrXml: a 2xx body that is not the XML asked for, with its text. type Err is Data: ErrNet{e: Hairpin.Err} ErrSign{code: U32, why: String} ErrConfig{why: String} ErrS3{status: U32, code: String, message: String} ErrXml{body: String} Sigv4.Object (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=Object) # etag keeps S3's quotes. modified is S3's ISO 8601 text. type Object is Data: Object{key: String, size: Nat, etag: String, modified: String} Sigv4.Page (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=Page) # next: the continuation token when S3 cut the listing off. type Page is Data: Page{objects: List<&2, Object>, prefixes: List<&2, String>, next: Maybe<&2, String>} Sigv4.Meta (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=Meta) # From a HEAD: Content-Length, ETag, Content-Type, and Last-Modified. type Meta is Data: Meta{size: Nat, etag: String, mime: String, modified: String} Sigv4.new (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=new) # Redirects come back as ErrS3: a signed request must not follow one. def new(cfg: Config) -> Client: Sigv4.close (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=close) def close(c: Client) -> IO(Unit): Sigv4.retry (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=retry) # Up to n more tries after a connect error, a timeout, or 408, 429, 500, 502, 503, or 504. The signature stays valid for 15 minutes. def retry(c: Client, n: U32) -> Client: Sigv4.timeout (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=timeout) def timeout(c: Client, ms: U32) -> Client: Sigv4.aws (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=aws) # AWS itself: https://s3.{region}.amazonaws.com, virtual-hosted. def aws(+region: String, creds: Credentials) -> Config: Sigv4.env (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=env) def env(r: Result<&1, &1, U32 & String, String>) -> String: Sigv4.or (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=or) def or(+a: String, b: String) -> String: Sigv4.from_env.cfg (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=from_env.cfg) def from_env.cfg(custom: Bool, +region: String, endpoint: String, creds: Credentials) -> Config: Sigv4.from_env.if (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=from_env.if) def from_env.if(missing: Bool, access: String, secret: String, token: String, region: String, +endpoint: String) -> Result<&1, &1, Err, Config>: Sigv4.from_env.of (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=from_env.of) def from_env.of(+access: String, +secret: String, token: String, region: String, endpoint: String) -> Result<&1, &1, Err, Config>: Sigv4.from_env (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=from_env) # AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN; AWS_REGION, else AWS_DEFAULT_REGION, else us-east-1; # AWS_ENDPOINT_URL_S3, else AWS_ENDPOINT_URL. A custom endpoint is path-style, as MinIO wants; AWS is virtual-hosted. def from_env() -> IO(Result<&1, &1, Err, Config>): Sigv4.Leaf (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=Leaf) # One closed element: its parent's name, its name, and its own text, entities decoded. Names drop any namespace prefix. type Leaf is Data: Leaf{parent: String, name: String, text: String} Sigv4.Lx (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=Lx) # Where the lexer is: text; after '<'; a start tag's name; its attributes, outside or in "..." or '...'; after '/' # in a start tag; an end tag's name; , after '?'; after '. type Lx is Data: LText{} LOpen{} LName{} LAttr{} LDq{} LSq{} LSelf{} … Sigv4.St (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=St) # stack: open names, innermost first. txt and nm: text and the name or entity so far, reversed. out: leaves, last first. # ok turns False at a mismatched end tag or an unknown entity. type St is Data: St{stack: List<&2, String>, txt: String, nm: String, out: List<&2, Leaf>, ok: Bool} Sigv4.first (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=first) def first(xs: List<&2, String>) -> String: Sigv4.local.go (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=local.go) def local.go(s: String, acc: String) -> String: Sigv4.local (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=local) # The name after its namespace prefix, as Key for s3:Key. def local(s: String) -> String: Sigv4.st.txt (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=st.txt) def st.txt(st: St, c: Char) -> St: Sigv4.st.nm (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=st.nm) def st.nm(st: St, c: Char) -> St: Sigv4.st.nm0 (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=st.nm0) def st.nm0(st: St) -> St: Sigv4.st.open (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=st.open) def st.open(st: St) -> St: Sigv4.st.shut (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=st.shut) def st.shut(stack: List<&2, String>, txt: String, out: List<&2, Leaf>, ok: Bool, +name: String) -> St: Sigv4.st.close (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=st.close) def st.close(st: St) -> St: Sigv4.st.close.top (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=st.close.top) def st.close.top(st: St) -> St: Sigv4.hex.digit (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=hex.digit) def hex.digit(+c: U32) -> Maybe<&2, U32>: Sigv4.hex.step (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=hex.step) def hex.step(m: Maybe<&2, U32>, +acc: U32) -> Maybe<&2, U32>: Sigv4.hex (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=hex) # ponytail: no overflow check; a reference past U+10FFFF wraps and decodes to junk rather than failing. def hex(s: String, m: Maybe<&2, U32>) -> Maybe<&2, U32>: Sigv4.ent.num (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=ent.num) def ent.num(+s: String) -> Maybe<&2, U32>: Sigv4.ent (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=ent) # The five XML entities and &#NN; / &#xHH;. None for any other. def ent(+e: String) -> Maybe<&2, U32>: Sigv4.st.ent.of (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=st.ent.of) def st.ent.of(m: Maybe<&2, U32>, st: St) -> St: Sigv4.st.ent (https://jend.leeeet.dev/definition.txt?path=bend-kit-sigv4@0.11.0.1/sigv4.bend&name=st.ent) def st.ent(st: St) -> St: More: https://jend.leeeet.dev/packages/bend-kit-sigv4.txt?definitions_offset=100