Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file http.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395open!ImportmoduletypeS=sigmoduleDeferred:sigtype'atendmodulePipe:sigmoduleReader:sigtype'atendmoduleFlushed:sigtypetendvalfold:?flushed:Flushed.t->'aReader.t->init:'accum->f:('accum->'a->'accumDeferred.t)->'accumDeferred.tvalof_list:'alist->'aReader.tendmoduleResponse:sigtypetvalstatus:t->Cohttp.Code.status_codevalheaders:t->(string*string)listendmoduleBody:sigtypetvalof_pipe:stringPipe.Reader.t->tvalof_string:string->tvalto_string:t->stringDeferred.tvalto_pipe:t->stringPipe.Reader.tendmoduleClient:sigvalget:?headers:Cohttp.Header.t->Uri.t->(Response.t*Body.t)Deferred.tvalpost:?headers:Cohttp.Header.t->?body:Body.t->?chunked:bool->Uri.t->(Response.t*Body.t)Deferred.tvalput:?headers:Cohttp.Header.t->?body:Body.t->?chunked:bool->Uri.t->(Response.t*Body.t)Deferred.tvaldelete:?headers:Cohttp.Header.t->?body:Body.t->?chunked:bool->Uri.t->(Response.t*Body.t)Deferred.tendendmoduleMeth=structtypestandard=[`GET|`HEAD|`POST|`PUT|`DELETE|`CONNECT|`OPTIONS|`TRACE|`PATCH][@@derivingsexp_of]typet=[standard|`Otherofstring][@@derivingsexp_of]letppppfx=Sexp.pp_humppf(sexp_of_tx)endmoduleHeaders=structtypet=(string,string)List.Assoc.t[@@derivingsexp_of]letempty=[]letof_listx=xletto_listx=xletppppfl=Sexp.pp_humppf(sexp_of_tl)endmoduleMonad=structtype(+'x,'f)appmoduletypeS=sigtype'astypetexternalinj:'as->('a,t)app="%identity"externalprj:('a,t)app->'as="%identity"endmoduleMake(T:sigtype'atend):Swithtype'as='aT.t=structtype'as='aT.ttypetexternalinj:'a->'b="%identity"externalprj:'a->'b="%identity"endtype'mt={bind:'a'b.('a,'m)app->('a->('b,'m)app)->('b,'m)app;return:'a.'a->('a,'m)app}endmoduleRange=structtypebyte_range_spec=[`Rangeofint64*int64|`From_startofint64|`From_endofint64][@@derivingsexp]letof_rangestartstop=ifInt64.comparestopstart<0thenError(sprintf"Not a valid byte range specification: start=%Ld, stop=%Ld"startstop)elseOk[`Range(start,stop)];;let%expect_test"of_range"=lettestxy=of_rangexy|>Result.sexp_of_t(List.sexp_of_tsexp_of_byte_range_spec)sexp_of_string|>Sexp.to_string|>print_endlinein(* Test 1: first argument < second argument *)testInt64.min_valueInt64.max_value;[%expect{| (Ok((Range(-9223372036854775808 9223372036854775807)))) |}];(* Test 2: first argument = second argument *)testInt64.min_valueInt64.min_value;[%expect{| (Ok((Range(-9223372036854775808 -9223372036854775808)))) |}];(* Test 3: first argument > second argument, invalid range *)testInt64.max_valueInt64.min_value;[%expect{|
(Error"Not a valid byte range specification: start=9223372036854775807, stop=-9223372036854775808") |}];;letfrom_endstart=[`From_endstart]letfrom_startstart=[`From_startstart]letbyte_range_spec_to_string(spec:byte_range_spec)=matchspecwith|`Range(start,stop)->sprintf"%Ld-%Ld"startstop|`From_startstart->sprintf"%Ld-"start|`From_endstop->sprintf"-%Ld"stop;;let%expect_test"byte_range_spec_to_string"=lettestx=printf!"%s"(byte_range_spec_to_stringx)in(* Test 1: `Range (correct by design, no need to check the bounds) *)test(`Range(Int64.zero,Int64.one));[%expect{| 0-1 |}];(* Test 2: `From_start *)test(`From_startInt64.one);[%expect{| 1- |}];(* Test 3: `From_end *)test(`From_endInt64.one);[%expect{| -1 |}];;typet=byte_range_speclistletto_header(t:t)=letbyte_range_spec_strs=List.map~f:byte_range_spec_to_stringtinletconcatenated=String.concat~sep:","byte_range_spec_strsin"Range",sprintf"bytes=%s"concatenated;;let%expect_test"to_header"=lettestx=printf!"%{sexp: (string * string)}"(to_headerx)in(* Test 1: empty list *)test[];[%expect{| (Range bytes=) |}];(* Test 2: list of a single `Range *)test[`Range(Int64.zero,Int64.one)];[%expect{| (Range bytes=0-1) |}];(* Test 3: list of a single `From_start *)test[`From_startInt64.one];[%expect{| (Range bytes=1-) |}];(* Test 4: list of a `From_start and a `From_end *)test[`From_startInt64.zero;`From_endInt64.one];[%expect{| (Range bytes=0-,-1) |}];;letto_header_value(t:t)=letk,v=to_headertinsprintf"%s: %s"kv;;let%expect_test"to_header_value"=lettestx=printf!"%s"(to_header_valuex)in(* Test 1: empty list *)test[];[%expect{| Range: bytes= |}];(* Test 2: list of a single `Range *)test[`Range(Int64.zero,Int64.one)];[%expect{| Range: bytes=0-1 |}];(* Test 3: list of a single `From_start *)test[`From_startInt64.one];[%expect{| Range: bytes=1- |}];(* Test 4: list of a `From_start and a `From_end *)test[`From_startInt64.zero;`From_endInt64.one];[%expect{| Range: bytes=0-,-1 |}];;endmoduleStatus=structtypeinformational=[`Continue|`Switching_protocols][@@derivingsexp_of]typesuccessful=[`OK|`Created|`Accepted|`Non_authoritative_information|`No_content|`Reset_content|`Partial_content][@@derivingsexp_of]typeredirection=[`Multiple_choices|`Moved_permanently|`Found|`See_other|`Not_modified|`Use_proxy|`Temporary_redirect][@@derivingsexp_of]typeclient_error=[`Bad_request|`Unauthorized|`Payment_required|`Forbidden|`Not_found|`Method_not_allowed|`Not_acceptable|`Proxy_authentication_required|`Request_timeout|`Conflict|`Gone|`Length_required|`Precondition_failed|`Unsupported_media_type|`Expectation_failed|`I_m_a_teapot|`Enhance_your_calm|`Upgrade_required][@@derivingsexp_of]typeserver_error=[`Internal_server_error|`Not_implemented|`Bad_gateway|`Service_unavailable|`Gateway_timeout|`Http_version_not_supported][@@derivingsexp_of]typestandard=[informational|successful|redirection|client_error|server_error][@@derivingsexp_of]typet=[standard|`Codeofint][@@derivingsexp_of]endmoduleRequest=structtypet={meth:Meth.t;version:int*int;headers:Headers.t;body:string}[@@derivingfields,sexp_of]letmake?(version=1,1)?(headers=Headers.empty)?(body="")meth={meth;version;headers;body};;letppppft=Sexp.pp_humppf(sexp_of_tt)endmoduleResponse=structtype'st={version:int*int;status:Status.t;reason:string;headers:Headers.t;body:(string,'s)stream}and('a,'s)stream=unit->('aoption,'s)Monad.appletmake?(version=1,1)?(reason="")?(headers=Headers.empty)~bodystatus={version;reason;headers;status;body};;letstatus{status;_}=statusletheaders{headers;_}=headersletbody{body;_}=bodyletversion{version;_}=versionletreason{reason;_}=reasonletbody_to_string?(buffer=0x1000){Monad.return;bind}{body;_}=let(>>=)=bindinletbuf=Buffer.createbufferinletrecgo()=body()>>=function|Somex->Buffer.add_stringbufx;go()|None->return(Buffer.contentsbuf)ingo();;endmoduleCall=structtype('s,'error)t=Meth.t->Request.t->Uri.t->(('sResponse.t,'error)result,'s)Monad.appendmoduleIo=structmoduletypeS=sigincludeMonad.Stype'astreamvalmonad:tMonad.tvalmake_stream:'astream->('a,t)Response.streamvalmake_http:(Meth.t->Request.t->Uri.t->(tResponse.t,'error)results)->(t,'error)Call.tendmoduleError=structtypebad_response={code:int;body:string;x_amzn_error_type:stringoption}[@@derivingsexp]typecall=[`Bad_responseofbad_response|`Too_many_redirects][@@derivingsexp]endend