1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
//! Functionality for incoming streams, opened from the other side of a circuit.
#![allow(
dead_code,
unused_variables,
clippy::missing_panics_doc,
clippy::needless_pass_by_value
)] // TODO hs remove
use super::DataStream;
/// A pending request from the other end of the circuit for us to open a new
/// stream.
///
/// Exits, directory caches, and onion services expect to receive these; others
/// do not.
///
/// On receiving one of these objects, the party handling it should accept it or
/// reject it. If it is dropped without being explicitly handled, a reject
/// message will be sent anyway.
#[derive(Debug)]
pub struct IncomingStream {
/// The message that the client sent us to begin the stream.
request: IncomingStreamRequest,
/// The information that we'll use to wire up the stream, if it is accepted.
stream: crate::circuit::StreamTarget,
}
/// A message that can be sent to begin a stream.
//
// TODO hs perhaps this should be made with restricted_msg!()
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum IncomingStreamRequest {
/// A begin cell, which requests a new data stream.
Begin(tor_cell::relaycell::msg::Begin),
// TODO: Eventually, add a BeginDir variant
// TODO: eventually, add a Resolve variant.
}
impl IncomingStream {
/// Return the underlying message that was used to try to begin this stream.
pub fn request(&self) -> IncomingStreamRequest {
todo!()
}
/// Accept this stream as a new [`DataStream`], and send the client a
/// message letting them know the stream was accepted.
pub fn accept_data(self, message: tor_cell::relaycell::msg::Connected) -> DataStream {
todo!()
}
/// Reject this request and send an error message to the client.
pub fn reject(self, message: tor_cell::relaycell::msg::End) {
todo!() // TODO hs
}
/// Ignore this request without replying to the client.
///
/// (If you drop an [`IncomingStream`] without calling `accept_data`,
/// `reject`, or this method, the drop handler will cause it to be
/// rejected.)
pub fn discard(self) {
todo!() // TODO hs
}
}
// TODO hs: dropping an IncomingStream without accepting or rejecting it should
// cause it to call `reject`.
|