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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
// Copyright (C) 2015 Benjamin Fry <benjaminfry@me.com> // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //! TCP based DNS client connection for Client impls use std::io; use std::net::SocketAddr; use std::time::Duration; use futures::Future; use tokio_tcp::TcpStream; use trust_dns_proto::DnsStreamHandle; use error::*; use client::ClientConnection; use tcp::TcpClientStream; /// Tcp client connection /// /// Use with `trust_dns::client::Client` impls #[derive(Clone)] pub struct TcpClientConnection { name_server: SocketAddr, timeout: Duration, } impl TcpClientConnection { /// Creates a new client connection. /// /// *Note* this has side affects of establishing the connection to the specified DNS server and /// starting the event_loop. Expect this to change in the future. /// /// Default connection timeout is 5 seconds /// /// # Arguments /// /// * `name_server` - address of the name server to use for queries pub fn new(name_server: SocketAddr) -> ClientResult<Self> { Self::with_timeout(name_server, Duration::from_secs(5)) } /// Creates a new client connection. /// /// *Note* this has side affects of establishing the connection to the specified DNS server and /// starting the event_loop. Expect this to change in the future. /// /// # Arguments /// /// * `name_server` - address of the name server to use for queries pub fn with_timeout(name_server: SocketAddr, timeout: Duration) -> ClientResult<Self> { Ok(TcpClientConnection { name_server, timeout, }) } } impl ClientConnection for TcpClientConnection { type MessageStream = TcpClientStream<TcpStream>; fn new_stream( &self, ) -> ClientResult< ( Box<Future<Item = Self::MessageStream, Error = io::Error> + Send>, Box<DnsStreamHandle<Error = ClientError> + Send>, ), > { let (tcp_client_stream, handle) = TcpClientStream::<TcpStream>::with_timeout(self.name_server, self.timeout); Ok((tcp_client_stream, handle)) } }