From e26f0f871a9849d6f850f5aa3f57562d80306c6a Mon Sep 17 00:00:00 2001 From: CosminPerRam Date: Sun, 19 Feb 2023 17:56:39 +0200 Subject: [PATCH] [Protocol] Valve: Fix queries that require multiple challenge responses --- CHANGELOG.md | 1 + src/protocols/valve/protocol.rs | 20 +++++++++----------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index df88d9f..7805877 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ the protocols/services, also saves storage space). Protocols: - Valve: 1. Reversed (from `0.1.0`) "Players with no name are no more added to the `players_details` field.", also added a note in the [protocols](PROTOCOLS.md) file regarding this. +2. Fixed querying while multiple challenge responses might happen. ### Breaking: None. diff --git a/src/protocols/valve/protocol.rs b/src/protocols/valve/protocol.rs index 4a8caa7..6b51780 100644 --- a/src/protocols/valve/protocol.rs +++ b/src/protocols/valve/protocol.rs @@ -189,21 +189,19 @@ impl ValveProtocol { /// Ask for a specific request only. fn get_request_data(&mut self, engine: &Engine, protocol: u8, kind: Request) -> GDResult { let request_initial_packet = Packet::initial(kind).to_bytes(); - self.socket.send(&request_initial_packet)?; - let packet = self.receive(engine, protocol, PACKET_SIZE)?; - if packet.kind != 0x41 { //'A' - let data = packet.payload.clone(); - return Ok(Bufferer::new_with_data(Endianess::Little, &data)); + let mut packet = self.receive(engine, protocol, PACKET_SIZE)?; + while packet.kind == 0x41 {// 'A' + let challenge = packet.payload.clone(); + let challenge_packet = Packet::challenge(kind, challenge).to_bytes(); + + self.socket.send(&challenge_packet)?; + + packet = self.receive(engine, protocol, PACKET_SIZE)?; } - let challenge = packet.payload; - let challenge_packet = Packet::challenge(kind, challenge).to_bytes(); - - self.socket.send(&challenge_packet)?; - - let data = self.receive(engine, protocol, PACKET_SIZE)?.payload; + let data = packet.payload; Ok(Bufferer::new_with_data(Endianess::Little, &data)) }