1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677(*****************************************************************************)(* *)(* Open Source License *)(* Copyright (c) 2022 Nomadic Labs, <contact@nomadic-labs.com> *)(* *)(* Permission is hereby granted, free of charge, to any person obtaining a *)(* copy of this software and associated documentation files (the "Software"),*)(* to deal in the Software without restriction, including without limitation *)(* the rights to use, copy, modify, merge, publish, distribute, sublicense, *)(* and/or sell copies of the Software, and to permit persons to whom the *)(* Software is furnished to do so, subject to the following conditions: *)(* *)(* The above copyright notice and this permission notice shall be included *)(* in all copies or substantial portions of the Software. *)(* *)(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*)(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *)(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *)(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*)(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *)(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *)(* DEALINGS IN THE SOFTWARE. *)(* *)(*****************************************************************************)letmake_transform_callbackforwarding_endpointcallbackconnreqbody=letopenLwt_syntaxinletopenCohttpinlet*answer=callbackconnreqbodyinleturi=Request.urireqinletanswer_has_not_found_status=function|`Expert(response,_)|`Response(response,_)->Response.statusresponse=`Not_foundinifanswer_has_not_found_statusanswerthenletoverriding=Uri.to_stringforwarding_endpoint^Uri.pathuriinletheaders=Header.of_list[("Location",overriding)]inletresponse=Response.make~status:`Moved_permanently~headers()inLwt.return(`Response(response,Cohttp_lwt.Body.of_string(Format.asprintf"tezos-proxy-server: request unsupported for proxy server, \
redirecting to node endpoint at %s"overriding)))elseLwt.returnanswerletrpc_metrics_transform_callback~update_metricsdircallbackconnreqbody=letopenLwt_result_syntaxinletdo_call()=callbackconnreqbodyinletcohttp_meth=Cohttp.Request.methreqinleturi=Cohttp.Request.urireqinletpath=Uri.pathuriinletdecoded=Resto.Utils.decode_split_pathpathinlet*!description=let*resto_meth=matchcohttp_methwith|#Resto.methasmeth->Lwt.return_okmeth|_->Lwt.return_error@@`Method_not_allowed[]inlet*uri_desc=Tezos_rpc.Directory.lookup_uri_descdir()resto_methdecodedinLwt.return_ok(uri_desc,Resto.string_of_methresto_meth)inmatchdescriptionwith|Ok(uri,meth)->(* We update the metric only if the URI can succesfully
be matched in the directory tree. *)update_metricsurimethdo_call|Error_->(* Otherwise, the call must be done anyway. *)do_call()letproxy_server_query_forwarderforwarding_endpoint=make_transform_callbackforwarding_endpoint