1
0
mirror of https://github.com/fafhrd91/actix-net synced 2024-11-27 19:12:56 +01:00

use same Request for OpensslConnector service as for connector

This commit is contained in:
Nikolay Kim 2018-08-27 14:29:01 -07:00
parent c69d675113
commit ddfe1322a1

View File

@ -1,7 +1,7 @@
use std::io; use std::io;
use std::marker::PhantomData; use std::marker::PhantomData;
use futures::{future, future::FutureResult, Async, Poll}; use futures::{future, future::FutureResult, Async, Poll, Future};
use openssl::ssl::{AlpnError, Error, SslAcceptor, SslAcceptorBuilder, SslConnector}; use openssl::ssl::{AlpnError, Error, SslAcceptor, SslAcceptorBuilder, SslConnector};
use tokio_io::{AsyncRead, AsyncWrite}; use tokio_io::{AsyncRead, AsyncWrite};
use tokio_openssl::{AcceptAsync, ConnectAsync, SslAcceptorExt, SslConnectorExt, SslStream}; use tokio_openssl::{AcceptAsync, ConnectAsync, SslAcceptorExt, SslConnectorExt, SslStream};
@ -116,7 +116,7 @@ impl<T> Clone for OpensslConnector<T> {
impl<T: AsyncRead + AsyncWrite> NewService for OpensslConnector<T> { impl<T: AsyncRead + AsyncWrite> NewService for OpensslConnector<T> {
type Request = (String, T); type Request = (String, T);
type Response = SslStream<T>; type Response = (String, SslStream<T>);
type Error = Error; type Error = Error;
type Service = OpensslConnectorService<T>; type Service = OpensslConnectorService<T>;
type InitError = io::Error; type InitError = io::Error;
@ -137,15 +137,38 @@ pub struct OpensslConnectorService<T> {
impl<T: AsyncRead + AsyncWrite> Service for OpensslConnectorService<T> { impl<T: AsyncRead + AsyncWrite> Service for OpensslConnectorService<T> {
type Request = (String, T); type Request = (String, T);
type Response = SslStream<T>; type Response = (String, SslStream<T>);
type Error = Error; type Error = Error;
type Future = ConnectAsync<T>; type Future = ConnectAsyncExt<T>;
fn poll_ready(&mut self) -> Poll<(), Self::Error> { fn poll_ready(&mut self) -> Poll<(), Self::Error> {
Ok(Async::Ready(())) Ok(Async::Ready(()))
} }
fn call(&mut self, (host, stream): Self::Request) -> Self::Future { fn call(&mut self, (host, stream): Self::Request) -> Self::Future {
SslConnectorExt::connect_async(&self.connector, &host, stream) ConnectAsyncExt {
fut: SslConnectorExt::connect_async(&self.connector, &host, stream),
host: Some(host)
}
}
}
pub struct ConnectAsyncExt<T> {
fut: ConnectAsync<T>,
host: Option<String>,
}
impl<T> Future for ConnectAsyncExt<T>
where
T: AsyncRead + AsyncWrite,
{
type Item = (String, SslStream<T>);
type Error = Error;
fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
match self.fut.poll()? {
Async::Ready(stream) => Ok(Async::Ready((self.host.take().unwrap(), stream))),
Async::NotReady => Ok(Async::NotReady)
}
} }
} }