aquatic: run_event_loop: extract inner logic to own function

This commit is contained in:
Joakim Frostegård 2020-04-06 19:55:30 +02:00
parent 8426e8f3f7
commit ad1fa5b833

View file

@ -81,86 +81,110 @@ pub fn run_event_loop(
if token.0 == token_num { if token.0 == token_num {
if event.is_readable(){ if event.is_readable(){
loop { handle_readable_socket(
match socket.recv_from(&mut buffer) {
Ok((amt, src)) => {
let request = request_from_bytes(
&buffer[..amt],
255u8 // FIXME
);
match request {
Ok(Request::Connect(r)) => {
connect_requests.push((r, src));
},
Ok(Request::Announce(r)) => {
announce_requests.push((r, src));
},
Ok(Request::Scrape(r)) => {
scrape_requests.push((r, src));
},
Ok(Request::Invalid(r)) => {
let response = Response::Error(ErrorResponse {
transaction_id: r.transaction_id,
message: "Invalid request".to_string(),
});
responses.push((response, src));
},
Err(err) => {
eprintln!("Request parse error: {:?}", err);
},
}
},
Err(err) => {
match err.kind() {
ErrorKind::WouldBlock => {
break;
},
err => {
eprintln!("recv_from error: {:?}", err);
}
}
}
}
}
handle_connect_requests(
&state, &state,
&mut socket,
&mut buffer,
&mut responses, &mut responses,
connect_requests.drain(..) &mut connect_requests,
); &mut announce_requests,
handle_announce_requests( &mut scrape_requests
&state,
&mut responses,
announce_requests.drain(..),
);
handle_scrape_requests(
&state,
&mut responses,
scrape_requests.drain(..),
); );
for (response, src) in responses.drain(..) { poll.registry()
let bytes = response_to_bytes(&response, IpVersion::IPv4); .reregister(&mut socket, token, interests)
.unwrap();
match socket.send_to(&bytes[..], src){ }
Ok(_bytes_sent) => { }
}, }
Err(err) => { }
match err.kind(){ }
ErrorKind::WouldBlock => {
break;
}, /// Read requests, generate and send back responses
err => { fn handle_readable_socket(
eprintln!("send_to error: {:?}", err); state: &State,
} socket: &mut UdpSocket,
} buffer: &mut [u8],
} responses: &mut Vec<(Response, SocketAddr)>,
} connect_requests: &mut Vec<(ConnectRequest, SocketAddr)>,
} announce_requests: &mut Vec<(AnnounceRequest, SocketAddr)>,
scrape_requests: &mut Vec<(ScrapeRequest, SocketAddr)>,
poll.registry().reregister(&mut socket, token, interests).unwrap(); ){
loop {
match socket.recv_from(buffer) {
Ok((amt, src)) => {
let request = request_from_bytes(
&buffer[..amt],
255u8 // FIXME
);
match request {
Ok(Request::Connect(r)) => {
connect_requests.push((r, src));
},
Ok(Request::Announce(r)) => {
announce_requests.push((r, src));
},
Ok(Request::Scrape(r)) => {
scrape_requests.push((r, src));
},
Ok(Request::Invalid(r)) => {
let response = Response::Error(ErrorResponse {
transaction_id: r.transaction_id,
message: "Invalid request".to_string(),
});
responses.push((response, src));
},
Err(err) => {
eprintln!("request_from_bytes error: {:?}", err);
},
}
},
Err(err) => {
match err.kind() {
ErrorKind::WouldBlock => {
break;
},
err => {
eprintln!("recv_from error: {:?}", err);
}
}
}
}
}
handle_connect_requests(
state,
responses,
connect_requests.drain(..)
);
handle_announce_requests(
state,
responses,
announce_requests.drain(..),
);
handle_scrape_requests(
state,
responses,
scrape_requests.drain(..),
);
for (response, src) in responses.drain(..) {
let bytes = response_to_bytes(&response, IpVersion::IPv4);
match socket.send_to(&bytes[..], src){
Ok(_bytes_sent) => {
},
Err(err) => {
match err.kind(){
ErrorKind::WouldBlock => {
break;
},
err => {
eprintln!("send_to error: {:?}", err);
}
} }
} }
} }