changed return value from `String` to `Box<str>` which is smaller and makes more sense since we don't mutate packet data String — 24 bytes (ptr + len + capacity) Box<str> — 16 bytes (ptr + len)
44 lines
1.2 KiB
Rust
44 lines
1.2 KiB
Rust
use std::io::Read;
|
|
|
|
use pumpkin_data::packet::serverbound::PLAY_COOKIE_RESPONSE;
|
|
use pumpkin_macros::java_packet;
|
|
use pumpkin_util::version::JavaMinecraftVersion;
|
|
|
|
use crate::{
|
|
ServerPacket,
|
|
ser::{NetworkReadExt, ReadingError},
|
|
};
|
|
|
|
#[java_packet(PLAY_COOKIE_RESPONSE)]
|
|
/// Response to a `CCookieRequest` (play) from the server.
|
|
/// The Notchian (vanilla) server only accepts responses of up to 5 KiB in size.
|
|
pub struct SCookieResponse {
|
|
pub key: Box<str>,
|
|
pub payload: Option<Box<[u8]>>, // 5120,
|
|
}
|
|
|
|
const MAX_COOKIE_LENGTH: usize = 5120;
|
|
|
|
impl ServerPacket for SCookieResponse {
|
|
fn read(mut read: impl Read, _version: &JavaMinecraftVersion) -> Result<Self, ReadingError> {
|
|
let key = read.get_str()?;
|
|
let has_payload = read.get_bool()?;
|
|
|
|
if !has_payload {
|
|
return Ok(Self { key, payload: None });
|
|
}
|
|
|
|
let payload_length = read.get_var_int()?.0 as usize;
|
|
if payload_length > MAX_COOKIE_LENGTH {
|
|
return Err(ReadingError::TooLarge("SCookieResponse".to_string()));
|
|
}
|
|
|
|
let payload = read.read_boxed_slice(payload_length)?;
|
|
|
|
Ok(Self {
|
|
key,
|
|
payload: Some(payload),
|
|
})
|
|
}
|
|
}
|