1use std::{
7 io::{BufRead, BufReader, Result, Write},
8 net::TcpStream,
9};
10
11use super::{Event, State};
12
13#[derive(Clone, Debug, Default, Eq, PartialEq)]
14pub struct RipStarttls {
15 state: super::RipStarttls,
16}
17
18impl RipStarttls {
19 pub fn new(handshake_discarded: bool) -> Self {
20 let state = super::RipStarttls::new(handshake_discarded);
21 Self { state }
22 }
23
24 pub fn do_starttls_prefix(mut self, mut stream: TcpStream) -> Result<TcpStream> {
25 let mut event = None;
26
27 while let Some(output) = self.state.resume(event.take()) {
28 match output {
29 State::DiscardHandshake => {
30 let mut line = String::new();
31 let mut reader = BufReader::new(stream);
32 reader.read_line(&mut line)?;
33 event = Some(Event::HandshakeDiscarded(line));
34 stream = reader.into_inner();
35 }
36 State::WriteStarttlsCommand => {
37 let cmd = super::RipStarttls::COMMAND;
38 let count = stream.write(cmd.as_bytes())?;
39 event = Some(Event::StarttlsCommandWrote(count));
40 }
41 State::DiscardResponse => {
42 let mut line = String::new();
43 let mut reader = BufReader::new(stream);
44 reader.read_line(&mut line)?;
45 event = Some(Event::ResponseDiscarded(line));
46 stream = reader.into_inner();
47 }
48 }
49 }
50
51 Ok(stream)
52 }
53}