Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-httpclient

Named HTTP clients for Pudu: a client factory, delegating handlers, pooled keep-alive connections, handler lifetimes, logging, and resilience

0.1.1Apache-2.01

InstallClose

Propagation.pudu

Pudu35 lines1.5 KB

GitHub ↗
1/** @Handlers.Propagation.Module — headers of the operation in progress copied onto outgoing requests */2module PuduLangHttpClient.Handlers.Propagation34import Std.Concurrent.Cancel as Cancel5import PuduLangHttpClient.Domain.Headers as Headers6import PuduLangHttpClient.Handler as Handler7import PuduLangHttpClient as HttpClient8import PuduLangHttpClient.Request as Request9import PuduLangHttpClient.Response as Response1011/** @Handlers.Propagation.Source — the headers of the operation a request is sent on behalf of */12export type Source = fn() -> Array[(Str, Str)]1314/// A handler copying the named headers from the source onto every request that does not already15/// carry them.16export fn handler(names: &Array[Str], source: Source) -> Handler.Handler {17  renaming(&names.map(|name: Str| (name, name)), source)18}1920/// A handler copying each `(incoming, outgoing)` header from the source under its outgoing name onto21/// every request that does not already carry it; a header the source lacks is not sent.22export fn renaming(mappings: &Array[(Str, Str)], source: Source) -> Handler.Handler {23  let held = *mappings24  fn(request: Request.Request, token: Cancel.Token, next: Handler.Send) -> HttpClient.Outcome[Response.Response] {25    let incoming = source()26    var headers = request.headers27    for (from, to) in held {28      if !Headers.has(&headers, to) {29        for value in Headers.values(&incoming, from) { headers = Headers.add(&headers, to, value) }30      }31    }32    next(Request.Request{..request, headers: headers}, token)33  }34}35