(*
OCaml HTTP - do it yourself (fully OCaml) HTTP daemon
- Copyright (C) <2002> Stefano Zacchiroli <zack@cs.unibo.it>
+ Copyright (C) <2002-2005> Stefano Zacchiroli <zack@cs.unibo.it>
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.
+ it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation, version 2.
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.
+ GNU Library 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
+ You should have received a copy of the GNU Library 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
*)
-type version =
- [ `HTTP_1_0
- | `HTTP_1_1
- ]
-
-type meth = [ `GET ]
+(** Type definitions *)
+type version = [ `HTTP_1_0 | `HTTP_1_1 ]
+type meth = [ `GET | `POST ]
type daemon_mode = [ `Single | `Fork | `Thread ]
type tcp_server =
(in_channel -> out_channel -> unit) ->
unit
+type auth_info =
+ [ `Basic of string * string (* username, password *)
+ ]
+
type informational_substatus =
[ `Continue
| `Switching_protocols
]
-
type success_substatus =
[ `OK
| `Created
| `Reset_content
| `Partial_content
]
-
type redirection_substatus =
[ `Multiple_choices
| `Moved_permanently
| `Use_proxy
| `Temporary_redirect
]
-
type client_error_substatus =
[ `Bad_request
| `Unauthorized
| `Requested_range_not_satisfiable
| `Expectation_failed
]
-
type server_error_substatus =
[ `Internal_server_error
| `Not_implemented
| `Gateway_time_out
| `HTTP_version_not_supported
]
-
type informational_status = [ `Informational of informational_substatus ]
type success_status = [ `Success of success_substatus ]
type redirection_status = [ `Redirection of redirection_substatus ]
type client_error_status = [ `Client_error of client_error_substatus ]
type server_error_status = [ `Server_error of server_error_substatus ]
-
type error_status =
[ client_error_status
| server_error_status
]
-
type status =
[ informational_status
| success_status
| server_error_status
]
-class type response =
- object
- method version: version
+type status_code = [ `Code of int | `Status of status ]
+
+type file_source =
+ | FileSrc of string
+ | InChanSrc of in_channel
+
+exception Invalid_header of string
+exception Invalid_header_name of string
+exception Invalid_header_value of string
+exception Invalid_HTTP_version of string
+exception Invalid_HTTP_method of string
+exception Invalid_code of int
+exception Malformed_URL of string
+exception Malformed_query of string
+exception Malformed_query_part of string * string
+exception Malformed_request_URI of string
+exception Malformed_request of string
+exception Malformed_response of string
+exception Param_not_found of string
+exception Invalid_status_line of string
+exception Header_not_found of string
+exception Quit
+exception Unauthorized of string
+
+class type message = object
+ method version: version option
method setVersion: version -> unit
+ method body: string
+ method setBody: string -> unit
+ method bodyBuf: Buffer.t
+ method setBodyBuf: Buffer.t -> unit
+ method addBody: string -> unit
+ method addBodyBuf: Buffer.t -> unit
+ method addHeader: name:string -> value:string -> unit
+ method addHeaders: (string * string) list -> unit
+ method replaceHeader: name:string -> value:string -> unit
+ method replaceHeaders: (string * string) list -> unit
+ method removeHeader: name:string -> unit
+ method hasHeader: name:string -> bool
+ method header: name:string -> string
+ method headers: (string * string) list
+ method clientSockaddr: Unix.sockaddr
+ method clientAddr: string
+ method clientPort: int
+ method serverSockaddr: Unix.sockaddr
+ method serverAddr: string
+ method serverPort: int
+ method toString: string
+ method serialize: out_channel -> unit
+ end
+
+class type request = object
+ inherit message
+ method meth: meth
+ method uri: string
+ method path: string
+ method param: ?meth:meth -> ?default:string -> string -> string
+ method paramAll: ?meth:meth -> string -> string list
+ method params: (string * string) list
+ method params_GET: (string * string) list
+ method params_POST: (string * string) list
+ method authorization: auth_info option
+ end
+
+class type response = object
+ inherit message
method code: int
method setCode: int -> unit
method status: status
method isClientError: bool
method isServerError: bool
method isError: bool
- method contents: string
- method setContents: string -> unit
- method contentsBuf: Buffer.t
- method setContentsBuf: Buffer.t -> unit
- method addContents: string -> unit
- method addContentsBuf: Buffer.t -> unit
- method addHeader: name:string -> value:string -> unit
method addBasicHeaders: unit
- method replaceHeader: name:string -> value:string -> unit
- method removeHeader: name:string -> unit
- method hasHeader: name:string -> bool
- method header: name:string -> string
- method headers: (string * string) list
method contentType: string
method setContentType: string -> unit
method contentEncoding: string
method setExpires: string -> unit
method server: string
method setServer: string -> unit
- method toString: string
- method serialize: out_channel -> unit
end
-class type request =
+
+class type connection =
object
- method uri: string
- method path: string
- method param: string -> string
- method params: (string * string) list
+ method getRequest: request option
+ method respond_with: response -> unit
+ method close: unit
+ end
+class type daemon =
+ object
+ method accept: connection
+ method getRequest: request * connection
end
+
+type daemon_spec = {
+ address: string;
+ auth: (string * auth_info) option;
+ callback: request -> out_channel -> unit;
+ mode: daemon_mode;
+ port: int;
+ root_dir: string option;
+ exn_handler: (exn -> out_channel -> unit) option;
+ timeout: int option;
+}
+