/[mldonkey]/mldonkey/src/networks/fileTP/fileTPFTP.ml
ViewVC logotype

Diff of /mldonkey/src/networks/fileTP/fileTPFTP.ml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.6 by spiralvoice, Wed Mar 2 19:28:16 2005 UTC revision 1.7 by spiralvoice, Tue Jul 26 23:16:48 2005 UTC
# Line 25  open Options Line 25  open Options
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
# Line 36  open CommonComplexOptions Line 36  open CommonComplexOptions
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
# Line 60  let range_reader c d counter_pos end_pos Line 60  let range_reader c d counter_pos end_pos
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"
# Line 70  end_pos !counter_pos b.len to_read; Line 70  end_pos !counter_pos b.len to_read;
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  (*  (*
# Line 126  let download_on_port c d (x,y) ip port = Line 125  let download_on_port c d (x,y) ip port =
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
# Line 138  let download_on_port c d (x,y) ip port = Line 137  let download_on_port c d (x,y) ip port =
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
# Line 149  let write_reqs sock reqs = Line 148  let write_reqs sock reqs =
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
# Line 159  let write_reqs sock reqs = Line 158  let write_reqs sock reqs =
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  (*************************************************************************)  (*************************************************************************)
# Line 168  let write_reqs sock reqs = Line 167  let write_reqs sock reqs =
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";
# Line 186  let ftp_send_range_request c (x,y) sock Line 185  let ftp_send_range_request c (x,y) sock
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 =
# Line 200  let ftp_send_range_request c (x,y) sock Line 198  let ftp_send_range_request c (x,y) sock
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 ->
# Line 240  let ftp_send_range_request c (x,y) sock Line 238  let ftp_send_range_request c (x,y) sock
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";
# Line 266  let ftp_set_sock_handler c sock = Line 263  let ftp_set_sock_handler c sock =
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    
# Line 275  let ftp_set_sock_handler c sock = Line 272  let ftp_set_sock_handler c sock =
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 *)
# Line 300  let ftp_check_size url start_download_fi Line 297  let ftp_check_size url start_download_fi
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 ->
# Line 308  let ftp_check_size url start_download_fi Line 305  let ftp_check_size url start_download_fi
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
# Line 327  let ftp_check_size url start_download_fi Line 324  let ftp_check_size url start_download_fi
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;
# Line 345  let ftp_check_size url start_download_fi Line 342  let ftp_check_size url start_download_fi
342  (*        lprintf "Connection closed nread:%b\n" !nread; *)  (*        lprintf "Connection closed nread:%b\n" !nread; *)
343        )        )
344    );    );
     
345    ()    ()
346    
347  (*************************************************************************)  (*************************************************************************)
# Line 356  let ftp_check_size url start_download_fi Line 352  let ftp_check_size url start_download_fi
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
# Line 366  let ftp_connect token c f = Line 362  let ftp_connect token c f =
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      )      )
# Line 376  let ftp_connect token c f = Line 372  let ftp_connect token c f =
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;
# Line 385  let proto = Line 381  let proto =
381      proto_string = "ftp";      proto_string = "ftp";
382      proto_connect = ftp_connect;      proto_connect = ftp_connect;
383    }    }
     
     

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.7

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26