(* OCaml HTTP - do it yourself (fully OCaml) HTTP daemon Copyright (C) <2002> Stefano Zacchiroli This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) open Http_types;; let date_822 () = Netdate.mk_mail_date ~zone:Netdate.localzone (Unix.time ()) let is_directory name = match Unix.lstat name with | { Unix.st_kind = Unix.S_DIR } -> true | _ -> false let filesize fname = (Unix.stat fname).Unix.st_size let strip_trailing_slash = let rex = Pcre.regexp "/$" in fun s -> Pcre.replace ~rex ~templ:"" s let strip_heading_slash = let rex = Pcre.regexp "^/" in fun s -> Pcre.replace ~rex ~templ:"" s let ls dir = let rec ls' entries = try ls' ((Unix.readdir dir)::entries) with End_of_file -> entries in ls' [] let string_explode s = let rec string_explode' acc = function | "" -> acc | s -> string_explode' (s.[0] :: acc) (String.sub s 1 (String.length s - 1)) in List.rev (string_explode' [] s) let string_implode = List.fold_left (fun s c -> s ^ (String.make 1 c)) "" let reason_phrase_of_code = function | 100 -> "Continue" | 101 -> "Switching protocols" | 200 -> "OK" | 201 -> "Created" | 202 -> "Accepted" | 203 -> "Non authoritative information" | 204 -> "No content" | 205 -> "Reset content" | 206 -> "Partial content" | 300 -> "Multiple choices" | 301 -> "Moved permanently" | 302 -> "Found" | 303 -> "See other" | 304 -> "Not modified" | 305 -> "Use proxy" | 307 -> "Temporary redirect" | 400 -> "Bad request" | 401 -> "Unauthorized" | 402 -> "Payment required" | 403 -> "Forbidden" | 404 -> "Not found" | 405 -> "Method not allowed" | 406 -> "Not acceptable" | 407 -> "Proxy authentication required" | 408 -> "Request time out" | 409 -> "Conflict" | 410 -> "Gone" | 411 -> "Length required" | 412 -> "Precondition failed" | 413 -> "Request entity too large" | 414 -> "Request URI too large" | 415 -> "Unsupported media type" | 416 -> "Requested range not satisfiable" | 417 -> "Expectation failed" | 500 -> "Internal server error" | 501 -> "Not implemented" | 502 -> "Bad gateway" | 503 -> "Service unavailable" | 504 -> "Gateway time out" | 505 -> "HTTP version not supported" | invalid_code -> raise (Invalid_code invalid_code)