The Res module provides functions for writing HTTP responses directly into bigstring buffers. All functions operate on bigstrings for zero-copy I/O and use int16# offsets for efficient stack-allocated position tracking.
let off = Res.write_status_line write_buf ~off Res.Success Version.Http_1_1 inlet off = Res.write_header write_buf ~off "Content-Type" "text/html" inlet off = Res.write_crlf write_buf ~off in(* Send buffer from 0 to off *)
Res.Bad_request (* 400 Bad Request *)Res.Unauthorized (* 401 Unauthorized *)Res.Forbidden (* 403 Forbidden *)Res.Not_found (* 404 Not Found *)Res.Method_not_allowed (* 405 Method Not Allowed *)Res.Request_timeout (* 408 Request Timeout *)Res.Payload_too_large (* 413 Payload Too Large *)Res.Range_not_satisfiable (* 416 Range Not Satisfiable *)Res.Too_many_requests (* 429 Too Many Requests *)
let send_success_response writer content = let buf = create_response_buffer () in let off = i16 0 in (* Status line *) let off = Res.write_status_line buf ~off Res.Success Version.Http_1_1 in (* Headers *) let off = Res.write_header_name buf ~off Header_name.Content_type "text/plain" in let off = Res.write_content_length buf ~off (String.length content) in let off = Res.write_connection buf ~off ~keep_alive:true in (* End of headers *) let off = Res.write_crlf buf ~off in (* Send headers *) Writer.write_bigstring writer buf ~pos:0 ~len:(to_int off); (* Send body *) Writer.write writer content; Writer.flushed writer
let send_404_response writer = let buf = create_response_buffer () in let message = "Not Found" in let off = i16 0 in let off = Res.write_status_line buf ~off Res.Not_found Version.Http_1_1 in let off = Res.write_header_name buf ~off Header_name.Content_type "text/plain" in let off = Res.write_content_length buf ~off (String.length message) in let off = Res.write_connection buf ~off ~keep_alive:false in let off = Res.write_crlf buf ~off in Writer.write_bigstring writer buf ~pos:0 ~len:(to_int off); Writer.write writer message; Writer.flushed writer
let send_json_response writer json_string = let buf = create_response_buffer () in let off = i16 0 in let off = Res.write_status_line buf ~off Res.Success Version.Http_1_1 in let off = Res.write_header_name buf ~off Header_name.Content_type "application/json" in let off = Res.write_content_length buf ~off (String.length json_string) in let off = Res.write_header buf ~off "Cache-Control" "no-cache" in let off = Res.write_connection buf ~off ~keep_alive:true in let off = Res.write_crlf buf ~off in Writer.write_bigstring writer buf ~pos:0 ~len:(to_int off); Writer.write writer json_string; Writer.flushed writer
let send_redirect writer location ~permanent = let buf = create_response_buffer () in let off = i16 0 in let status = if permanent then Res.Moved_permanently else Res.Found in let off = Res.write_status_line buf ~off status Version.Http_1_1 in let off = Res.write_header_name buf ~off Header_name.Location location in let off = Res.write_content_length buf ~off 0 in let off = Res.write_connection buf ~off ~keep_alive:true in let off = Res.write_crlf buf ~off in Writer.write_bigstring writer buf ~pos:0 ~len:(to_int off); Writer.flushed writer
let send_not_modified writer ~etag ~last_modified = let buf = create_response_buffer () in let off = i16 0 in let off = Res.write_status_line buf ~off Res.Not_modified Version.Http_1_1 in let off = Res.write_header buf ~off "ETag" etag in let off = Date.write_last_modified buf ~off (Float_u.of_float last_modified) in let off = Res.write_connection buf ~off ~keep_alive:true in let off = Res.write_crlf buf ~off in Writer.write_bigstring writer buf ~pos:0 ~len:(to_int off); Writer.flushed writer
See the ETags guide for more information on conditional requests.
let send_chunked_response writer = let buf = create_response_buffer () in let off = i16 0 in (* Write headers with Transfer-Encoding: chunked *) let off = Res.write_status_line buf ~off Res.Success Version.Http_1_1 in let off = Res.write_header_name buf ~off Header_name.Content_type "text/plain" in let off = Res.write_transfer_encoding_chunked buf ~off in let off = Res.write_connection buf ~off ~keep_alive:true in let off = Res.write_crlf buf ~off in Writer.write_bigstring writer buf ~pos:0 ~len:(to_int off); (* Send chunks *) let chunk_data = "Hello, World!" in let chunk_buf = create_response_buffer () in let off = i16 0 in let off = Res.write_chunk_header chunk_buf ~off ~size:(String.length chunk_data) in Writer.write_bigstring writer chunk_buf ~pos:0 ~len:(to_int off); Writer.write writer chunk_data; let off = i16 0 in let off = Res.write_chunk_footer chunk_buf ~off in Writer.write_bigstring writer chunk_buf ~pos:0 ~len:(to_int off); (* Final chunk *) let off = i16 0 in let off = Res.write_final_chunk chunk_buf ~off in Writer.write_bigstring writer chunk_buf ~pos:0 ~len:(to_int off); Writer.flushed writer