ftp: cosmetic fixes
Use single quotes for strings. Use string interpolation instead of concatenation. Don't print messages in non-debug mode. Fix typos in error messages. Add space after comma, add spaces between operators. extract code to separate functionspull/3250/head
							parent
							
								
									c09ce9cb42
								
							
						
					
					
						commit
						f40f023487
					
				
							
								
								
									
										103
									
								
								vlib/ftp/ftp.v
								
								
								
								
							
							
						
						
									
										103
									
								
								vlib/ftp/ftp.v
								
								
								
								
							|  | @ -5,7 +5,7 @@ | ||||||
| 
 | 
 | ||||||
| 	Methods: | 	Methods: | ||||||
| 	ftp.connect(host) | 	ftp.connect(host) | ||||||
| 	ftp.login(user,passw) | 	ftp.login(user, passw) | ||||||
| 	pwd := ftp.pwd() | 	pwd := ftp.pwd() | ||||||
| 	ftp.cd(folder) | 	ftp.cd(folder) | ||||||
| 	dtp := ftp.pasv() | 	dtp := ftp.pasv() | ||||||
|  | @ -44,10 +44,10 @@ mut: | ||||||
| fn (dtp DTP) read() []byte { | fn (dtp DTP) read() []byte { | ||||||
| 	mut data := []byte | 	mut data := []byte | ||||||
| 	for { | 	for { | ||||||
| 		buf,len := dtp.sock.recv(1024) | 		buf, len := dtp.sock.recv(1024) | ||||||
| 		if len == 0 { break } | 		if len == 0 { break } | ||||||
| 
 | 
 | ||||||
| 		for i:=0;i<len;i++ { | 		for i := 0; i < len; i++ { | ||||||
| 			data << buf[i] | 			data << buf[i] | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -75,20 +75,20 @@ fn (ftp FTP) write(data string) ?int { | ||||||
| 	$if debug { | 	$if debug { | ||||||
| 		println('FTP.v >>> $data') | 		println('FTP.v >>> $data') | ||||||
| 	} | 	} | ||||||
| 	n := ftp.sock.send_string(data + '\n') or { | 	n := ftp.sock.send_string('$data\n') or { | ||||||
| 		return error('cannot send data') | 		return error('Cannot send data') | ||||||
| 	} | 	} | ||||||
| 	return n | 	return n | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn (ftp FTP) read() (int,string) { | fn (ftp FTP) read() (int, string) { | ||||||
| 	mut data := ftp.sock.read_line() | 	mut data := ftp.sock.read_line() | ||||||
| 	$if debug { | 	$if debug { | ||||||
| 		println('FTP.v <<< $data') | 		println('FTP.v <<< $data') | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if data.len < 5 { | 	if data.len < 5 { | ||||||
| 		return 0,'' | 		return 0, '' | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	code := data[0..3].int() | 	code := data[0..3].int() | ||||||
|  | @ -101,7 +101,7 @@ fn (ftp FTP) read() (int,string) { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return code,data | 	return code, data | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn (ftp mut FTP) connect(ip string) bool { | pub fn (ftp mut FTP) connect(ip string) bool { | ||||||
|  | @ -110,7 +110,7 @@ pub fn (ftp mut FTP) connect(ip string) bool { | ||||||
| 	} | 	} | ||||||
| 	ftp.sock = sock | 	ftp.sock = sock | ||||||
| 
 | 
 | ||||||
| 	code,_ := ftp.read() | 	code, _ := ftp.read() | ||||||
| 	if code == Connected { | 	if code == Connected { | ||||||
| 		return true | 		return true | ||||||
| 	} | 	} | ||||||
|  | @ -119,16 +119,17 @@ pub fn (ftp mut FTP) connect(ip string) bool { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn (ftp FTP) login(user, passwd string) bool { | pub fn (ftp FTP) login(user, passwd string) bool { | ||||||
| 
 | 	ftp.write('USER $user') or { | ||||||
| 	ftp.write('USER '+user) or { | 		$if debug { | ||||||
| 			println('ERROR sending user') | 			println('ERROR sending user') | ||||||
|  | 		} | ||||||
| 		return false | 		return false | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	mut data := '' | 	mut data := '' | ||||||
| 	mut code := 0 | 	mut code := 0 | ||||||
| 
 | 
 | ||||||
| 	code,data = ftp.read() | 	code, data = ftp.read() | ||||||
| 	if code == LoggedIn { | 	if code == LoggedIn { | ||||||
| 		return true | 		return true | ||||||
| 	} | 	} | ||||||
|  | @ -137,12 +138,14 @@ pub fn (ftp FTP) login(user, passwd string) bool { | ||||||
| 		return false | 		return false | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	ftp.write('PASS '+passwd) or { | 	ftp.write('PASS $passwd') or { | ||||||
|  | 		$if debug { | ||||||
| 			println('ERROR sending password') | 			println('ERROR sending password') | ||||||
|  | 		} | ||||||
| 		return false | 		return false | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	code,data = ftp.read() | 	code, data = ftp.read() | ||||||
| 
 | 
 | ||||||
| 	if code == LoggedIn { | 	if code == LoggedIn { | ||||||
| 		return true | 		return true | ||||||
|  | @ -161,7 +164,7 @@ pub fn (ftp FTP) pwd() string { | ||||||
| 	ftp.write('PWD') or { | 	ftp.write('PWD') or { | ||||||
| 		return '' | 		return '' | ||||||
| 	} | 	} | ||||||
| 	_,data := ftp.read() | 	_, data := ftp.read() | ||||||
| 	spl := data.split('"') | 	spl := data.split('"') | ||||||
| 	if spl.len >= 2 { | 	if spl.len >= 2 { | ||||||
| 		return spl[1] | 		return spl[1] | ||||||
|  | @ -174,35 +177,34 @@ pub fn (ftp FTP) cd(dir string) { | ||||||
| 	mut code, mut data := ftp.read() | 	mut code, mut data := ftp.read() | ||||||
| 	match code { | 	match code { | ||||||
| 		Denied { | 		Denied { | ||||||
| 			println("CD $dir denied!") | 			$if debug { | ||||||
|  | 				println('CD $dir denied!') | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 		Complete { | 		Complete { | ||||||
| 			code,data = ftp.read() | 			code, data = ftp.read() | ||||||
| 		} | 		} | ||||||
| 		else {} | 		else {} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	println('cd $data') | 	$if debug { | ||||||
|  | 		println('CD $data') | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn new_dtp(msg string) ?DTP { | fn new_dtp(msg string) ?DTP { | ||||||
| 	// it receives a control message 227 like: 
 | 	if !is_dtp_message_valid(msg) { | ||||||
| 	// '227 Entering Passive Mode (209,132,183,61,48,218)'
 | 		return error('Bad message') | ||||||
| 
 |  | ||||||
| 	if !msg.contains('(') || !msg.contains(')') || !msg.contains(',') { |  | ||||||
| 		return error('bad message') |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	t := msg.split('(')[1].split(')')[0].split(',') | 	ip, port := get_host_ip_from_dtp_message(msg) | ||||||
| 	ip := t[0]+'.'+t[1]+'.'+t[2]+'.'+t[3] |  | ||||||
| 	port := t[4].int()*256+t[5].int() |  | ||||||
| 
 | 
 | ||||||
| 	sock := net.dial(ip, port) or { | 	sock := net.dial(ip, port) or { | ||||||
| 		return error('Cant connect to the data channel') | 		return error('Cannot connect to the data channel') | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	dtp := DTP { | 	dtp := DTP { | ||||||
| 		sock : sock  | 		sock: sock | ||||||
| 		ip: ip | 		ip: ip | ||||||
| 		port: port | 		port: port | ||||||
| 	} | 	} | ||||||
|  | @ -211,8 +213,10 @@ fn new_dtp(msg string) ?DTP { | ||||||
| 
 | 
 | ||||||
| fn (ftp FTP) pasv() ?DTP { | fn (ftp FTP) pasv() ?DTP { | ||||||
| 	ftp.write('PASV') or {} | 	ftp.write('PASV') or {} | ||||||
| 	code,data := ftp.read() | 	code, data := ftp.read() | ||||||
| 	println("pass: $data") | 	$if debug { | ||||||
|  | 		println('pass: $data') | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	if code != PassiveMode { | 	if code != PassiveMode { | ||||||
| 		return error('pasive mode not allowed') | 		return error('pasive mode not allowed') | ||||||
|  | @ -229,16 +233,16 @@ pub fn (ftp FTP) dir() ?[]string { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	ftp.write('LIST') or {} | 	ftp.write('LIST') or {} | ||||||
| 	code,_ := ftp.read() | 	code, _ := ftp.read() | ||||||
| 	if code == Denied { | 	if code == Denied { | ||||||
| 		return error('list denied') | 		return error('LIST denied') | ||||||
| 	} | 	} | ||||||
| 	if code != OpenDataConnection { | 	if code != OpenDataConnection { | ||||||
| 		return error('data channel empty') | 		return error('data channel empty') | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	list_dir := dtp.read() | 	list_dir := dtp.read() | ||||||
| 	result,_ := ftp.read() | 	result, _ := ftp.read() | ||||||
| 	if result != CloseDataConnection { | 	if result != CloseDataConnection { | ||||||
| 		println('LIST not ok') | 		println('LIST not ok') | ||||||
| 	} | 	} | ||||||
|  | @ -258,18 +262,18 @@ pub fn (ftp FTP) dir() ?[]string { | ||||||
| 
 | 
 | ||||||
| pub fn (ftp FTP) get(file string) ?[]byte { | pub fn (ftp FTP) get(file string) ?[]byte { | ||||||
| 	dtp := ftp.pasv() or { | 	dtp := ftp.pasv() or { | ||||||
| 		return error('cant stablish data connection') | 		return error('Cannot stablish data connection') | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	ftp.write('RETR $file') or {} | 	ftp.write('RETR $file') or {} | ||||||
| 	code,_ := ftp.read() | 	code, _ := ftp.read() | ||||||
| 
 | 
 | ||||||
| 	if code == Denied { | 	if code == Denied { | ||||||
| 		return error('permission denied') | 		return error('Permission denied') | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if code != OpenDataConnection { | 	if code != OpenDataConnection { | ||||||
| 		return error('data connection not ready') | 		return error('Data connection not ready') | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	blob := dtp.read() | 	blob := dtp.read() | ||||||
|  | @ -277,3 +281,28 @@ pub fn (ftp FTP) get(file string) ?[]byte { | ||||||
| 
 | 
 | ||||||
| 	return blob | 	return blob | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | fn is_dtp_message_valid(msg string) bool { | ||||||
|  | 	// An example of message:
 | ||||||
|  | 	// '227 Entering Passive Mode (209,132,183,61,48,218)'
 | ||||||
|  | 	return msg.contains('(') && msg.contains(')') && msg.contains(',') | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn get_host_ip_from_dtp_message(msg string) (string, int) { | ||||||
|  | 	mut par_start_idx := -1 | ||||||
|  | 	mut par_end_idx := -1 | ||||||
|  | 
 | ||||||
|  | 	for i, c in msg { | ||||||
|  | 		if c == `(` { | ||||||
|  | 			par_start_idx = i + 1 | ||||||
|  | 		} else if c == `)` { | ||||||
|  | 			par_end_idx = i | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	data := msg[par_start_idx..par_end_idx].split(',') | ||||||
|  | 
 | ||||||
|  | 	ip := data[0..4].join('.') | ||||||
|  | 	port := data[4].int() * 256 + data[5].int() | ||||||
|  | 
 | ||||||
|  | 	return ip, port | ||||||
|  | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue