// Copyright 2015-2019 Parity Technologies (UK) Ltd. // This file is part of Parity Ethereum. // Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with Parity Ethereum. If not, see . //! Transport-specific metadata extractors. use jsonrpc_core; use http; use hyper; /// HTTP RPC server impl-independent metadata extractor pub trait HttpMetaExtractor: Send + Sync + 'static { /// Type of Metadata type Metadata: jsonrpc_core::Metadata; /// Extracts metadata from given params. fn read_metadata(&self, origin: Option, user_agent: Option) -> Self::Metadata; } pub struct MetaExtractor { extractor: T, } impl MetaExtractor { pub fn new(extractor: T) -> Self { MetaExtractor { extractor } } } impl http::MetaExtractor for MetaExtractor where T: HttpMetaExtractor, M: jsonrpc_core::Metadata, { fn read_metadata(&self, req: &hyper::Request) -> M { let as_string = |header: Option<&hyper::header::HeaderValue>| { header.and_then(|val| val.to_str().ok().map(ToOwned::to_owned)) }; let origin = as_string(req.headers().get("origin")); let user_agent = as_string(req.headers().get("user-agent")); self.extractor.read_metadata(origin, user_agent) } }