@ -46,9 +46,9 @@ named!(pub ftp_pasv_response<u16>,
take_until_and_consume ! ( "(" ) > >
take_until_and_consume ! ( "(" ) > >
digit > > tag ! ( "," ) > > digit > > tag ! ( "," ) > >
digit > > tag ! ( "," ) > > digit > > tag ! ( "," ) > >
digit > > tag ! ( "," ) > > digit > > tag ! ( "," ) > >
digit > > tag ! ( "," ) > > digit > > tag ! ( "," ) > >
part1 : getu16 > >
part1 : verify! ( getu16, | v | v < = std ::u8 ::MAX as u16 ) > >
tag ! ( "," ) > >
tag ! ( "," ) > >
part2 : getu16 > >
part2 : verify! ( getu16, | v | v < = std ::u8 ::MAX as u16 ) > >
alt ! ( tag ! ( ")." ) | tag ! ( ")" ) ) > >
alt ! ( tag ! ( ")." ) | tag ! ( ")" ) ) > >
(
(
part1 * 256 + part2
part1 * 256 + part2
@ -108,3 +108,24 @@ pub extern "C" fn rs_ftp_epsv_response(input: *const libc::uint8_t, len: libc::u
}
}
return 0 ;
return 0 ;
}
}
#[ cfg(test) ]
mod test {
use super ::* ;
#[ test ]
fn test_pasv_response_valid ( ) {
let port = ftp_pasv_response ( "227 Entering Passive Mode (212,27,32,66,221,243)." . as_bytes ( ) ) ;
assert_eq! ( port , Ok ( ( & b" " [ .. ] , 56819 ) ) ) ;
}
// A port that is too large for a u16.
#[ test ]
fn test_pasv_response_too_large ( ) {
let port = ftp_pasv_response ( "227 Entering Passive Mode (212,27,32,66,257,243)." . as_bytes ( ) ) ;
assert! ( port . is_err ( ) ) ;
let port = ftp_pasv_response ( "227 Entering Passive Mode (212,27,32,66,255,65535)." . as_bytes ( ) ) ;
assert! ( port . is_err ( ) ) ;
}
}