proxy_protocol_codec/
lib.rs1#![no_std]
6#![cfg_attr(feature = "feat-nightly", feature(cold_path))]
7
8#[cfg(feature = "feat-codec-v2-uni-addr")]
9compile_error!("The `feat-codec-v2-uni-addr` feature is deprecated. Please use the `feat-uni-addr` feature instead.");
10
11#[cfg(feature = "feat-codec-v1")]
12pub mod v1;
13#[cfg(feature = "feat-codec-v2")]
14pub mod v2;
15
16#[cfg(any(test, feature = "feat-alloc"))]
17extern crate alloc;
18
19#[cfg(any(test, feature = "feat-std"))]
20extern crate std;
21
22#[derive(Debug, Clone, Copy, PartialEq, Eq)]
23pub enum Version {
25 V1,
27
28 V2,
30}
31
32impl Version {
33 pub const MAGIC_V1: &'static str = "PROXY";
35 pub const MAGIC_V2: &'static [u8; 12] = b"\r\n\r\n\x00\r\nQUIT\n";
37
38 pub fn peek(buf: &[u8]) -> Result<Option<Self>, ()> {
48 const V1_MAGIC_LEN: usize = Version::MAGIC_V1.len();
49 const V2_MAGIC_LEN: usize = Version::MAGIC_V2.len();
50
51 match buf.len() {
52 0 => Ok(None),
53 1..V2_MAGIC_LEN if Self::MAGIC_V2.starts_with(buf) => Ok(None),
54 V2_MAGIC_LEN.. if buf.starts_with(Self::MAGIC_V2) => Ok(Some(Self::V2)),
55 1..V1_MAGIC_LEN if Self::MAGIC_V1.as_bytes().starts_with(buf) => Ok(None),
56 V1_MAGIC_LEN.. if buf.starts_with(Self::MAGIC_V1.as_bytes()) => Ok(Some(Self::V1)),
57 _ => Err(()),
58 }
59 }
60}