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
use std::marker::PhantomData; use actix_codec::Framed; use actix_service::{NewService, Service}; use futures::future::{ok, FutureResult}; use futures::{Async, IntoFuture, Poll}; use crate::h1::Codec; use crate::request::Request; use super::{verify_handshake, HandshakeError}; pub struct VerifyWebSockets<T> { _t: PhantomData<T>, } impl<T> Default for VerifyWebSockets<T> { fn default() -> Self { VerifyWebSockets { _t: PhantomData } } } impl<T> NewService for VerifyWebSockets<T> { type Request = (Request, Framed<T, Codec>); type Response = (Request, Framed<T, Codec>); type Error = (HandshakeError, Framed<T, Codec>); type InitError = (); type Service = VerifyWebSockets<T>; type Future = FutureResult<Self::Service, Self::InitError>; fn new_service(&self, _: &()) -> Self::Future { ok(VerifyWebSockets { _t: PhantomData }) } } impl<T> Service for VerifyWebSockets<T> { type Request = (Request, Framed<T, Codec>); type Response = (Request, Framed<T, Codec>); type Error = (HandshakeError, Framed<T, Codec>); type Future = FutureResult<Self::Response, Self::Error>; fn poll_ready(&mut self) -> Poll<(), Self::Error> { Ok(Async::Ready(())) } fn call(&mut self, (req, framed): (Request, Framed<T, Codec>)) -> Self::Future { match verify_handshake(&req) { Err(e) => Err((e, framed)).into_future(), Ok(_) => Ok((req, framed)).into_future(), } } }