use super::*;
use crate::{
HttpConfig, KnownHeaderName,
h3::Frame,
headers::qpack::{FieldSection, PseudoHeaders},
};
use encoding_rs::UTF_8;
use futures_lite::{AsyncRead, AsyncReadExt, io::Cursor};
mod frame_decode;
mod received_body;
fn data_frame(payload: &[u8]) -> Vec<u8> {
let frame = Frame::Data(payload.len() as u64);
let header_len = frame.encoded_len();
let mut buf = vec![0u8; header_len + payload.len()];
frame.encode(&mut buf).unwrap();
buf[header_len..].copy_from_slice(payload);
buf
}
fn headers_frame(payload_len: u64) -> Vec<u8> {
let frame = Frame::Headers(payload_len);
let header_len = frame.encoded_len();
let mut buf = vec![0u8; header_len];
frame.encode(&mut buf).unwrap();
buf
}
fn unknown_frame(type_value: u8, payload: &[u8]) -> Vec<u8> {
let mut buf = vec![];
buf.push(type_value); buf.push(payload.len() as u8); buf.extend_from_slice(payload);
buf
}
fn encode_varint(value: u64, out: &mut Vec<u8>) {
if value < (1 << 6) {
out.push(value as u8);
} else if value < (1 << 14) {
out.push(0x40 | (value >> 8) as u8);
out.push(value as u8);
} else if value < (1 << 30) {
out.extend_from_slice(&[
0x80 | (value >> 24) as u8,
(value >> 16) as u8,
(value >> 8) as u8,
value as u8,
]);
} else {
out.extend_from_slice(&[
0xC0 | (value >> 56) as u8,
(value >> 48) as u8,
(value >> 40) as u8,
(value >> 32) as u8,
(value >> 24) as u8,
(value >> 16) as u8,
(value >> 8) as u8,
value as u8,
]);
}
}
fn grease_frame(n: u64, payload: &[u8]) -> Vec<u8> {
let grease_type = 0x1f * n + 0x21;
let mut buf = vec![];
encode_varint(grease_type, &mut buf);
encode_varint(payload.len() as u64, &mut buf);
buf.extend_from_slice(payload);
buf
}