25 |
|
|
26 |
open BasicSocket |
open BasicSocket |
27 |
open TcpBufferedSocket |
open TcpBufferedSocket |
28 |
|
|
29 |
open CommonShared |
open CommonShared |
30 |
open CommonUploads |
open CommonUploads |
31 |
open CommonOptions |
open CommonOptions |
36 |
open CommonTypes |
open CommonTypes |
37 |
open CommonFile |
open CommonFile |
38 |
open CommonGlobals |
open CommonGlobals |
39 |
open CommonDownloads |
open CommonDownloads |
40 |
|
|
41 |
open FileTPTypes |
open FileTPTypes |
42 |
open FileTPOptions |
open FileTPOptions |
43 |
open FileTPGlobals |
open FileTPGlobals |
60 |
disconnect_client c Closed_by_user; |
disconnect_client c Closed_by_user; |
61 |
raise Exit; |
raise Exit; |
62 |
end; |
end; |
63 |
|
|
64 |
let b = TcpBufferedSocket.buf sock in |
let b = TcpBufferedSocket.buf sock in |
65 |
let to_read = min (end_pos -- !counter_pos) |
let to_read = min (end_pos -- !counter_pos) |
66 |
(Int64.of_int b.len) in |
(Int64.of_int b.len) in |
67 |
(* |
(* |
68 |
lprintf "Reading: end_pos %Ld counter_pos %Ld len %d = to_read %Ld\n" |
lprintf "Reading: end_pos %Ld counter_pos %Ld len %d = to_read %Ld\n" |
70 |
*) |
*) |
71 |
let to_read_int = Int64.to_int to_read in |
let to_read_int = Int64.to_int to_read in |
72 |
(* |
(* |
73 |
lprintf "CHUNK: %s\n" |
lprintf "CHUNK: %s\n" |
74 |
(String.escaped (String.sub b.buf b.pos to_read_int)); *) |
(String.escaped (String.sub b.buf b.pos to_read_int)); *) |
75 |
|
|
76 |
begin |
begin |
77 |
try |
try |
78 |
match d.download_uploader with |
match d.download_uploader with |
79 |
None -> assert false |
None -> assert false |
80 |
| Some up -> |
| Some up -> |
81 |
|
|
82 |
let swarmer = Int64Swarmer.uploader_swarmer up in |
let swarmer = Int64Swarmer.uploader_swarmer up in |
83 |
let old_downloaded = |
let old_downloaded = |
84 |
Int64Swarmer.downloaded swarmer in |
Int64Swarmer.downloaded swarmer in |
85 |
|
|
86 |
Int64Swarmer.received up |
Int64Swarmer.received up |
87 |
!counter_pos b.buf b.pos to_read_int; |
!counter_pos b.buf b.pos to_read_int; |
88 |
let new_downloaded = |
let new_downloaded = |
89 |
Int64Swarmer.downloaded swarmer in |
Int64Swarmer.downloaded swarmer in |
90 |
|
|
|
|
|
91 |
if new_downloaded = file_size file then |
if new_downloaded = file_size file then |
92 |
download_finished file; |
download_finished file; |
93 |
|
|
94 |
with e -> |
with e -> |
95 |
lprintf "FT: Exception %s in Int64Swarmer.received\n" |
lprintf "FT: Exception %s in Int64Swarmer.received\n" |
96 |
(Printexc2.to_string e) |
(Printexc2.to_string e) |
97 |
end; |
end; |
98 |
c.client_reconnect <- true; |
c.client_reconnect <- true; |
99 |
(* List.iter (fun (_,_,r) -> |
(* List.iter (fun (_,_,r) -> |
100 |
Int64Swarmer.alloc_range r) d.download_ranges; *) |
Int64Swarmer.alloc_range r) d.download_ranges; *) |
101 |
|
|
102 |
(match d.download_ranges with |
(match d.download_ranges with |
103 |
[] -> lprintf "EMPTY Ranges !!!\n" |
[] -> lprintf "EMPTY Ranges !!!\n" |
104 |
| r :: _ -> |
| r :: _ -> |
105 |
() |
() |
106 |
); |
); |
107 |
(* |
(* |
125 |
let token = create_token unlimited_connection_manager in |
let token = create_token unlimited_connection_manager in |
126 |
let sock = TcpBufferedSocket.connect token "http client connecting" |
let sock = TcpBufferedSocket.connect token "http client connecting" |
127 |
(Ip.to_inet_addr ip) |
(Ip.to_inet_addr ip) |
128 |
port (fun _ e -> |
port (fun _ e -> |
129 |
() |
() |
130 |
) |
) |
131 |
in |
in |
137 |
) |
) |
138 |
|
|
139 |
let write_reqs sock reqs = |
let write_reqs sock reqs = |
140 |
|
|
141 |
let buf = Buffer.create 100 in |
let buf = Buffer.create 100 in |
142 |
List.iter (fun s -> Printf.bprintf buf "%s\r\n" s) reqs; |
List.iter (fun s -> Printf.bprintf buf "%s\r\n" s) reqs; |
143 |
let request = Buffer.contents buf in |
let request = Buffer.contents buf in |
148 |
let ispost = ref false in |
let ispost = ref false in |
149 |
let timeout = ref 300.0 in |
let timeout = ref 300.0 in |
150 |
let proxy = ref None in |
let proxy = ref None in |
151 |
List.iter (function |
List.iter (function |
152 |
| Args l -> args := l@ !args |
| Args l -> args := l@ !args |
153 |
| Headers l -> headers := l @ !headers; |
| Headers l -> headers := l @ !headers; |
154 |
| Post -> ispost := true |
| Post -> ispost := true |
158 |
let headers = !headers in |
let headers = !headers in |
159 |
let ispost = !ispost in |
let ispost = !ispost in |
160 |
let proxy = !proxy in |
let proxy = !proxy in |
161 |
*) |
*) |
162 |
|
|
163 |
TcpBufferedSocket.write_string sock request |
TcpBufferedSocket.write_string sock request |
164 |
|
|
165 |
(*************************************************************************) |
(*************************************************************************) |
167 |
(* MAIN *) |
(* MAIN *) |
168 |
(* *) |
(* *) |
169 |
(*************************************************************************) |
(*************************************************************************) |
170 |
|
|
171 |
let ftp_send_range_request c (x,y) sock d = |
let ftp_send_range_request c (x,y) sock d = |
172 |
|
|
173 |
lprintf "FTP: Asking range %Ld-%Ld\n" x y ; |
lprintf "FTP: Asking range %Ld-%Ld\n" x y ; |
174 |
|
|
175 |
let file = d.download_url.Url.full_file in |
let file = d.download_url.Url.full_file in |
176 |
let reqs = [ |
let reqs = [ |
177 |
Printf.sprintf "CWD %s" (Filename.dirname file); |
Printf.sprintf "CWD %s" (Filename.dirname file); |
178 |
(* 250 *) |
(* 250 *) |
179 |
"PASV"; |
"PASV"; |
185 |
] |
] |
186 |
in |
in |
187 |
|
|
|
|
|
188 |
write_reqs sock reqs; |
write_reqs sock reqs; |
189 |
|
|
190 |
TcpBufferedSocket.set_reader sock (fun sock nread -> |
TcpBufferedSocket.set_reader sock (fun sock nread -> |
191 |
let b = TcpBufferedSocket.buf sock in |
let b = TcpBufferedSocket.buf sock in |
192 |
let rec iter i = |
let rec iter i = |
198 |
let line = String.sub b.buf b.pos slen in |
let line = String.sub b.buf b.pos slen in |
199 |
lprintf "FTP LINE [%s]\n" line; |
lprintf "FTP LINE [%s]\n" line; |
200 |
buf_used b (i+1); |
buf_used b (i+1); |
201 |
if slen > 4 && String.sub line 0 4 = "227 " then |
if slen > 4 && String.sub line 0 4 = "227 " then |
202 |
try |
try |
203 |
let pos = String.index line '(' in |
let pos = String.index line '(' in |
204 |
let line = String.sub line (pos+1) (slen - pos - 1) in |
let line = String.sub line (pos+1) (slen - pos - 1) in |
205 |
let pos = String.index line ')' in |
let pos = String.index line ')' in |
206 |
let line = String.sub line 0 pos in |
let line = String.sub line 0 pos in |
207 |
match |
match |
208 |
List.map int_of_string ( |
List.map int_of_string ( |
209 |
String2.split_simplify line ',') with |
String2.split_simplify line ',') with |
210 |
[a0;a1;a2;a3;p0;p1] -> |
[a0;a1;a2;a3;p0;p1] -> |
211 |
let ip = Ip.of_string |
let ip = Ip.of_string |
212 |
(Printf.sprintf "%d.%d.%d.%d" a0 a1 a2 a3) in |
(Printf.sprintf "%d.%d.%d.%d" a0 a1 a2 a3) in |
213 |
let port = p0 * 256 + p1 in |
let port = p0 * 256 + p1 in |
214 |
set_rtimeout sock 3600.; |
set_rtimeout sock 3600.; |
215 |
download_on_port c d (x,y) ip port |
download_on_port c d (x,y) ip port |
216 |
| _ -> |
| _ -> |
217 |
lprintf "FTP: cannot read ip address [%s]\n" line; |
lprintf "FTP: cannot read ip address [%s]\n" line; |
218 |
close sock Closed_by_user |
close sock Closed_by_user |
219 |
with e -> |
with e -> |
238 |
iter 0 |
iter 0 |
239 |
); |
); |
240 |
set_rtimeout sock 15.; |
set_rtimeout sock 15.; |
241 |
TcpBufferedSocket.set_closer sock (fun _ _ -> |
TcpBufferedSocket.set_closer sock (fun _ _ -> |
242 |
lprintf "\n+++++++++++ DISCONNECTED ++++++++++++++\n" |
lprintf "\n+++++++++++ DISCONNECTED ++++++++++++++\n" |
|
|
|
243 |
); |
); |
244 |
() |
() |
245 |
|
|
246 |
(*************************************************************************) |
(*************************************************************************) |
247 |
(* *) |
(* *) |
248 |
(* MAIN *) |
(* MAIN *) |
249 |
(* *) |
(* *) |
250 |
(*************************************************************************) |
(*************************************************************************) |
251 |
|
|
252 |
let ftp_set_sock_handler c sock = |
let ftp_set_sock_handler c sock = |
253 |
|
|
254 |
write_reqs sock |
write_reqs sock |
255 |
[ |
[ |
256 |
(* 220 messages... *) |
(* 220 messages... *) |
257 |
"USER anonymous"; |
"USER anonymous"; |
263 |
"PWD"; |
"PWD"; |
264 |
(* 257 "/" *) |
(* 257 "/" *) |
265 |
"TYPE I"; |
"TYPE I"; |
266 |
(* 200 *) |
(* 200 *) |
267 |
] |
] |
268 |
(* set_fileTP_sock sock (HttpHeader (client_parse_header c)) *) |
(* set_fileTP_sock sock (HttpHeader (client_parse_header c)) *) |
269 |
|
|
272 |
(* MAIN *) |
(* MAIN *) |
273 |
(* *) |
(* *) |
274 |
(*************************************************************************) |
(*************************************************************************) |
|
|
|
|
let ftp_check_size url start_download_file = |
|
275 |
|
|
276 |
let reqs = [ |
let ftp_check_size url start_download_file = |
277 |
|
|
278 |
|
let reqs = [ |
279 |
(* 220 messages... *) |
(* 220 messages... *) |
280 |
"USER anonymous"; |
"USER anonymous"; |
281 |
(* 331 *) |
(* 331 *) |
297 |
let buf = Buffer.create 100 in |
let buf = Buffer.create 100 in |
298 |
List.iter (fun s -> Printf.bprintf buf "%s\r\n" s) reqs; |
List.iter (fun s -> Printf.bprintf buf "%s\r\n" s) reqs; |
299 |
let request = Buffer.contents buf in |
let request = Buffer.contents buf in |
300 |
|
|
301 |
let server, port = url.Url.server, url.Url.port in |
let server, port = url.Url.server, url.Url.port in |
302 |
(* lprintf "async_ip ...\n"; *) |
(* lprintf "async_ip ...\n"; *) |
303 |
Ip.async_ip server (fun ip -> |
Ip.async_ip server (fun ip -> |
305 |
let token = create_token unlimited_connection_manager in |
let token = create_token unlimited_connection_manager in |
306 |
let sock = TcpBufferedSocket.connect token "http client connecting" |
let sock = TcpBufferedSocket.connect token "http client connecting" |
307 |
(Ip.to_inet_addr ip) |
(Ip.to_inet_addr ip) |
308 |
port (fun _ e -> |
port (fun _ e -> |
309 |
() |
() |
310 |
) |
) |
311 |
in |
in |
324 |
buf_used b (i+1); |
buf_used b (i+1); |
325 |
if slen > 4 && String.sub line 0 4 = "213 " |
if slen > 4 && String.sub line 0 4 = "213 " |
326 |
then begin |
then begin |
327 |
let result_size = |
let result_size = |
328 |
Int64.of_string (String.sub line 4 (slen - 4)) |
Int64.of_string (String.sub line 4 (slen - 4)) |
329 |
in |
in |
330 |
lprintf "SIZE: [%Ld]\n" result_size; |
lprintf "SIZE: [%Ld]\n" result_size; |
342 |
(* lprintf "Connection closed nread:%b\n" !nread; *) |
(* lprintf "Connection closed nread:%b\n" !nread; *) |
343 |
) |
) |
344 |
); |
); |
|
|
|
345 |
() |
() |
346 |
|
|
347 |
(*************************************************************************) |
(*************************************************************************) |
352 |
|
|
353 |
let ftp_connect token c f = |
let ftp_connect token c f = |
354 |
let ip = Ip.from_name c.client_hostname in |
let ip = Ip.from_name c.client_hostname in |
355 |
connect token "fileTP download" |
connect token "fileTP download" |
356 |
(Ip.to_inet_addr ip) c.client_port |
(Ip.to_inet_addr ip) c.client_port |
357 |
(fun sock event -> |
(fun sock event -> |
358 |
match event with |
match event with |
362 |
disconnect_client c s |
disconnect_client c s |
363 |
|
|
364 |
| CONNECTED -> |
| CONNECTED -> |
365 |
lprintf "CONNECTED !!! Asking for range...\n"; |
lprintf "CONNECTED !!! Asking for range...\n"; |
366 |
f sock |
f sock |
367 |
| _ -> () |
| _ -> () |
368 |
) |
) |
372 |
(* MAIN *) |
(* MAIN *) |
373 |
(* *) |
(* *) |
374 |
(*************************************************************************) |
(*************************************************************************) |
375 |
|
|
376 |
let proto = |
let proto = |
377 |
{ |
{ |
378 |
proto_send_range_request = ftp_send_range_request; |
proto_send_range_request = ftp_send_range_request; |
381 |
proto_string = "ftp"; |
proto_string = "ftp"; |
382 |
proto_connect = ftp_connect; |
proto_connect = ftp_connect; |
383 |
} |
} |
|
|
|
|
|
|