1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859openLwt.SyntaxopenSexplib.Stdletlog_src=Logs.Src.create"sihl.middleware.urlencoded"moduleLogs=(valLogs.src_loglog_src:Logs.LOG)typeurlencoded=(string*stringlist)list[@@derivingsexp]exceptionUrlencoded_not_foundletkey:urlencodedOpium.Context.key=Opium.Context.Key.create("urlencoded",sexp_of_urlencoded);;letfind_allreq=matchOpium.Context.findkeyreq.Opium.Request.envwith|Someall->all|None->Logs.err(funm->m"No parsed urlencoded body found");Logs.info(funm->m"Have you applied the urlencoded middleware?");raiseUrlencoded_not_found;;letfindkeyreq=letresult=List.find_opt(fun(k,_)->String.equalkkey)(find_allreq)|>Option.mapsndinletresult=trySome(Option.mapList.hdresult)with|_->NoneinOption.joinresult;;(** [consume req key] returns the value of the parsed urlencoded body for the key [key]
and a request with an update context where the parsed urlencoded is missing the key
[key]. The urlencoded value is returned and removed from the context, it is consumed.
**)letconsumereqk=leturlencoded=find_allreqinletvalue=findkreqinletupdated=List.filter(fun(k_,_)->not(String.equalk_k))urlencodedinletenv=req.Opium.Request.envinletenv=Opium.Context.addkeyupdatedenvinletreq={reqwithenv}inreq,value;;letm()=letfilterhandlerreq=let*urlencoded=Sihl_type.Http_request.to_urlencodedreqinletenv=req.Opium.Request.envinletenv=Opium.Context.addkeyurlencodedenvinletreq={reqwithenv}inhandlerreqinRock.Middleware.create~name:"urlencoded"~filter;;