From 449e85743ddcf3dd05b2e59f6a887842b5f70faf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Tue, 7 Feb 2017 19:10:24 +0100 Subject: [PATCH] Beta backports (#4462) * Support HTML5-routed dapps (#4173) * Fix compilation on latest nightly * Updating precompiled --- Cargo.lock | 6 +++--- dapps/src/apps/mod.rs | 1 + dapps/src/router/mod.rs | 24 ++++++++++++++++++++---- dapps/src/web.rs | 15 +++++++++++---- dapps/ui/Cargo.toml | 2 +- ethcore/src/trace/db.rs | 4 ++-- 6 files changed, 38 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4f8fccf0d..1dc3b32ce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1533,7 +1533,7 @@ name = "parity-ui" version = "1.5.0" dependencies = [ "parity-ui-dev 1.4.0", - "parity-ui-precompiled 1.4.0 (git+https://github.com/ethcore/js-precompiled.git)", + "parity-ui-precompiled 1.4.0 (git+https://github.com/ethcore/js-precompiled.git?branch=beta)", "rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1547,7 +1547,7 @@ dependencies = [ [[package]] name = "parity-ui-precompiled" version = "1.4.0" -source = "git+https://github.com/ethcore/js-precompiled.git#a590186c6acf75e31b7cff259721793960ded4e1" +source = "git+https://github.com/ethcore/js-precompiled.git?branch=beta#46942acf631743e844a4d8d051067c8e40534731" dependencies = [ "parity-dapps-glue 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2534,7 +2534,7 @@ dependencies = [ "checksum openssl-sys 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d2845e841700e7b04282ceaa115407ea84e0db918ae689ad9ceb6f06fa6046bd" "checksum owning_ref 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8d91377085359426407a287ab16884a0111ba473aa6844ff01d4ec20ce3d75e7" "checksum parity-dapps-glue 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "98378dec0a185da2b7180308752f0bad73aaa949c3e0a3b0528d0e067945f7ab" -"checksum parity-ui-precompiled 1.4.0 (git+https://github.com/ethcore/js-precompiled.git)" = "" +"checksum parity-ui-precompiled 1.4.0 (git+https://github.com/ethcore/js-precompiled.git?branch=beta)" = "" "checksum parking_lot 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "e1435e7a2a00dfebededd6c6bdbd54008001e94b4a2aadd6aef0dc4c56317621" "checksum parking_lot_core 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fb1b97670a2ffadce7c397fb80a3d687c4f3060140b885621ef1653d0e5d5068" "checksum phf 0.7.14 (registry+https://github.com/rust-lang/crates.io-index)" = "447d9d45f2e0b4a9b532e808365abf18fc211be6ca217202fcd45236ef12f026" diff --git a/dapps/src/apps/mod.rs b/dapps/src/apps/mod.rs index f32cf9042..462576a6e 100644 --- a/dapps/src/apps/mod.rs +++ b/dapps/src/apps/mod.rs @@ -38,6 +38,7 @@ pub const RPC_PATH: &'static str = "rpc"; pub const API_PATH: &'static str = "api"; pub const UTILS_PATH: &'static str = "parity-utils"; pub const WEB_PATH: &'static str = "web"; +pub const URL_REFERER: &'static str = "__referer="; pub fn utils() -> Box { Box::new(PageEndpoint::with_prefix(parity_ui::App::default(), UTILS_PATH.to_owned())) diff --git a/dapps/src/router/mod.rs b/dapps/src/router/mod.rs index 685b957d5..ac807967f 100644 --- a/dapps/src/router/mod.rs +++ b/dapps/src/router/mod.rs @@ -56,7 +56,6 @@ pub struct Router { impl server::Handler for Router { fn on_request(&mut self, req: server::Request) -> Next { - // Choose proper handler depending on path / domain let url = handlers::extract_url(&req); let endpoint = extract_endpoint(&url); @@ -92,8 +91,7 @@ impl server::Handler for Router { self.handler = match (endpoint.0, endpoint.1, referer) { // Handle invalid web requests that we can recover from (ref path, SpecialEndpoint::None, Some((ref referer, ref referer_url))) - if is_get_request - && referer.app_id == apps::WEB_PATH + if referer.app_id == apps::WEB_PATH && self.endpoints.contains_key(apps::WEB_PATH) && !is_web_endpoint(path) => @@ -225,10 +223,28 @@ fn extract_referer_endpoint(req: &server::Request) -> Option<(Endpoi let url = referer.and_then(|referer| Url::parse(&referer.0).ok()); url.and_then(|url| { let option = Some(url); - extract_endpoint(&option).0.map(|endpoint| (endpoint, option.expect("Just wrapped; qed"))) + extract_url_referer_endpoint(&option).or_else(|| { + extract_endpoint(&option).0.map(|endpoint| (endpoint, option.expect("Just wrapped; qed"))) + }) }) } +fn extract_url_referer_endpoint(url: &Option) -> Option<(EndpointPath, Url)> { + let query = url.as_ref().and_then(|url| url.query.as_ref()); + match (url, query) { + (&Some(ref url), Some(ref query)) if query.starts_with(apps::URL_REFERER) => { + let referer_url = format!("http://{}:{}/{}", url.host, url.port, &query[apps::URL_REFERER.len()..]); + debug!(target: "dapps", "Recovering referer from query parameter: {}", referer_url); + + let referer_url = Url::parse(&referer_url).ok(); + extract_endpoint(&referer_url).0.map(|endpoint| { + (endpoint, referer_url.expect("Endpoint returned only when url `is_some`").clone()) + }) + }, + _ => None, + } +} + fn extract_endpoint(url: &Option) -> (Option, SpecialEndpoint) { fn special_endpoint(url: &Url) -> SpecialEndpoint { if url.path.len() <= 1 { diff --git a/dapps/src/web.rs b/dapps/src/web.rs index ac10b4d7f..377097aac 100644 --- a/dapps/src/web.rs +++ b/dapps/src/web.rs @@ -68,6 +68,7 @@ impl Endpoint for Web { struct WebInstaller { embeddable_on: Embeddable, + referer: String, } impl ContentValidator for WebInstaller { @@ -84,7 +85,12 @@ impl ContentValidator for WebInstaller { self.embeddable_on.clone(), ); if is_html { - handler.set_initial_content(&format!(r#""#, apps::UTILS_PATH)); + handler.set_initial_content(&format!( + r#""#, + apps::UTILS_PATH, + apps::URL_REFERER, + &self.referer, + )); } Ok(ValidatorResponse::Streaming(handler)) } @@ -108,7 +114,7 @@ struct WebHandler { } impl WebHandler { - fn extract_target_url(&self, url: Option) -> Result> { + fn extract_target_url(&self, url: Option) -> Result<(String, String), State> { let (path, query) = match url { Some(url) => (url.path, url.query), None => { @@ -157,7 +163,7 @@ impl WebHandler { None => "".into(), }; - Ok(format!("{}://{}{}", protocol, path[idx + 2..].join("/"), query)) + Ok((format!("{}://{}{}", protocol, path[idx + 2..].join("/"), query), path[0..].join("/"))) } } @@ -166,7 +172,7 @@ impl server::Handler for WebHandler { let url = extract_url(&request); // First extract the URL (reject invalid URLs) - let target_url = match self.extract_target_url(url) { + let (target_url, referer) = match self.extract_target_url(url) { Ok(url) => url, Err(error) => { self.state = error; @@ -180,6 +186,7 @@ impl server::Handler for WebHandler { self.control.clone(), WebInstaller { embeddable_on: self.embeddable_on.clone(), + referer: referer, }, self.embeddable_on.clone(), self.remote.clone(), diff --git a/dapps/ui/Cargo.toml b/dapps/ui/Cargo.toml index e835bd820..7fca32187 100644 --- a/dapps/ui/Cargo.toml +++ b/dapps/ui/Cargo.toml @@ -11,7 +11,7 @@ rustc_version = "0.1" [dependencies] parity-ui-dev = { path = "../../js", optional = true } -parity-ui-precompiled = { git = "https://github.com/ethcore/js-precompiled.git", optional = true } +parity-ui-precompiled = { git = "https://github.com/ethcore/js-precompiled.git", branch = "beta", optional = true } [features] no-precompiled-js = ["parity-ui-dev"] diff --git a/ethcore/src/trace/db.rs b/ethcore/src/trace/db.rs index c55bd0748..f7d030701 100644 --- a/ethcore/src/trace/db.rs +++ b/ethcore/src/trace/db.rs @@ -16,7 +16,7 @@ //! Trace database. use std::ops::Deref; -use std::collections::HashMap; +use std::collections::{HashMap, VecDeque}; use std::sync::Arc; use bloomchain::{Number, Config as BloomConfig}; use bloomchain::group::{BloomGroupDatabase, BloomGroupChain, GroupPosition, BloomGroup}; @@ -305,7 +305,7 @@ impl TraceDatabase for TraceDB where T: DatabaseExtras { } fn trace(&self, block_number: BlockNumber, tx_position: usize, trace_position: Vec) -> Option { - let trace_position_deq = trace_position.into_iter().collect(); + let trace_position_deq = trace_position.into_iter().collect::>(); self.extras.block_hash(block_number) .and_then(|block_hash| self.transactions_traces(&block_hash) .and_then(|traces| traces.into_iter().nth(tx_position))