
Propagation.pudu
Pudu35 lines1.5 KB
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)]13141516export fn handler(names: &Array[Str], source: Source) -> Handler.Handler {17 renaming(&names.map(|name: Str| (name, name)), source)18}19202122export 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