| 125 | } |
| 126 | |
| 127 | async fn read_v2_header<I>( |
| 128 | mut stream: I, |
| 129 | buffer: &mut [u8; READ_BUFFER_LEN], |
| 130 | ) -> Result<Option<Vec<u8>>> |
| 131 | where |
| 132 | I: AsyncRead + Unpin, |
| 133 | { |
| 134 | let length = |
| 135 | u16::from_be_bytes([buffer[V2_LENGTH_INDEX], buffer[V2_LENGTH_INDEX + 1]]) as usize; |
| 136 | let full_length = V2_MINIMUM_LEN + length; |
| 137 | |
| 138 | if full_length > V2_MAX_LENGTH { |
| 139 | bail!("v2 proxy protocol header is too long"); |
| 140 | } |
| 141 | |
| 142 | if full_length > READ_BUFFER_LEN { |
| 143 | let mut dynamic_buffer = Vec::with_capacity(full_length); |
| 144 | dynamic_buffer.extend_from_slice(&buffer[..V2_MINIMUM_LEN]); |
| 145 | dynamic_buffer.resize(full_length, 0); |
| 146 | stream |
| 147 | .read_exact(&mut dynamic_buffer[V2_MINIMUM_LEN..full_length]) |
| 148 | .await?; |
| 149 | |
| 150 | Ok(Some(dynamic_buffer)) |
| 151 | } else { |
| 152 | stream |
| 153 | .read_exact(&mut buffer[V2_MINIMUM_LEN..full_length]) |
| 154 | .await?; |
| 155 | |
| 156 | Ok(None) |
| 157 | } |
| 158 | } |
| 159 | |
| 160 | async fn read_v1_header<I>(mut stream: I, buffer: &mut [u8; READ_BUFFER_LEN]) -> Result<()> |
| 161 | where |