File: server.ml

package info (click to toggle)
js-of-ocaml 2.2-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 7,612 kB
  • ctags: 10,589
  • sloc: ml: 36,459; makefile: 665; lisp: 41; sh: 14; ruby: 4; perl: 4
file content (52 lines) | stat: -rw-r--r-- 1,745 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
open Lwt
open Cohttp
open Cohttp_lwt_unix
open Re

let address = ref "127.0.0.1"
let port = ref 8888
let _ = Findlib.init ()
let filesys = ref (Findlib.default_location ())

let server () =

    let re_filesys = compile (seq [ str "/filesys/"; group (seq [ str !filesys; rep any]); eos ]) in

    let header typ =
        let h = Header.init () in
        let h = Header.add h "Content-Type" typ in
        let h = Header.add h "Server" "iocaml" in
        h
    in
    let header_html = header "text/html; charset=UTF-8" in
    let header_js = header "application/javascript; charset=UTF-8" in
    let header_css = header "text/css; charset=UTF-8" in
    let header_plain_user_charset = header "text/plain; charset=x-user-defined" in

    let callback conn_id req body =
        let uri = Request.uri req in
        let path = Uri.path uri in

        try
            (* send binary file *)
            let fname = get (exec re_filesys path) 1 in
            Lwt_io.eprintf "filesys: %s\n" fname >>= fun () ->
            Server.respond_file ~headers:header_plain_user_charset ~fname:fname ()
        with _ ->
            (* send static file *)
            let fname = Server.resolve_file ~docroot:"." ~uri:uri in
            Lwt_io.eprintf "static: %s\n" fname >>= fun () ->
            let headers =
              if Filename.check_suffix fname ".css"
              then header_css
              else if Filename.check_suffix fname ".js"
              then header_js
              else header_html in
            Server.respond_file ~headers ~fname ()

    in
    let conn_closed conn_id () = () in
    let config = { Server.callback; conn_closed } in
    Server.create ~address:!address ~port:!port config

let () = Lwt_unix.run (server())