83 pub fn new(id: ClientId, socket: ClientSocket, peer_addr: SocketAddr) -> NetworkClient { |
83 pub fn new(id: ClientId, socket: ClientSocket, peer_addr: SocketAddr) -> NetworkClient { |
84 NetworkClient { |
84 NetworkClient { |
85 id, socket, peer_addr, |
85 id, socket, peer_addr, |
86 decoder: ProtocolDecoder::new(), |
86 decoder: ProtocolDecoder::new(), |
87 buf_out: netbuf::Buf::new() |
87 buf_out: netbuf::Buf::new() |
|
88 } |
|
89 } |
|
90 |
|
91 #[cfg(feature = "tls-connections")] |
|
92 fn handshake_impl(&mut self, handshake: MidHandshakeSslStream<TcpStream>) -> io::Result<NetworkClientState> { |
|
93 match handshake.handshake() { |
|
94 Ok(stream) => { |
|
95 self.socket = ClientSocket::SslStream(stream); |
|
96 debug!("TLS handshake with {} ({}) completed", self.id, self.peer_addr); |
|
97 Ok(NetworkClientState::Idle) |
|
98 } |
|
99 Err(HandshakeError::WouldBlock(new_handshake)) => { |
|
100 self.socket = ClientSocket::SslHandshake(Some(new_handshake)); |
|
101 Ok(NetworkClientState::Idle) |
|
102 } |
|
103 Err(HandshakeError::Failure(_)) => { |
|
104 debug!("TLS handshake with {} ({}) failed", self.id, self.peer_addr); |
|
105 Err(Error::new(ErrorKind::Other, "Connection failure")) |
|
106 } |
|
107 Err(HandshakeError::SetupFailure(_)) => unreachable!() |
88 } |
108 } |
89 } |
109 } |
90 |
110 |
91 fn read_impl<R: Read>(decoder: &mut ProtocolDecoder, source: &mut R, |
111 fn read_impl<R: Read>(decoder: &mut ProtocolDecoder, source: &mut R, |
92 id: ClientId, addr: &SocketAddr) -> NetworkResult<Vec<HWProtocolMessage>> { |
112 id: ClientId, addr: &SocketAddr) -> NetworkResult<Vec<HWProtocolMessage>> { |
133 } |
153 } |
134 |
154 |
135 #[cfg(feature = "tls-connections")] |
155 #[cfg(feature = "tls-connections")] |
136 match self.socket { |
156 match self.socket { |
137 ClientSocket::SslHandshake(ref mut handshake_opt) => { |
157 ClientSocket::SslHandshake(ref mut handshake_opt) => { |
138 let mut handshake = std::mem::replace(handshake_opt, None).unwrap(); |
158 let handshake = std::mem::replace(handshake_opt, None).unwrap(); |
139 |
159 Ok((Vec::new(), self.handshake_impl(handshake)?)) |
140 match handshake.handshake() { |
|
141 Ok(stream) => { |
|
142 debug!("TLS handshake with {} ({}) completed", self.id, self.peer_addr); |
|
143 self.socket = ClientSocket::SslStream(stream); |
|
144 |
|
145 Ok((Vec::new(), NetworkClientState::Idle)) |
|
146 } |
|
147 Err(HandshakeError::WouldBlock(new_handshake)) => { |
|
148 *handshake_opt = Some(new_handshake); |
|
149 Ok((Vec::new(), NetworkClientState::Idle)) |
|
150 } |
|
151 Err(e) => { |
|
152 debug!("TLS handshake with {} ({}) failed", self.id, self.peer_addr); |
|
153 Err(Error::new(ErrorKind::Other, "Connection failure")) |
|
154 } |
|
155 } |
|
156 }, |
160 }, |
157 ClientSocket::SslStream(ref mut stream) => |
161 ClientSocket::SslStream(ref mut stream) => |
158 NetworkClient::read_impl(&mut self.decoder, stream, self.id, &self.peer_addr) |
162 NetworkClient::read_impl(&mut self.decoder, stream, self.id, &self.peer_addr) |
159 } |
163 } |
160 } |
164 } |
184 NetworkClient::write_impl(&mut self.buf_out, stream) |
188 NetworkClient::write_impl(&mut self.buf_out, stream) |
185 } |
189 } |
186 |
190 |
187 #[cfg(feature = "tls-connections")] { |
191 #[cfg(feature = "tls-connections")] { |
188 match self.socket { |
192 match self.socket { |
189 ClientSocket::SslHandshake(_) => |
193 ClientSocket::SslHandshake(ref mut handshake_opt) => { |
190 Ok(((), NetworkClientState::Idle)), |
194 let handshake = std::mem::replace(handshake_opt, None).unwrap(); |
|
195 Ok(((), self.handshake_impl(handshake)?)) |
|
196 } |
191 ClientSocket::SslStream(ref mut stream) => |
197 ClientSocket::SslStream(ref mut stream) => |
192 NetworkClient::write_impl(&mut self.buf_out, stream) |
198 NetworkClient::write_impl(&mut self.buf_out, stream) |
193 } |
199 } |
194 } |
200 } |
195 }; |
201 }; |