1
//! Declare a type for streams that do hostname lookups
2

            
3
use crate::stream::StreamReader;
4
use crate::{Error, Result};
5
use tor_cell::relaycell::msg::{RelayMsg, Resolved};
6

            
7
/// A ResolveStream represents a pending DNS request made with a RESOLVE
8
/// cell.
9
pub struct ResolveStream {
10
    /// The underlying RawCellStream.
11
    s: StreamReader,
12
}
13

            
14
impl ResolveStream {
15
    /// Wrap a RawCellStream into a ResolveStream.
16
    ///
17
    /// Call only after sending a RESOLVE cell.
18
    #[allow(dead_code)] // need to implement a caller for this.
19
    pub(crate) fn new(s: StreamReader) -> Self {
20
        ResolveStream { s }
21
    }
22

            
23
    /// Read a message from this stream telling us the answer to our
24
    /// name lookup request.
25
    pub async fn read_msg(&mut self) -> Result<Resolved> {
26
        let cell = self.s.recv().await?;
27
        match cell {
28
            RelayMsg::End(e) => Err(Error::EndReceived(e.reason())),
29
            RelayMsg::Resolved(r) => Ok(r),
30
            m => {
31
                self.s.protocol_error();
32
                Err(Error::StreamProto(format!(
33
                    "Unexpected {} on resolve stream",
34
                    m.cmd()
35
                )))
36
            }
37
        }
38
    }
39
}