From 61879ef144951fda33d315a27595cbeb530b0fe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Tue, 30 Aug 2016 11:40:59 +0200 Subject: [PATCH] Fetching dispatcher (HTTP, HTTPS) --- Cargo.lock | 122 +++++++++++++++++------- dapps/Cargo.toml | 3 +- dapps/src/handlers/client/fetch_file.rs | 14 +-- dapps/src/handlers/client/mod.rs | 94 +++++++++++++++++- dapps/src/handlers/fetch.rs | 24 ++--- dapps/src/lib.rs | 1 + util/https-fetch/src/client.rs | 48 +++++++--- util/https-fetch/src/tlsclient.rs | 17 ++-- 8 files changed, 244 insertions(+), 79 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 119e87fdf..8312b0b71 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -70,6 +70,11 @@ dependencies = [ "syntex_syntax 0.33.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "base64" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "bigint" version = "0.1.0" @@ -173,7 +178,7 @@ version = "1.1.1" source = "git+https://github.com/ethcore/rust-ctrlc.git#f4927770f89eca80ec250911eea3adcbf579ac48" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -182,7 +187,7 @@ name = "daemonize" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -224,7 +229,7 @@ source = "git+https://github.com/ethcore/rust-secp256k1#a9a0b1be1f39560ca86e8fc8 dependencies = [ "arrayvec 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", "gcc 0.3.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -292,6 +297,7 @@ dependencies = [ "ethabi 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-rpc 1.4.0", "ethcore-util 1.4.0", + "https-fetch 0.1.0", "hyper 0.9.4 (git+https://github.com/ethcore/hyper)", "jsonrpc-core 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-http-server 6.1.0 (git+https://github.com/ethcore/jsonrpc-http-server.git)", @@ -409,7 +415,7 @@ dependencies = [ "ethcrypto 0.1.0", "ethkey 0.2.0", "igd 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.5.1 (git+https://github.com/ethcore/mio?branch=v0.5.x)", "parking_lot 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -498,7 +504,7 @@ dependencies = [ "heapsize 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", @@ -557,7 +563,7 @@ dependencies = [ "ethkey 0.2.0", "itertools 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", @@ -593,7 +599,7 @@ dependencies = [ name = "fdlimit" version = "0.1.0" dependencies = [ - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -601,7 +607,7 @@ name = "flate2" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "miniz-sys 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -641,6 +647,15 @@ name = "httparse" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "https-fetch" +version = "0.1.0" +dependencies = [ + "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.5.1 (git+https://github.com/ethcore/mio?branch=v0.5.x)", + "rustls 0.1.1 (git+https://github.com/ctz/rustls)", +] + [[package]] name = "hyper" version = "0.9.4" @@ -710,7 +725,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -790,7 +805,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.12" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -808,7 +823,7 @@ name = "memchr" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -836,7 +851,7 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -845,7 +860,7 @@ version = "0.5.1" source = "git+https://github.com/ethcore/mio?branch=v0.5.x#3842d3b250ffd7bd9b16f9586b875ddcbac2b0dd" dependencies = [ "bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", @@ -861,7 +876,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", @@ -877,7 +892,7 @@ version = "0.6.0-dev" source = "git+https://github.com/carllerche/mio?rev=62ec763c9cc34d8a452ed0392c575c50ddd5fc8d#62ec763c9cc34d8a452ed0392c575c50ddd5fc8d" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", @@ -912,7 +927,7 @@ name = "nanomsg" version = "0.5.1" source = "git+https://github.com/ethcore/nanomsg.rs.git#c40fe442c9afaea5b38009a3d992ca044dcceb00" dependencies = [ - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "nanomsg-sys 0.5.0 (git+https://github.com/ethcore/nanomsg.rs.git)", ] @@ -922,7 +937,7 @@ version = "0.5.0" source = "git+https://github.com/ethcore/nanomsg.rs.git#c40fe442c9afaea5b38009a3d992ca044dcceb00" dependencies = [ "gcc 0.3.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -932,7 +947,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -943,7 +958,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -953,7 +968,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1043,7 +1058,7 @@ name = "num_cpus" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1111,7 +1126,7 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1229,7 +1244,7 @@ name = "rand" version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1259,12 +1274,21 @@ name = "regex-syntax" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "ring" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rocksdb" version = "0.4.5" source = "git+https://github.com/ethcore/rust-rocksdb#485dd747a2c9a9f910fc8ac696fc9edf5fa22aa3" dependencies = [ - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "rocksdb-sys 0.3.0 (git+https://github.com/ethcore/rust-rocksdb)", ] @@ -1274,7 +1298,7 @@ version = "0.3.0" source = "git+https://github.com/ethcore/rust-rocksdb#485dd747a2c9a9f910fc8ac696fc9edf5fa22aa3" dependencies = [ "gcc 0.3.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1294,7 +1318,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "termios 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1305,7 +1329,7 @@ version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1324,6 +1348,19 @@ dependencies = [ "semver 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rustls" +version = "0.1.1" +source = "git+https://github.com/ctz/rustls#a9c5a79f49337e22ac05bb1ea114240bdbe0fdd2" +dependencies = [ + "base64 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "semver" version = "0.1.20" @@ -1433,7 +1470,7 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", "term 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1463,7 +1500,7 @@ name = "termios" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1472,7 +1509,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1489,7 +1526,7 @@ version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1550,6 +1587,11 @@ name = "unicode-xid" version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "untrusted" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "url" version = "1.2.0" @@ -1591,6 +1633,17 @@ name = "void" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "webpki" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ring 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "winapi" version = "0.2.6" @@ -1657,6 +1710,7 @@ dependencies = [ "checksum ansi_term 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1f46cd5b1d660c938e3f92dfe7a73d832b3281479363dd0cd9c1c2fbf60f7962" "checksum arrayvec 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)" = "16e3bdb2f54b3ace0285975d59a97cf8ed3855294b2b6bc651fcf22a9c352975" "checksum aster 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07d344974f0a155f091948aa389fb1b912d3a58414fbdb9c8d446d193ee3496a" +"checksum base64 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2015e3793554aa5b6007e3a72959e84c1070039e74f13dde08fa64afe1ddd892" "checksum bit-set 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9bf6104718e80d7b26a68fdbacff3481cfc05df670821affc7e9cbc1884400c" "checksum bit-vec 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5b97c2c8e8bbb4251754f559df8af22fb264853c7d009084a576cdf12565089d" "checksum bitflags 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dead7461c1127cf637931a1e50934eb6eee8bff2f74433ac7909e9afcee04a3" @@ -1698,7 +1752,7 @@ dependencies = [ "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" "checksum lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "49247ec2a285bb3dcb23cbd9c35193c025e7251bfce77c1d5da97e6362dffe7f" -"checksum libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)" = "97def9dc7ce1d8e153e693e3a33020bc69972181adb2f871e87e888876feae49" +"checksum libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)" = "23e3757828fa702a20072c37ff47938e9dd331b92fac6e223d26d4b7a55f7ee2" "checksum log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ab83497bf8bf4ed2a74259c1c802351fcd67a65baa86394b6ba73c36f4838054" "checksum matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "15305656809ce5a4805b1ff2946892810992197ce1270ff79baded852187942e" "checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20" @@ -1751,6 +1805,7 @@ dependencies = [ "checksum rayon 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "941deb43a6254b9867fec1e0caeda38a2ad905ab18c57f7c68c396ca68998c07" "checksum regex 0.1.68 (registry+https://github.com/rust-lang/crates.io-index)" = "b4329b8928a284580a1c63ec9d846b12f6d3472317243ff7077aff11f23f2b29" "checksum regex-syntax 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "841591b1e05609a643e3b4d0045fce04f701daba7151ddcd3ad47b080693d5a9" +"checksum ring 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d059a6a96d3be79042e3f70eb97945912839265f9d8ab45b921abaf266c70dbb" "checksum rocksdb 0.4.5 (git+https://github.com/ethcore/rust-rocksdb)" = "" "checksum rocksdb-sys 0.3.0 (git+https://github.com/ethcore/rust-rocksdb)" = "" "checksum rotor 0.6.3 (git+https://github.com/ethcore/rotor)" = "" @@ -1758,6 +1813,7 @@ dependencies = [ "checksum rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f76d05d3993fd5f4af9434e8e436db163a12a9d40e1a58a726f27a01dfd12a2a" "checksum rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "6159e4e6e559c81bd706afe9c8fd68f547d3e851ce12e76b1de7914bab61691b" "checksum rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084" +"checksum rustls 0.1.1 (git+https://github.com/ctz/rustls)" = "" "checksum semver 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "d4f410fedcf71af0345d7607d246e7ad15faaadd49d240ee3b24e5dc21a820ac" "checksum semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2d5b7638a1f03815d94e88cb3b3c08e87f0db4d683ef499d1836aaf70a45623f" "checksum serde 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b76133a8a02f1c6ebd3fb9a2ecaab3d54302565a51320e80931adba571aadb1b" @@ -1789,11 +1845,13 @@ dependencies = [ "checksum unicode-bidi 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c1f7ceb96afdfeedee42bade65a0d585a6a0106f681b6749c8ff4daa8df30b3f" "checksum unicode-normalization 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "26643a2f83bac55f1976fb716c10234485f9202dcd65cfbdf9da49867b271172" "checksum unicode-xid 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "36dff09cafb4ec7c8cf0023eb0b686cb6ce65499116a12201c9e11840ca01beb" +"checksum untrusted 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5d9bc0e6e73a10975d1fbff8ac3541e221181b0d8998351600fb5523de634c0d" "checksum url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "afe9ec54bc4db14bc8744b7fed060d785ac756791450959b2248443319d5b119" "checksum utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f" "checksum vecio 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0795a11576d29ae80525a3fda315bf7b534f8feb9d34101e5fe63fb95bb2fd24" "checksum vergen 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "56b639f935488eb40f06d17c3e3bcc3054f6f75d264e187b1107c8d1cba8d31c" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +"checksum webpki 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5dc10a815fabbb0c3145c1153240528f3a8703a47e26e8dbb4a5d4f6386200ad" "checksum winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "4dfaaa8fbdaa618fa6914b59b2769d690dd7521920a18d84b42d254678dd5fd4" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum ws 0.5.2 (git+https://github.com/ethcore/ws-rs.git?branch=mio-upstream-stable)" = "" diff --git a/dapps/Cargo.toml b/dapps/Cargo.toml index 2c7c9db9c..0ea3d0de4 100644 --- a/dapps/Cargo.toml +++ b/dapps/Cargo.toml @@ -24,6 +24,7 @@ zip = { version = "0.1", default-features = false } ethabi = "0.2.1" ethcore-rpc = { path = "../rpc" } ethcore-util = { path = "../util" } +https-fetch = { path = "../util/https-fetch" } parity-dapps = { git = "https://github.com/ethcore/parity-ui.git", version = "1.4" } # List of apps parity-dapps-status = { git = "https://github.com/ethcore/parity-ui.git", version = "1.4" } @@ -36,7 +37,7 @@ clippy = { version = "0.0.85", optional = true} serde_codegen = { version = "0.7.0", optional = true } [features] -default = ["serde_codegen", "extra-dapps"] +default = ["serde_codegen", "extra-dapps", "https-fetch/ca-github-only"] extra-dapps = ["parity-dapps-wallet"] nightly = ["serde_macros"] dev = ["clippy", "ethcore-rpc/dev", "ethcore-util/dev"] diff --git a/dapps/src/handlers/client/fetch_file.rs b/dapps/src/handlers/client/fetch_file.rs index 27b8bbe8e..835de1145 100644 --- a/dapps/src/handlers/client/fetch_file.rs +++ b/dapps/src/handlers/client/fetch_file.rs @@ -27,6 +27,8 @@ use hyper::client::{Request, Response, DefaultTransport as HttpStream}; use hyper::header::Connection; use hyper::{self, Decoder, Encoder, Next}; +use super::FetchError; + #[derive(Debug)] pub enum Error { NotStarted, @@ -35,7 +37,7 @@ pub enum Error { HyperError(hyper::Error), } -pub type FetchResult = Result; +pub type FetchResult = Result; pub type OnDone = Box; pub struct Fetch { @@ -54,7 +56,7 @@ impl fmt::Debug for Fetch { impl Drop for Fetch { fn drop(&mut self) { - let res = self.result.take().unwrap_or(Err(Error::NotStarted)); + let res = self.result.take().unwrap_or(Err(Error::NotStarted.into())); // Remove file if there was an error if res.is_err() { if let Some(file) = self.file.take() { @@ -98,7 +100,7 @@ impl hyper::client::Handler for Fetch { fn on_response(&mut self, res: Response) -> Next { if *res.status() != StatusCode::Ok { - self.result = Some(Err(Error::UnexpectedStatus(*res.status()))); + self.result = Some(Err(Error::UnexpectedStatus(*res.status()).into())); return Next::end(); } @@ -110,7 +112,7 @@ impl hyper::client::Handler for Fetch { read() }, Err(err) => { - self.result = Some(Err(Error::IoError(err))); + self.result = Some(Err(Error::IoError(err).into())); Next::end() }, } @@ -123,7 +125,7 @@ impl hyper::client::Handler for Fetch { Err(e) => match e.kind() { io::ErrorKind::WouldBlock => Next::read(), _ => { - self.result = Some(Err(Error::IoError(e))); + self.result = Some(Err(Error::IoError(e).into())); Next::end() } } @@ -131,7 +133,7 @@ impl hyper::client::Handler for Fetch { } fn on_error(&mut self, err: hyper::Error) -> Next { - self.result = Some(Err(Error::HyperError(err))); + self.result = Some(Err(Error::HyperError(err).into())); Next::remove() } } diff --git a/dapps/src/handlers/client/mod.rs b/dapps/src/handlers/client/mod.rs index 89532e6f6..64d24914b 100644 --- a/dapps/src/handlers/client/mod.rs +++ b/dapps/src/handlers/client/mod.rs @@ -16,7 +16,97 @@ //! Hyper Client Handlers -mod fetch_file; +pub mod fetch_file; + +use std::env; +use std::sync::mpsc; +use std::path::PathBuf; + +use hyper; +use https_fetch as https; + +use random_filename; +use self::fetch_file::{Fetch, Error as HttpFetchError}; + +pub type FetchResult = Result; + +#[derive(Debug)] +pub enum FetchError { + InvalidUrl, + Http(HttpFetchError), + Https(https::FetchError), + Other(String), +} + +impl From for FetchError { + fn from(e: HttpFetchError) -> Self { + FetchError::Http(e) + } +} + +pub struct Client { + http_client: hyper::Client, + https_client: https::Client, +} + +impl Client { + pub fn new() -> Self { + Client { + http_client: hyper::Client::new().expect("Unable to initialize http client."), + https_client: https::Client::new().expect("Unable to initialize https client."), + } + } + + pub fn close(mut self) { + self.http_client.close(); + self.https_client.close(); + } + + pub fn request(&mut self, url: String, on_done: Box) -> Result, FetchError> { + let is_https = url.starts_with("https://"); + let url = try!(url.parse().map_err(|_| FetchError::InvalidUrl)); + trace!(target: "dapps", "Fetching from: {:?}", url); + if is_https { + let url = try!(Self::convert_url(url)); + + let (tx, rx) = mpsc::channel(); + let temp_path = Self::temp_path(); + let res = self.https_client.fetch_to_file(url, temp_path.clone(), move |result| { + let res = tx.send( + result.map(|_| temp_path).map_err(FetchError::Https) + ); + if let Err(_) = res { + warn!("Fetch finished, but no one was listening"); + } + on_done(); + }); + + match res { + Ok(_) => Ok(rx), + Err(e) => Err(FetchError::Other(format!("{:?}", e))), + } + } else { + let (tx, rx) = mpsc::channel(); + let res = self.http_client.request(url, Fetch::new(tx, on_done)); + + match res { + Ok(_) => Ok(rx), + Err(e) => Err(FetchError::Other(format!("{:?}", e))), + } + } + } + + fn convert_url(url: hyper::Url) -> Result { + let host = format!("{}", try!(url.host().ok_or(FetchError::InvalidUrl))); + let port = try!(url.port_or_known_default().ok_or(FetchError::InvalidUrl)); + https::Url::new(&host, port, url.path()).map_err(|_| FetchError::InvalidUrl) + } + + fn temp_path() -> PathBuf { + let mut dir = env::temp_dir(); + dir.push(random_filename()); + dir + } +} -pub use self::fetch_file::{Fetch, FetchResult, OnDone}; diff --git a/dapps/src/handlers/fetch.rs b/dapps/src/handlers/fetch.rs index 94bce1492..fd80e9729 100644 --- a/dapps/src/handlers/fetch.rs +++ b/dapps/src/handlers/fetch.rs @@ -21,12 +21,12 @@ use std::path::PathBuf; use std::sync::mpsc; use std::time::{Instant, Duration}; -use hyper::{header, server, Decoder, Encoder, Next, Method, Control, Client}; +use hyper::{header, server, Decoder, Encoder, Next, Method, Control}; use hyper::net::HttpStream; use hyper::status::StatusCode; use handlers::ContentHandler; -use handlers::client::{Fetch, FetchResult}; +use handlers::client::{Client, FetchResult}; use apps::redirection_address; use apps::urlhint::GithubApp; use apps::manifest::Manifest; @@ -53,7 +53,7 @@ pub trait DappHandler { pub struct AppFetcherHandler { control: Option, status: FetchState, - client: Option>, + client: Option, using_dapps_domains: bool, dapp: H, } @@ -76,7 +76,7 @@ impl AppFetcherHandler { using_dapps_domains: bool, handler: H) -> Self { - let client = Client::new().expect("Failed to create a Client"); + let client = Client::new(); AppFetcherHandler { control: Some(control), client: Some(client), @@ -86,7 +86,7 @@ impl AppFetcherHandler { } } - fn close_client(client: &mut Option>) { + fn close_client(client: &mut Option) { client.take() .expect("After client is closed we are going into write, hence we can never close it again") .close(); @@ -94,20 +94,12 @@ impl AppFetcherHandler { // TODO [todr] https support - fn fetch_app(client: &mut Client, app: &GithubApp, control: Control) -> Result, String> { - let url = try!(app.url().parse().map_err(|e| format!("{:?}", e))); - trace!(target: "dapps", "Fetching from: {:?}", url); - - let (tx, rx) = mpsc::channel(); - let res = client.request(url, Fetch::new(tx, Box::new(move || { + fn fetch_app(client: &mut Client, app: &GithubApp, control: Control) -> Result, String> { + client.request(app.url(), Box::new(move || { trace!(target: "dapps", "Fetching finished."); // Ignoring control errors let _ = control.ready(Next::read()); - }))); - match res { - Ok(_) => Ok(rx), - Err(e) => Err(format!("{:?}", e)), - } + })).map_err(|e| format!("{:?}", e)) } } diff --git a/dapps/src/lib.rs b/dapps/src/lib.rs index 574c38acf..9f08e4dbc 100644 --- a/dapps/src/lib.rs +++ b/dapps/src/lib.rs @@ -58,6 +58,7 @@ extern crate jsonrpc_http_server; extern crate mime_guess; extern crate rustc_serialize; extern crate parity_dapps; +extern crate https_fetch; extern crate ethcore_rpc; extern crate ethcore_util as util; diff --git a/util/https-fetch/src/client.rs b/util/https-fetch/src/client.rs index 312537179..78bce769e 100644 --- a/util/https-fetch/src/client.rs +++ b/util/https-fetch/src/client.rs @@ -14,9 +14,9 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -use std::str; -use std::thread; -use std::sync::mpsc; +use std::cell::RefCell; +use std::{fs, str, thread}; +use std::path::PathBuf; use std::io::{self, Write}; use std::collections::HashMap; @@ -56,7 +56,7 @@ impl From for FetchError { pub type FetchResult = Result<(), FetchError>; pub enum ClientMessage { - Fetch(Url, Box, mpsc::Sender), + Fetch(Url, Box, Box), Shutdown, } @@ -67,9 +67,7 @@ pub struct Client { impl Drop for Client { fn drop(&mut self) { - if let Err(e) = self.channel.send(ClientMessage::Shutdown) { - warn!("Error while closing client: {:?}. Already stopped?", e); - } + self.close_internal(); if let Some(thread) = self.thread.take() { thread.join().expect("Clean shutdown."); } @@ -95,10 +93,33 @@ impl Client { }) } - pub fn fetch(&self, url: Url, writer: Box) -> Result, FetchError> { - let (tx, rx) = mpsc::channel(); - try!(self.channel.send(ClientMessage::Fetch(url, writer, tx))); - Ok(rx) + pub fn fetch_to_file(&self, url: Url, path: PathBuf, callback: F) -> Result<(), FetchError> { + let file = try!(fs::File::create(&path)); + self.fetch(url, Box::new(file), move |result| { + if let Err(_) = result { + // remove temporary file + let _ = fs::remove_file(&path); + } + callback(result); + }) + } + + pub fn fetch(&self, url: Url, writer: Box, callback: F) -> Result<(), FetchError> { + let cell = RefCell::new(Some(callback)); + try!(self.channel.send(ClientMessage::Fetch(url, writer, Box::new(move |res| { + cell.borrow_mut().take().expect("Called only once.")(res); + })))); + Ok(()) + } + + pub fn close(mut self) { + self.close_internal() + } + + fn close_internal(&mut self) { + if let Err(e) = self.channel.send(ClientMessage::Shutdown) { + warn!("Error while closing client: {:?}. Already stopped?", e); + } } } @@ -127,11 +148,11 @@ impl mio::Handler for ClientLoop { fn notify(&mut self, event_loop: &mut mio::EventLoop, msg: Self::Message) { match msg { ClientMessage::Shutdown => event_loop.shutdown(), - ClientMessage::Fetch(url, writer, sender) => { + ClientMessage::Fetch(url, writer, callback) => { let token = self.next_token; self.next_token += 1; - if let Ok(mut tlsclient) = TlsClient::new(mio::Token(token), &url, writer, sender) { + if let Ok(mut tlsclient) = TlsClient::new(mio::Token(token), &url, writer, callback) { let httpreq = format!( "GET {} HTTP/1.1\r\nHost: {}\r\nConnection: close\r\nAccept-Encoding: identity\r\n\r\n", url.path(), @@ -183,3 +204,4 @@ fn should_successfuly_fetch_a_page() { assert!(result.is_ok()); assert!(wrote.load(Ordering::Relaxed) > 0); } + diff --git a/util/https-fetch/src/tlsclient.rs b/util/https-fetch/src/tlsclient.rs index 516c9a0ba..5e395a88d 100644 --- a/util/https-fetch/src/tlsclient.rs +++ b/util/https-fetch/src/tlsclient.rs @@ -15,7 +15,7 @@ // along with Parity. If not, see . use std::str; -use std::sync::{mpsc, Arc}; +use std::sync::Arc; use std::io::{self, Read, Cursor, BufReader}; use mio; @@ -43,7 +43,7 @@ pub struct TlsClient { writer: Box, error: Option, closing: bool, - listener: mpsc::Sender, + callback: Box, } impl io::Write for TlsClient { @@ -81,7 +81,7 @@ impl TlsClient { token: mio::Token, url: &Url, writer: Box, - sender: mpsc::Sender, + mut callback: Box, ) -> Result { let res = TlsClient::make_config().and_then(|cfg| { TcpStream::connect(url.address()).map(|sock| { @@ -97,10 +97,10 @@ impl TlsClient { closing: false, error: None, tls_session: rustls::ClientSession::new(&cfg, url.hostname()), - listener: sender, + callback: callback, }), Err(e) => { - sender.send(Err(e)).unwrap_or_else(|e| warn!("Client initialization error: {:?}", e)); + callback(Err(e)); Err(FetchError::Client(TlsClientError::Initialization)) } } @@ -121,14 +121,12 @@ impl TlsClient { if self.is_closed() { trace!("Connection closed"); - let res = self.listener.send(match self.error.take() { + let callback = &mut self.callback; + callback(match self.error.take() { Some(err) => Err(err.into()), None => Ok(()), }); - if let Err(e) = res { - warn!("Finished fetching but listener is not available: {:?}", e); - } return true; } @@ -207,6 +205,7 @@ impl TlsClient { fn do_write(&mut self) { self.tls_session.write_tls(&mut self.socket).unwrap_or_else(|e| { warn!("TLS write error: {:?}", e); + 0 }); }