5 let target_domains = targets
|> Array.map
(fun url
->
6 match Devkit.Stre.nsplitc url '
/'
with
8 | _scheme
::""::domain
::_
-> domain
9 | _
-> failwith
@@ sprintf
"bad target %S" url
)
13 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36";
14 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36";
15 "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0";
16 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36";
17 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36";
18 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36";
19 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36";
20 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Safari/605.1.15";
21 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15";
22 "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0";
30 let random a
= a
.(Random.int (Array.length a
))
34 set_useragent h
(random agents);
36 set_dnscachetimeout h
120;
37 set_connecttimeoutms h
3000;
39 set_followlocation h
true;
40 set_sslverifypeer h
false; (* ssl check must be turned off when using http_proxy, to permit https page caching*)
41 set_sslverifyhost h SSLVERIFYHOST_NONE
;
42 set_cainfo h
"/dev/null";
43 (* set_sslcipherlist h "DEFAULT@SECLEVEL=1"; *)
44 (* set_maxredirs h 1; *)
45 set_ipresolve h IPRESOLVE_V4
;
46 set_encoding h CURL_ENCODING_ANY
;
47 (* set_freshconnect h true; (* more connections *) *)
48 (* set_forbidreuse h true; *)
49 set_protocols h
[CURLPROTO_HTTP
; CURLPROTO_HTTPS
;];
50 set_redirprotocols h
[CURLPROTO_HTTP
; CURLPROTO_HTTPS
;];
51 (* set_maxrecvspeedlarge h (Int64.of_int (kBps*1024)); *)
54 let () = Printexc.register_printer
(function Curl.CurlException
(code
,n
,s
) -> Some
(sprintf
"%d %s %s" n s
(Curl.strerror code
)) | _
-> None
)
58 Devkit.Nix.raise_limits
();
59 let stat = Hashtbl.create
10 in
60 let dns_stat = Hashtbl.create
10 in
61 targets
|> Array.iter
(fun s
-> Hashtbl.add
stat s
{ ok
= 0; errors
= 0 });
62 dns_targets
|> List.iter
(fun s
-> Hashtbl.add
dns_stat s
0);
65 let url = random targets
in
69 set_url h
(if Random.int 3 = 0 then url else sprintf
"%s?%d" url (Random.int 2000));
70 set_writefunction h
String.length
;
72 let%lwt r
= Curl_lwt.perform h
in
73 if r
<> CURLE_OK
then failwith
@@ sprintf
"curl error %s" (Curl.strerror r
);
74 Hashtbl.replace
stat url
75 (let t = Hashtbl.find
stat url in
76 { t with ok
= t.ok
+ 1 }
80 (* print_endline @@ sprintf "FAILED: %s : %s" (Curl.get_effectiveurl h) (Printexc.to_string exn); *)
81 Hashtbl.replace
stat url
82 (let t = Hashtbl.find
stat url in
83 { t with errors
= t.errors
+ 1 }
88 let qtypes = Dns.[| A
; NS
; CNAME
; SOA
; MX
; TXT
; AAAA
; A6
; PTR
|] in
89 let dns_worker upstreams
=
91 let (upstream
,ns
) = random upstreams
in
92 Hashtbl.replace
dns_stat upstream
(Hashtbl.find
dns_stat upstream
+ 1);
93 let domain = random target_domains in
94 let qtype = random qtypes in
95 let%lwt
() = Dnsq.send_query_forget ns ~
qtype domain in
96 Lwt_unix.sleep
@@ 0.5 +. Random.float 1.
101 let%lwt
() = Lwt_unix.sleep
1. in
103 dns_targets
|> List.iter
(fun s
-> print_endline
@@ sprintf
"%32s %10d" s
(Hashtbl.find
dns_stat s
));
104 print_endline
@@ sprintf
"%40s %6s %6s %40s %6s %6s %40s %6s %6s" "url" "ok" "errors" "url" "ok" "errors" "url" "ok" "errors";
105 targets
|> Array.iteri
(fun i
url ->
106 let { ok
; errors
} = Hashtbl.find
stat url in
107 printf
"%40s %6d %6d" url ok errors
;
108 if i
mod 3 = 2 then print_newline
()
114 Lwt_engine.set
(new Lwt_engine.libev
());
115 List.iter
(fun n
-> Sys.set_signal n
Sys.Signal_ignore
) [Sys.sigtstp
; Sys.sigttou
; Sys.sigttin
; Sys.sighup
; Sys.sigpipe
];
116 let (_
:int list
) = Unix.sigprocmask SIG_BLOCK
[Sys.sigtstp
; Sys.sigttou
; Sys.sigttin
; Sys.sighup
; Sys.sigpipe
] in
117 Lwt_main.run
@@ begin
118 let workers = List.init par
(fun _
-> Curl.init
()) |> List.map
worker in
119 let%lwt dns_upstreams
= dns_targets
|> Lwt_list.map_s
(fun s
-> let%lwt ns
= Dnsq.upstream ~timeout
:2. s
in Lwt.return
(s
,ns
)) |> Lwt.map
Array.of_list
in
120 let dns_workers = List.init par
(fun _
-> dns_worker dns_upstreams
) in
121 Lwt.join
(show_stats () :: workers @ dns_workers)
128 match Devkit.Nix.args
with
129 | [n
] -> int_of_string n
134 print_endline
@@ sprintf
"fatal exn %s" (Printexc.to_string exn
)