1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162(* This modules encapsulates refactored - common - readers and writers
used by the Client and Server modules.
rwer.ml => (R)eader (W)riter + er
*)moduleBuf_read=Eio.Buf_readmoduleBuf_write=Eio.Buf_writelettake_while1pr=matchBuf_read.take_whileprwith""->raiseEnd_of_file|x->xlettoken=take_while1(function|'0'..'9'|'a'..'z'|'A'..'Z'|'!'|'#'|'$'|'%'|'&'|'\''|'*'|'+'|'-'|'.'|'^'|'_'|'`'|'|'|'~'->true|_->false)letows=Buf_read.skip_while(function' '|'\t'->true|_->false)letcrlf=Buf_read.string"\r\n"letnot_cr=function'\r'->false|_->trueletspace=Buf_read.char'\x20'letversion=letopenEio.Buf_read.Syntaxinlet*v=Buf_read.string"HTTP/1."*>Buf_read.any_charinmatchvwith|'1'->Buf_read.return`HTTP_1_1|'0'->Buf_read.return`HTTP_1_0|v->failwith(Format.sprintf"Invalid HTTP version: %C"v)letheader=letopenEio.Buf_read.Syntaxinlet+key=token<*Buf_read.char':'<*owsand+value=Buf_read.take_whilenot_cr<*crlfin(key,value)lethttp_headersr=let[@tail_mod_cons]recaux()=matchBuf_read.peek_charrwith|Some'\r'->crlfr;[]|_->leth=headerrinh::aux()inHttp.Header.of_list(aux())letwrite_headerswriterheaders=letheaders=Http.Header.clean_dupheadersinHttp.Header.iter_ord(funkv->Buf_write.stringwriterk;Buf_write.stringwriter": ";Buf_write.stringwriterv;Buf_write.stringwriter"\r\n")headers