aquatic http procotol: rewite Request::from_bytes, test it

This commit is contained in:
Joakim Frostegård 2020-07-20 21:13:48 +02:00
parent ea4b560faa
commit 114b8007e1

View file

@ -129,23 +129,31 @@ impl Request {
let mut headers = [httparse::EMPTY_HEADER; 16]; let mut headers = [httparse::EMPTY_HEADER; 16];
let mut http_request = httparse::Request::new(&mut headers); let mut http_request = httparse::Request::new(&mut headers);
match http_request.parse(bytes){ let path = match http_request.parse(bytes){
Ok(httparse::Status::Complete(_)) => { Ok(httparse::Status::Complete(_)) => {
if let Some(path) = http_request.path { if let Some(path) = http_request.path {
let res_request = Self::from_http_get_path(path); path
res_request.map_err(RequestParseError::Invalid)
} else { } else {
Err(RequestParseError::Invalid(anyhow::anyhow!("no http path"))) return Err(RequestParseError::Invalid(
anyhow::anyhow!("no http path")
))
} }
}, },
Ok(httparse::Status::Partial) => { Ok(httparse::Status::Partial) => {
Err(RequestParseError::NeedMoreData) if let Some(path) = http_request.path {
}, path
} else {
return Err(RequestParseError::NeedMoreData)
}
}
Err(err) => { Err(err) => {
Err(RequestParseError::Invalid(anyhow::anyhow!("httparse: {:?}", err))) return Err(RequestParseError::Invalid(
} anyhow::Error::from(err)
} ))
},
};
Self::from_http_get_path(path).map_err(RequestParseError::Invalid)
} }
/// Parse Request from http path (GET `/announce?info_hash=...`) /// Parse Request from http path (GET `/announce?info_hash=...`)
@ -430,32 +438,21 @@ mod tests {
bytes.extend_from_slice(&ANNOUNCE_REQUEST_PATH.as_bytes()); bytes.extend_from_slice(&ANNOUNCE_REQUEST_PATH.as_bytes());
bytes.extend_from_slice(b" HTTP/1.1\r\n\r\n"); bytes.extend_from_slice(b" HTTP/1.1\r\n\r\n");
let parsed_request = Request::from_bytes( let parsed_request = Request::from_bytes(&bytes[..]).unwrap();
&bytes[..]
).unwrap();
let reference_request = get_reference_announce_request(); let reference_request = get_reference_announce_request();
assert_eq!(parsed_request, reference_request); assert_eq!(parsed_request, reference_request);
} }
#[test] #[test]
fn test_announce_request_from_path(){ fn test_scrape_request_from_bytes(){
let parsed_request = Request::from_http_get_path( let mut bytes = Vec::new();
ANNOUNCE_REQUEST_PATH
).unwrap();
let reference_request = get_reference_announce_request(); bytes.extend_from_slice(b"GET ");
bytes.extend_from_slice(&SCRAPE_REQUEST_PATH.as_bytes());
assert_eq!(parsed_request, reference_request); bytes.extend_from_slice(b" HTTP/1.1\r\n\r\n");
}
#[test]
fn test_scrape_request_from_path(){
let parsed_request = Request::from_http_get_path(
SCRAPE_REQUEST_PATH
).unwrap();
let parsed_request = Request::from_bytes(&bytes[..]).unwrap();
let reference_request = Request::Scrape(ScrapeRequest { let reference_request = Request::Scrape(ScrapeRequest {
info_hashes: vec![InfoHash(REFERENCE_INFO_HASH)], info_hashes: vec![InfoHash(REFERENCE_INFO_HASH)],
}); });