add HTTP_VERSION_2_PRIOR_KNOWLEDGE
[ocurl.git] / examples / opar.ml
blob064827814222c967470eb43786fe271eb0411ee9
1 (*
2 * opar.ml
4 * Copyright (c) 2003-2008, Lars Nilsson, <lars@quantumchamaeleon.com>
5 *)
7 open Printf
9 let show_progress fname conn =
10 let bytes = Curl.get_sizedownload conn
11 and total = Curl.get_contentlengthdownload conn in
12 printf "%s : %.2f%%\n" fname (bytes /. total *. 100.0);
13 flush stdout
15 let writer fname conn accum data =
16 (* show_progress fname conn; *)
17 Buffer.add_string accum data;
18 String.length data
20 let save fname content =
21 let fp = open_out_bin fname in
22 Buffer.output_buffer fp content;
23 close_out fp
25 let get fname url () =
26 let result = Buffer.create 16384
27 and conn = Curl.init () in
28 Curl.set_writefunction conn (writer fname conn result);
29 Curl.set_followlocation conn true;
30 Curl.set_url conn url;
31 Curl.perform conn;
32 Curl.cleanup conn;
33 save fname result
35 let thread_get fname url =
36 Thread.create (get fname url) ()
38 let make_fname i =
39 sprintf "file%02d" (i+1)
41 let rec join requests =
42 match requests with
43 | [] -> ()
44 | (fname, t) :: rest ->
45 printf "Download done [%s]\n" fname;
46 Thread.join t;
47 join rest
49 let _ =
50 Curl.global_init Curl.CURLINIT_GLOBALALL;
51 let requests = Array.mapi
52 (fun i url ->
53 let fname = make_fname i in
54 (fname, thread_get fname url))
55 (Array.sub Sys.argv 1 (Array.length Sys.argv - 1))
57 join (Array.to_list requests)