http: add AnnounceResponse.warning_message; set in http_private

This commit is contained in:
Joakim Frostegård 2022-04-03 01:07:16 +02:00
parent 44f4474fb2
commit 70d79b1871
5 changed files with 25 additions and 4 deletions

View file

@ -337,6 +337,7 @@ pub fn handle_announce_request(
announce_interval: config.protocol.peer_announce_interval, announce_interval: config.protocol.peer_announce_interval,
peers: ResponsePeerListV4(response_peers), peers: ResponsePeerListV4(response_peers),
peers6: ResponsePeerListV6(vec![]), peers6: ResponsePeerListV6(vec![]),
warning_message: None,
}; };
response response
@ -366,6 +367,7 @@ pub fn handle_announce_request(
announce_interval: config.protocol.peer_announce_interval, announce_interval: config.protocol.peer_announce_interval,
peers: ResponsePeerListV4(vec![]), peers: ResponsePeerListV4(vec![]),
peers6: ResponsePeerListV6(response_peers), peers6: ResponsePeerListV6(response_peers),
warning_message: None,
}; };
response response

View file

@ -64,14 +64,14 @@ pub async fn validate_announce_request(
user_agent: Option<String>, user_agent: Option<String>,
user_token: String, user_token: String,
request: AnnounceRequest, request: AnnounceRequest,
) -> Result<ValidatedAnnounceRequest, FailureResponse> { ) -> Result<(ValidatedAnnounceRequest, Option<String>), FailureResponse> {
let parameters = let parameters =
AnnounceProcedureParameters::new(source_addr, user_agent, user_token, &request); AnnounceProcedureParameters::new(source_addr, user_agent, user_token, &request);
match call_announce_procedure(pool, parameters).await { match call_announce_procedure(pool, parameters).await {
Ok(results) => { Ok(results) => {
if results.announce_allowed { if results.announce_allowed {
Ok(ValidatedAnnounceRequest(request)) Ok((ValidatedAnnounceRequest(request), results.warning_message))
} else { } else {
Err(FailureResponse::new( Err(FailureResponse::new(
results results

View file

@ -40,7 +40,7 @@ pub async fn announce(
let source_addr = CanonicalSocketAddr::new(source_addr); let source_addr = CanonicalSocketAddr::new(source_addr);
let validated_request = let (validated_request, opt_warning_message) =
db::validate_announce_request(&pool, source_addr, opt_user_agent, user_token, request) db::validate_announce_request(&pool, source_addr, opt_user_agent, user_token, request)
.await .await
.map_err(|r| create_response(Response::Failure(r)))?; .map_err(|r| create_response(Response::Failure(r)))?;
@ -50,10 +50,14 @@ pub async fn announce(
.await .await
.map_err(|err| internal_error(format!("Sending request over channel failed: {:#}", err)))?; .map_err(|err| internal_error(format!("Sending request over channel failed: {:#}", err)))?;
let response = response_receiver.await.map_err(|err| { let mut response = response_receiver.await.map_err(|err| {
internal_error(format!("Receiving response over channel failed: {:#}", err)) internal_error(format!("Receiving response over channel failed: {:#}", err))
})?; })?;
if let Response::Announce(ref mut r) = response {
r.warning_message = opt_warning_message;
}
Ok(create_response(response)) Ok(create_response(response))
} }

View file

@ -21,6 +21,7 @@ pub fn bench(c: &mut Criterion) {
incomplete: 500, incomplete: 500,
peers: ResponsePeerListV4(peers), peers: ResponsePeerListV4(peers),
peers6: ResponsePeerListV6(Vec::new()), peers6: ResponsePeerListV6(Vec::new()),
warning_message: None,
}; };
let response = Response::Announce(announce_response); let response = Response::Announce(announce_response);

View file

@ -51,6 +51,8 @@ pub struct AnnounceResponse {
pub peers: ResponsePeerListV4, pub peers: ResponsePeerListV4,
#[serde(default)] #[serde(default)]
pub peers6: ResponsePeerListV6, pub peers6: ResponsePeerListV6,
#[serde(rename = "warning message")]
pub warning_message: Option<String>,
} }
impl AnnounceResponse { impl AnnounceResponse {
@ -95,6 +97,17 @@ impl AnnounceResponse {
} }
bytes_written += output.write(b"e")?; bytes_written += output.write(b"e")?;
if let Some(ref warning_message) = self.warning_message {
let message_bytes = warning_message.as_bytes();
bytes_written += output.write(b"d15:warning message")?;
bytes_written +=
output.write(itoa::Buffer::new().format(message_bytes.len()).as_bytes())?;
bytes_written += output.write(b":")?;
bytes_written += output.write(message_bytes)?;
bytes_written += output.write(b"e")?;
}
Ok(bytes_written) Ok(bytes_written)
} }
} }
@ -232,6 +245,7 @@ impl quickcheck::Arbitrary for AnnounceResponse {
incomplete: usize::arbitrary(g), incomplete: usize::arbitrary(g),
peers: ResponsePeerListV4::arbitrary(g), peers: ResponsePeerListV4::arbitrary(g),
peers6: ResponsePeerListV6::arbitrary(g), peers6: ResponsePeerListV6::arbitrary(g),
warning_message: quickcheck::Arbitrary::arbitrary(g),
} }
} }
} }