in neqo-http3/src/recv_message.rs [153:196]
fn add_headers(&mut self, mut headers: Vec<Header>, fin: bool) -> Res<()> {
qtrace!("[{self}] Add new headers fin={fin}");
let interim = match self.message_type {
MessageType::Request => false,
MessageType::Response => is_interim(&headers)?,
};
headers_valid(&headers, self.message_type)?;
if self.message_type == MessageType::Response {
headers.retain(Header::is_allowed_for_response);
}
if fin && interim {
return Err(Error::HttpGeneralProtocolStream);
}
let is_web_transport = self.message_type == MessageType::Request
&& headers.contains_header(":method", "CONNECT")
&& headers.contains_header(":protocol", "webtransport");
if is_web_transport {
self.conn_events
.extended_connect_new_session(self.stream_id, headers);
} else {
self.conn_events
.header_ready(self.get_stream_info(), headers, interim, fin);
}
if fin {
self.set_closed();
} else {
self.state = if is_web_transport {
self.stream_type = Http3StreamType::ExtendedConnect;
RecvMessageState::ExtendedConnect
} else if interim {
RecvMessageState::WaitingForResponseHeaders {
frame_reader: FrameReader::new(),
}
} else {
RecvMessageState::WaitingForData {
frame_reader: FrameReader::new(),
}
};
}
Ok(())
}