gameServer2/src/server/network.rs
changeset 13802 24fe56d3c6a2
parent 13799 c8fd12db6215
child 13803 fea7c23d9c2c
equal deleted inserted replaced
13801:5fb40c8e5542 13802:24fe56d3c6a2
    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         };