-module(livery_request_id). -moduledoc """ Request-ID middleware. Generates a fresh per-request identifier or honors an existing `X-Request-ID` header. The id is stored on the request value (`livery_req:req_id/1`) and echoed on the response so that clients and downstream services can correlate. Identifiers are 32-character lowercase hex strings derived from `crypto:strong_rand_bytes/1`. """. -behaviour(livery_middleware). -export([call/3]). -define(HEADER, <<"x-request-id">>). -doc "Run the middleware. State is unused.". -spec call(livery_req:req(), livery_middleware:next(), term()) -> livery_resp:resp(). call(Req, Next, _State) -> Id = case livery_req:header(?HEADER, Req) of undefined -> generate(); Existing -> Existing end, Req1 = livery_req:set_req_id(Id, Req), Resp = Next(Req1), livery_resp:with_header(?HEADER, Id, Resp). -spec generate() -> binary(). generate() -> binary:encode_hex(crypto:strong_rand_bytes(16), lowercase).