···98989999let extract_nsid req = (Dream.path [@warning "-3"]) req |> List.rev |> List.hd
100100101101+let add_dpop_nonce_if_needed res =
102102+ let nonce = Oauth.Dpop.next_nonce () in
103103+ Dream.set_header res "DPoP-Nonce" nonce ;
104104+ let expose_header = Dream.header res "Access-Control-Expose-Headers" in
105105+ Dream.add_header res "Access-Control-Expose-Headers"
106106+ ( match expose_header with
107107+ | Some headers when not @@ Util.str_contains ~affix:"DPoP-Nonce" headers ->
108108+ headers ^ ", DPoP-Nonce"
109109+ | _ ->
110110+ "DPoP-Nonce" ) ;
111111+ res
112112+101113let handler ?(auth : Auth.Verifiers.t = Any)
102114 ?(rate_limits : rate_limit_rule list = []) (hdlr : handler) (init : init) =
103115 let open Errors in
···117129 with Rate_limiter.Rate_limit_exceeded status ->
118130 rate_limit_response status )
119131 | Error e ->
120120- exn_to_response e
132132+ let%lwt res = exn_to_response e in
133133+ Lwt.return
134134+ ( match e with
135135+ | UseDpopNonceError ->
136136+ add_dpop_nonce_if_needed res
137137+ | _ ->
138138+ res )
121139 with
122140 | Redirect r ->
123141 Dream.redirect init.req r
124142 | Rate_limiter.Rate_limit_exceeded status ->
125143 rate_limit_response status
144144+ | UseDpopNonceError as e ->
145145+ let%lwt res = exn_to_response e in
146146+ Lwt.return (add_dpop_nonce_if_needed res)
126147 | e ->
127148 if not (is_xrpc_error e) then log_exn e ;
128149 exn_to_response e