accept_connection.rs 1.38 KiB
Newer Older
Marek Kotewicz's avatar
Marek Kotewicz committed
use std::{net, io};
use std::time::Duration;
Marek Kotewicz's avatar
Marek Kotewicz committed
use futures::{Future, Poll};
use tokio_core::reactor::Handle;
use tokio_core::net::TcpStream;
use network::Magic;
use message::{MessageResult};
use io::{accept_handshake, AcceptHandshake, Deadline, deadline};
Marek Kotewicz's avatar
Marek Kotewicz committed
use net::{Config, Connection};

pub fn accept_connection(stream: TcpStream, handle: &Handle, config: &Config, address: net::SocketAddr) -> Deadline<AcceptConnection> {
	let accept = AcceptConnection {
Svyatoslav Nikolsky's avatar
Svyatoslav Nikolsky committed
		handshake: accept_handshake(stream, config.serialization_flags, config.magic, config.version(&address), config.protocol_minimum),
Marek Kotewicz's avatar
Marek Kotewicz committed
		magic: config.magic,
		address: address,
	};

	deadline(Duration::new(5, 0), handle, accept).expect("Failed to create timeout")
Marek Kotewicz's avatar
Marek Kotewicz committed
}

pub struct AcceptConnection {
	handshake: AcceptHandshake<TcpStream>,
Marek Kotewicz's avatar
Marek Kotewicz committed
	magic: Magic,
	address: net::SocketAddr,
}

impl Future for AcceptConnection {
	type Item = MessageResult<Connection>;
	type Error = io::Error;
Marek Kotewicz's avatar
Marek Kotewicz committed

	fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
		let (stream, result) = try_ready!(self.handshake.poll());
		let result = match result {
			Ok(result) => result,
			Err(err) => return Ok(Err(err).into()),
		};
Marek Kotewicz's avatar
Marek Kotewicz committed
		let connection = Connection {
Marek Kotewicz's avatar
Marek Kotewicz committed
			stream: stream.into(),
			services: result.version.services(),
			version: result.negotiated_version,
			version_message: result.version, 
Marek Kotewicz's avatar
Marek Kotewicz committed
			magic: self.magic,
			address: self.address,
		};
		Ok(Ok(connection).into())
Marek Kotewicz's avatar
Marek Kotewicz committed
	}
}