From 128e417a652926c3df0efbc842ee5e7c2e5bce7b Mon Sep 17 00:00:00 2001 From: Sean Leather Date: Mon, 1 Apr 2019 13:31:38 +0200 Subject: [PATCH 1/4] Replace hyper-0.10 with reqwest Later versions of hyper (0.11, 0.12) have dropped a number of features, and reqwest has picked up those features. This change migrates the HTTP code from using an old version of hyper to using the latest version of reqwest. Other changes: * Remove old and unused hyper_seekable * Add UnexpectedHttpResponse --- Cargo.lock | 794 ++++++++++++++++++++++++++++++++++++--- Cargo.toml | 3 +- src/config.rs | 2 +- src/errors.rs | 9 +- src/io/hyper_seekable.rs | 311 --------------- src/io/itarbundle.rs | 94 +++-- src/io/mod.rs | 11 - 7 files changed, 813 insertions(+), 411 deletions(-) delete mode 100644 src/io/hyper_seekable.rs diff --git a/Cargo.lock b/Cargo.lock index 77f43a7d5..be9a8a210 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -21,11 +21,6 @@ dependencies = [ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "antidote" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "app_dirs" version = "1.2.1" @@ -37,6 +32,14 @@ dependencies = [ "xdg 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "arrayvec" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "atty" version = "0.2.11" @@ -75,11 +78,10 @@ dependencies = [ [[package]] name = "base64" -version = "0.9.3" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -121,6 +123,16 @@ name = "byteorder" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "bytes" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "bzip2" version = "0.3.3" @@ -171,6 +183,32 @@ dependencies = [ "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "cookie" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "cookie_store" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "publicsuffix 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", + "try_from 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "core-foundation" version = "0.6.4" @@ -201,6 +239,45 @@ dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam-deque" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-queue" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-utils" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "digest" version = "0.8.0" @@ -209,6 +286,24 @@ dependencies = [ "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "dtoa" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "either" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "encoding_rs" +version = "0.8.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "error-chain" version = "0.12.1" @@ -218,6 +313,26 @@ dependencies = [ "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "failure" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "backtrace 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "failure_derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.36 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "fake-simd" version = "0.1.2" @@ -234,6 +349,11 @@ dependencies = [ "miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "fnv" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "foreign-types" version = "0.3.2" @@ -261,6 +381,34 @@ name = "fuchsia-cprng" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "fuchsia-zircon" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "fuchsia-zircon-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "futures" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "futures-cpupool" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "generic-array" version = "0.12.0" @@ -269,6 +417,44 @@ dependencies = [ "typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "h2" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "string 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "http" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "http-body" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "httparse" version = "1.3.3" @@ -276,30 +462,43 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hyper" -version = "0.10.16" +version = "0.12.30" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "hyper-native-tls" -version = "0.3.0" +name = "hyper-tls" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.30 (registry+https://github.com/rust-lang/crates.io-index)", "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -313,9 +512,32 @@ dependencies = [ ] [[package]] -name = "language-tags" +name = "indexmap" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "iovec" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "itoa" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "kernel32-sys" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "lazy_static" @@ -338,11 +560,12 @@ dependencies = [ ] [[package]] -name = "log" -version = "0.3.9" +name = "lock_api" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -373,12 +596,28 @@ name = "memchr" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "memoffset" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "mime" -version = "0.2.6" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "unicase 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "mime_guess" +version = "2.0.0-alpha.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", + "phf 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_codegen 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", + "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -409,6 +648,34 @@ dependencies = [ "miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "mio" +version = "0.6.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (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.58 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miow" +version = "0.2.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)", + "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "native-tls" version = "0.2.3" @@ -426,6 +693,21 @@ dependencies = [ "tempfile 3.0.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "net2" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "nodrop" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "num_cpus" version = "1.10.1" @@ -483,11 +765,75 @@ dependencies = [ "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "owning_ref" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "parking_lot" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "parking_lot_core" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "percent-encoding" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "phf" +version = "0.7.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "phf_codegen" +version = "0.7.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "phf_generator" +version = "0.7.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "phf_shared" +version = "0.7.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "pkg-config" version = "0.3.14" @@ -506,6 +852,18 @@ dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "publicsuffix" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", + "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "quote" version = "0.6.12" @@ -659,14 +1017,54 @@ dependencies = [ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "reqwest" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cookie_store 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding_rs 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)", + "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.30 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", + "mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_urlencoded 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rustc-demangle" version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "safemem" -version = "0.3.0" +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ryu" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -678,6 +1076,11 @@ dependencies = [ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "scopeguard" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "security-framework" version = "0.3.1" @@ -697,6 +1100,19 @@ dependencies = [ "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "serde" version = "1.0.92" @@ -715,6 +1131,27 @@ dependencies = [ "syn 0.15.36 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "serde_json" +version = "1.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "serde_urlencoded" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "sha2" version = "0.8.0" @@ -735,11 +1172,34 @@ dependencies = [ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "siphasher" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "slab" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "smallvec" version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "stable_deref_trait" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "string" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "strsim" version = "0.8.0" @@ -755,6 +1215,17 @@ dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "synstructure" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.36 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tectonic" version = "0.1.12-dev" @@ -766,13 +1237,12 @@ dependencies = [ "error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "fs2 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper-native-tls 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "md-5 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "reqwest 0.9.18 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tectonic_xdv 0.1.9-dev", @@ -848,6 +1318,138 @@ dependencies = [ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-trace-core 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-buf" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-current-thread" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-executor" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-io" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-reactor" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-sync" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-tcp" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-threadpool" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-timer" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-trace-core" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "toml" version = "0.5.1" @@ -857,14 +1459,17 @@ dependencies = [ ] [[package]] -name = "traitobject" -version = "0.1.0" +name = "try-lock" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "typeable" -version = "0.1.2" +name = "try_from" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "typenum" @@ -884,6 +1489,14 @@ dependencies = [ "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "unicase" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "unicode-bidi" version = "0.3.4" @@ -925,6 +1538,14 @@ name = "utf8-ranges" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "uuid" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "vcpkg" version = "0.2.6" @@ -940,6 +1561,16 @@ name = "version_check" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "want" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "winapi" version = "0.2.8" @@ -986,6 +1617,15 @@ dependencies = [ "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ws2_32-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "xdg" version = "2.2.0" @@ -1007,56 +1647,85 @@ dependencies = [ "checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "checksum aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e6f484ae0c99fec2e858eb6134949117399f222608d84cadb3f58c1f97c2364c" "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" -"checksum antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34fde25430d87a9388dadbe6e34d7f72a462c8b43ac8d309b42b0a8505d7e2a5" "checksum app_dirs 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e73a24bad9bd6a94d6395382a6c69fe071708ae4409f763c5475e14ee896313d" +"checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" "checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" "checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" "checksum backtrace 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)" = "ada4c783bb7e7443c14e0480f429ae2cc99da95065aeab7ee1b81ada0419404f" "checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" -"checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" +"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" "checksum bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d155346769a6855b86399e9bc3814ab343cd3d62c7e985113d46a0ec3c281fd" "checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" "checksum block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6d4dc3af3ee2e12f3e5d224e5e1e3d73668abbeb69e566d361f7d5563a4fdf09" "checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" +"checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" "checksum bzip2 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "42b7c3cbf0fa9c1b82308d57191728ca0256cb821220f4e2fd410a72ade26e3b" "checksum bzip2-sys 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6584aa36f5ad4c9247f5323b0a42f37802b37a836f0ad87084d7a33961abe25f" "checksum cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d" "checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" "checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +"checksum cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "888604f00b3db336d2af898ec3c1d5d0ddf5e6d462220f2ededc33a87ac4bbd5" +"checksum cookie_store 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46750b3f362965f197996c4448e4a0935e791bf7d6631bfce9ee0af3d24c919c" "checksum core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d" "checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" "checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" "checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" +"checksum crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18cd2e169ad86297e6bc0ad9aa679aee9daa4f19e8163860faf7c164e4f5a71" +"checksum crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "04c9e3102cc2d69cd681412141b390abd55a362afc1540965dad0ad4d34280b4" +"checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" +"checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c" "checksum digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f47366984d3ad862010e22c7ce81a7dbcaebbdfb37241a620f8b6596ee135c" +"checksum dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ea57b42383d091c85abcc2706240b94ab2a8fa1fc81c10ff23c4de06e2a90b5e" +"checksum either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5527cfe0d098f36e3f8839852688e63c8fff1c90b2b405aef730615f9a7bcf7b" +"checksum encoding_rs 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)" = "4155785c79f2f6701f185eb2e6b4caf0555ec03477cb4c70db67b465311620ed" "checksum error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3ab49e9dcb602294bc42f9a7dfc9bc6e936fca4418ea300dbfb84fe16de0b7d9" +"checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" +"checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" "checksum flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f87e68aa82b2de08a6e037f1385455759df6e445a8df5e005b4297191dbf18aa" +"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" "checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" "checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" "checksum fs2 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" +"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" +"checksum futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)" = "a2037ec1c6c1c4f79557762eab1f7eae1f64f6cb418ace90fae88f0942b60139" +"checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592" +"checksum h2 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)" = "1e42e3daed5a7e17b12a0c23b5b2fbff23a925a570938ebee4baca1a9a1a2240" +"checksum http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "eed324f0f0daf6ec10c474f150505af2c143f251722bf9dbd1261bd1f2ee2c1a" +"checksum http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" -"checksum hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)" = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273" -"checksum hyper-native-tls 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d375598f442742b0e66208ee12501391f1c7ac0bafb90b4fe53018f81f06068" +"checksum hyper 0.12.30 (registry+https://github.com/rust-lang/crates.io-index)" = "40e7692b2009a70b1e9b362284add4d8b75880fefddb4acaa5e67194e843f219" +"checksum hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" -"checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" +"checksum indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e81a7c05f79578dbc15793d8b619db9ba32b4577003ef3af1a91c416798c58d" +"checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" +"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" +"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" "checksum libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "6281b86796ba5e4366000be6e9e18bf35580adf9e63fbe2294aadb587613a319" "checksum libflate 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)" = "76912aa0196b6f0e06d9c43ee877be45369157c06172ade12fe20ac3ee5ffa15" -"checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" +"checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum md-5 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a18af3dcaf2b0219366cdb4e2af65a6101457b415c3d1a5c71dd9c2b7c77b9c8" "checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" -"checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" +"checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" +"checksum mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)" = "3e27ca21f40a310bd06d9031785f4801710d566c184a6e15bad4f1d9b65f9425" +"checksum mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30de2e4613efcba1ec63d8133f344076952090c122992a903359be5a4f99c3ed" "checksum miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202" "checksum miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c468f2369f07d651a5d0bb2c9079f8488a66d5466efe42d0c5c6466edcb7f71e" "checksum miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fe927a42e3807ef71defb191dc87d4e24479b221e67015fe38ae2b7b447bab" +"checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" +"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" "checksum native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b2df1a4c22fd44a62147fd8f13dd0f95c9d8ca7b2610299b2a2f9cf8964274e" +"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" +"checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" "checksum num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcef43580c035376c0705c42792c294b66974abbfd2789b511784023f71f3273" "checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" "checksum ole32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2c49021782e5233cd243168edfa8037574afed4eba4bbaf538b3d8d1789d8c" @@ -1064,10 +1733,18 @@ dependencies = [ "checksum openssl 0.10.23 (registry+https://github.com/rust-lang/crates.io-index)" = "97c140cbb82f3b3468193dd14c1b88def39f341f68257f8a7fe8ed9ed3f628a5" "checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" "checksum openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)" = "75bdd6dbbb4958d38e47a1d2348847ad1eb4dc205dc5d37473ae504391865acc" +"checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" +"checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" +"checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" +"checksum phf 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "b3da44b85f8e8dfaec21adae67f95d93244b2ecf6ad2a692320598dcc8e6dd18" +"checksum phf_codegen 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "b03e85129e324ad4166b06b2c7491ae27fe3ec353af72e72cd1654c7225d517e" +"checksum phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662" +"checksum phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0" "checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" "checksum podio 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "780fb4b6698bbf9cf2444ea5d22411cef2953f0824b98f33cf454ec5615645bd" "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +"checksum publicsuffix 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5afecba86dcf1e4fd610246f89899d1924fe12e1e89f555eb7c7f710f3c5ad1d" "checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" "checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" "checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" @@ -1085,39 +1762,65 @@ dependencies = [ "checksum regex 1.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0b2f0808e7d7e4fb1cb07feb6ff2f4bc827938f24f8c2e6a3beb7370af544bdd" "checksum regex-syntax 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d76410686f9e3a17f06128962e0ecc5755870bb890c34820c7af7f1db2e1d48" "checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" +"checksum reqwest 0.9.18 (registry+https://github.com/rust-lang/crates.io-index)" = "00eb63f212df0e358b427f0f40aa13aaea010b470be642ad422bcbca2feff2e4" "checksum rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f4dccf6f4891ebcc0c39f9b6eb1a83b9bf5d747cb439ec6fba4f3b977038af" -"checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9" +"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +"checksum ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "b96a9549dc8d48f2c283938303c4b5a77aa29bfbc5b54b084fb1630408899a8f" "checksum schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "f2f6abf258d99c3c1c5c2131d99d064e94b7b3dd5f416483057f308fea253339" +"checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" "checksum security-framework 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eee63d0f4a9ec776eeb30e220f0bc1e092c3ad744b2a379e3993070364d3adc2" "checksum security-framework-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9636f8989cbf61385ae4824b98c1aaa54c994d7d8b41f11c601ed799f0549a56" +"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)" = "32746bf0f26eab52f06af0d0aa1984f641341d06d8d673c693871da2d188c9be" "checksum serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)" = "46a3223d0c9ba936b61c0d2e3e559e3217dbfb8d65d06d26e8b3c25de38bae3e" +"checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" +"checksum serde_urlencoded 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "642dd69105886af2efd227f75a520ec9b44a820d65bc133a9131f7d229fd165a" "checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" "checksum shell32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9ee04b46101f57121c9da2b151988283b6beb79b34f5bb29a58ee48cb695122c" +"checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" +"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ab606a9c5e214920bb66c458cd7be8ef094f813f20fe77a54cc7dbfff220d4b7" +"checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" +"checksum string 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0bbfb8937e38e34c3444ff00afb28b0811d9554f15c5ad64d12b0308d1d1995" "checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" "checksum syn 0.15.36 (registry+https://github.com/rust-lang/crates.io-index)" = "8b4f551a91e2e3848aeef8751d0d4eec9489b6474c720fd4c55958d8d31a430c" +"checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" "checksum tempfile 3.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7dc4738f2e68ed2855de5ac9cdbe05c9216773ecde4739b2f095002ab03a13ef" "checksum termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e" "checksum termion 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a8fb22f7cde82c8220e5aeacb3258ed7ce996142c77cba193f203515e26c330" "checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" +"checksum tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "ec2ffcf4bcfc641413fa0f1427bf8f91dfc78f56a6559cbf50e04837ae442a87" +"checksum tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46" +"checksum tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" +"checksum tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "83ea44c6c0773cc034771693711c35c677b4b5a4b21b9e7071704c54de7d555e" +"checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" +"checksum tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6af16bfac7e112bea8b0442542161bfc41cbfa4466b580bdda7d18cb88b911ce" +"checksum tokio-sync 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2162248ff317e2bc713b261f242b69dbb838b85248ed20bb21df56d60ea4cae7" +"checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" +"checksum tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72558af20be886ea124595ea0f806dd5703b8958e4705429dd58b3d8231f72f2" +"checksum tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e" +"checksum tokio-trace-core 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9c8a256d6956f7cb5e2bdfe8b1e8022f1a09206c6c2b1ba00f3b746b260c613" "checksum toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8c96d7873fa7ef8bdeb3a9cda3ac48389b4154f32b9803b4bc26220b677b039" -"checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" -"checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" +"checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" +"checksum try_from 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "283d3b89e1368717881a9d51dad843cc435380d8109c9e47d38780a324698d8b" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" "checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" +"checksum unicase 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a84e5511b2a947f3ae965dcb29b13b7b1691b6e7332cf5dbc1744138d5acb7f6" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" "checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426" "checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" "checksum utf8-ranges 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9d50aa7650df78abf942826607c62468ce18d9019673d4a2ebe1865dbb96ffde" +"checksum uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a" "checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" +"checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" @@ -1125,5 +1828,6 @@ dependencies = [ "checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" "checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" +"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" "checksum xdg 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d089681aa106a86fade1b0128fb5daf07d5867a509ab036d99988dec80429a57" "checksum zip 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c18fc320faf909036e46ac785ea827f72e485304877faf1a3a39538d3714dbc3" diff --git a/Cargo.toml b/Cargo.toml index 071a00cdc..4f395ac3b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,12 +45,11 @@ clap = "^2.33" error-chain = "^0.12" flate2 = "^1.0" fs2 = "^0.4" -hyper = "^0.10" -hyper-native-tls = "^0.3" lazy_static = "^1.2" libc = "^0.2" tempfile = "^3.0" md-5 = "^0.8" +reqwest = "^0.9" sha2 = "^0.8" serde = { version = "^1.0", features = ["derive"], optional = true } tectonic_xdv = { path = "xdv", version = "0.1.9-dev" } diff --git a/src/config.rs b/src/config.rs index dc5ee5e17..9a51ddfaa 100644 --- a/src/config.rs +++ b/src/config.rs @@ -148,7 +148,7 @@ impl PersistentConfig { only_cached: bool, status: &mut dyn StatusBackend, ) -> Result> { - use hyper::Url; + use reqwest::Url; use std::io; if CONFIG_TEST_MODE_ACTIVATED.load(Ordering::SeqCst) { diff --git a/src/errors.rs b/src/errors.rs index 54168c230..ee70b2870 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -12,7 +12,7 @@ use app_dirs; use error_chain::error_chain; -use hyper; +use reqwest::StatusCode; use std::io::Write; use std::result::Result as StdResult; use std::{convert, ffi, io, num, str}; @@ -28,11 +28,11 @@ error_chain! { foreign_links { AppDirs(app_dirs::AppDirsError); - Hyper(hyper::Error); Io(io::Error); Nul(ffi::NulError); ParseInt(num::ParseIntError); Persist(tempfile::PersistError); + Reqwest(reqwest::Error); TomlDe(toml::de::Error); TomlSer(toml::ser::Error); Utf8(str::Utf8Error); @@ -65,6 +65,11 @@ error_chain! { description("some engine had an unrecoverable error") display("the {} engine had an unrecoverable error", engine) } + + UnexpectedHttpResponse(url: String, status: StatusCode) { + description("unexpected HTTP response to URL") + display("unexpected HTTP response to URL {}: {}", url, status) + } } } diff --git a/src/io/hyper_seekable.rs b/src/io/hyper_seekable.rs deleted file mode 100644 index 08eaa9206..000000000 --- a/src/io/hyper_seekable.rs +++ /dev/null @@ -1,311 +0,0 @@ -// src/io/hyper_seekable.rs -- seekable remote file over HTTP -// Copyright 2017 the Tectonic Project -// Licensed under the MIT License. - -// TODO: this should probably be its own crate, but I'm writing this on an -// airplane and I can't get that set up without a web connection. - -use hyper::Client; -use hyper::header::{Headers, ContentLength, Range}; -use hyper::status::StatusCode; -use std::cmp; -use std::collections::HashMap; -use std::io::{self, Read, Seek, SeekFrom}; -use std::str; - -use super::create_hyper_client; -use errors::{ErrorKind, Result}; - -// Of course, we are not actually caching because nothing ever gets expired -// from `cache`. TBD. - -const CHUNK_SIZE: usize = 8192; - -type Chunk = [u8; CHUNK_SIZE]; - -pub struct SeekableHttpFile { - url: String, - client: Client, - cache: HashMap, - pos: u64, - len: u64, -} - - -impl SeekableHttpFile { - pub fn new(url: &str) -> Result { - let client = create_hyper_client(); - - let len = { - let req = client.head(url); - let res = req.send()?; - match res.headers.get::() { - Some(cl) => cl.0, - None => return Err(ErrorKind::NotSizeable.into()) - } - }; - - Ok(SeekableHttpFile { - url: url.to_owned(), - client: client, - cache: HashMap::new(), - pos: 0, - len: len, - }) - } - - pub fn len(&self) -> u64 { - self.len - } - - pub fn drop_cache(&mut self) { - self.cache.clear() - } -} - - -impl Read for SeekableHttpFile { - fn read(&mut self, buf: &mut [u8]) -> io::Result { - let idx = self.pos / CHUNK_SIZE as u64; - let ofs = (self.pos % CHUNK_SIZE as u64) as usize; - let len = cmp::min(cmp::min(CHUNK_SIZE - ofs, buf.len()), - (self.len - self.pos) as usize); - - if len == 0 { - return Ok(0) - } - - // NB I tried to pull out the common bits in the two code paths here - // but ran into borrow-checker problems. - - if let Some(cbuf) = self.cache.get(&idx) { - buf[..len].copy_from_slice(&cbuf[ofs..ofs+len]); - self.pos += len as u64; - return Ok(len as usize); - } - - // We need to fetch this chunk. All chunks are of size CHUNK_SIZE - // except the annoying last one. - let start = idx * CHUNK_SIZE as u64; - let end_inclusive = cmp::min(start + CHUNK_SIZE as u64 - 1, - self.len - 1); - let chunk_size = (end_inclusive + 1 - start) as usize; - println!("FETCHING {} -> {} (inclusive)", start, end_inclusive); - - let mut headers = Headers::new(); - headers.set(Range::bytes(start, end_inclusive)); - - let req = self.client.get(&self.url).headers(headers); - - let mut res = match req.send() { - Ok(r) => r, - Err(e) => return Err(io::Error::new(io::ErrorKind::Other, - format!("{}", e))), - }; - if res.status != StatusCode::PartialContent { - return Err(io::Error::new(io::ErrorKind::Other, - format!("unexpected status {}", res.status))); - } - - let mut chunk: Chunk = [0u8; CHUNK_SIZE as usize]; - res.read_exact(&mut chunk[..chunk_size])?; - - buf[..len].copy_from_slice(&chunk[ofs..ofs+len]); - self.cache.insert(idx, chunk); - self.pos += len as u64; - Ok(len as usize) - } -} - - -impl Seek for SeekableHttpFile { - fn seek(&mut self, pos: SeekFrom) -> io::Result { - let tot_len = self.len as i64; - let cur = self.pos as i64; - - self.pos = match pos { - SeekFrom::Start(p) => { - if p > tot_len as u64 { - return Err(io::Error::new(io::ErrorKind::Other, "out-of-bounds seek")); - } - p - }, - SeekFrom::End(ofs) => { - if ofs > 0 || -ofs > tot_len { - return Err(io::Error::new(io::ErrorKind::Other, "out-of-bounds seek")); - } - (tot_len + ofs) as u64 - }, - SeekFrom::Current(ofs) => { - if -ofs > cur || ofs + cur > tot_len { - return Err(io::Error::new(io::ErrorKind::Other, "out-of-bounds seek")); - } - (cur + ofs) as u64 - } - }; - - println!("OK SEEK: {}", self.pos); - Ok(self.pos) - } -} - - -#[cfg(test)] -mod tests { - use super::*; - use super::CHUNK_SIZE; - use hyper::header::{ByteRangeSpec, ContentLength, Range}; - use hyper::method::Method; - use hyper::server::{Handler, Response, Request, Server}; - use hyper::status::StatusCode; - use std::io::{Read, Seek, SeekFrom, Write}; - use std::net::SocketAddr; - - fn with_server_thread(h: H, f: F) -> T where H: Handler + 'static, F: FnOnce (SocketAddr) -> T { - let mut server = Server::http("127.0.0.1:0").unwrap().handle(h).unwrap(); - let retval = f(server.socket); - server.close().expect("error stopping embedded test server"); - retval - } - - fn with_connected_shf(h: H, f: F) -> T where H: Handler + 'static, - F: FnOnce (&mut SeekableHttpFile) -> T { - with_server_thread(h, |sock| { - let url = format!("http://{}:{}/", sock.ip(), sock.port()); - let mut shf = SeekableHttpFile::new(&url).unwrap(); - f(&mut shf) - }) - } - - fn with_fixed_buf_server(buf: &'static [u8], f: F) -> T where F: FnOnce (&mut SeekableHttpFile) -> T { - let sz = buf.len() as u64; - - with_connected_shf(move |req: Request, mut res: Response| { - match req.method { - Method::Head => { - res.headers_mut().set(ContentLength(buf.len() as u64)); - res.start().unwrap(); - // No body content. - }, - Method::Get => { - if let Some(range) = req.headers.get::() { - match range { - &Range::Unregistered(..) => unimplemented!(), - &Range::Bytes(ref specvec) => { - if specvec.len() != 1 { - unimplemented!(); - } - - match specvec[0] { - // `start` is unsigned so it can never be negative. - ByteRangeSpec::FromTo(start, end) => { - // TODO?: incomplete writes, etc? - assert!(end >= start); - assert!(end < sz); // end index is inclusive - *res.status_mut() = StatusCode::PartialContent; - res.headers_mut().set(ContentLength(end + 1 - start)); - let mut res = res.start().unwrap(); - res.write_all(&buf[start as usize..(end+1) as usize]).unwrap(); - }, - ByteRangeSpec::AllFrom(_start) => unimplemented!(), - ByteRangeSpec::Last(_end) => unimplemented!(), - } - }, - } - } else { - res.send(buf).unwrap(); - } - }, - _ => *res.status_mut() = StatusCode::MethodNotAllowed - } - }, f) - } - - - static HELLO_WORLD: &'static [u8] = b"Hello world!"; - - #[test] - fn hello_world() { - with_fixed_buf_server(HELLO_WORLD, |shf| { - assert_eq!(shf.len(), 12); - - let mut full = Vec::new(); - shf.read_to_end(&mut full).unwrap(); - assert_eq!(&full[..], HELLO_WORLD); - - full.clear(); - shf.seek(SeekFrom::Start(0)).unwrap(); - shf.read_to_end(&mut full).unwrap(); - assert_eq!(&full[..], HELLO_WORLD); - - full.clear(); - shf.seek(SeekFrom::Start(10)).unwrap(); - shf.read_to_end(&mut full).unwrap(); - assert_eq!(&full[..], b"d!"); - - full.clear(); - shf.seek(SeekFrom::End(-4)).unwrap(); - shf.read_to_end(&mut full).unwrap(); - assert_eq!(&full[..], b"rld!"); - - let mut four = [0u8; 4]; - shf.seek(SeekFrom::Start(2)).unwrap(); - shf.read_exact(&mut four).unwrap(); - assert_eq!(&four, b"llo "); - - shf.seek(SeekFrom::Current(-2)).unwrap(); - shf.read_exact(&mut four).unwrap(); - assert_eq!(&four, b"o wo"); - - full.clear(); - shf.seek(SeekFrom::Current(2)).unwrap(); - shf.read_to_end(&mut full).unwrap(); - assert_eq!(&full[..], b"d!"); - }); - } - - #[test] - fn hello_world_seeks() { - // I wanted these to be #[should_panic] tests, but if it panics - // the test fails ... - with_fixed_buf_server(HELLO_WORLD, |shf| { - assert_eq!(shf.len(), 12); - shf.seek(SeekFrom::Start(0)).unwrap(); - shf.seek(SeekFrom::Start(12)).unwrap(); - shf.seek(SeekFrom::Start(13)).unwrap_err(); - - shf.seek(SeekFrom::End(0)).unwrap(); - shf.seek(SeekFrom::End(1)).unwrap_err(); - shf.seek(SeekFrom::End(-12)).unwrap(); - shf.seek(SeekFrom::End(-13)).unwrap_err(); - - shf.seek(SeekFrom::Start(6)).unwrap(); - shf.seek(SeekFrom::Current(-6)).unwrap(); - shf.seek(SeekFrom::Start(6)).unwrap(); - shf.seek(SeekFrom::Current(-7)).unwrap_err(); - shf.seek(SeekFrom::Start(6)).unwrap(); - shf.seek(SeekFrom::Current(6)).unwrap(); - shf.seek(SeekFrom::Start(6)).unwrap(); - shf.seek(SeekFrom::Current(7)).unwrap_err(); - }); - } - - - static TWO_CHUNKS: &'static [u8] = &[0; CHUNK_SIZE + 1]; - - #[test] - fn two_chunks() { - with_fixed_buf_server(TWO_CHUNKS, |shf| { - assert_eq!(shf.len(), CHUNK_SIZE as u64 + 1); - - let mut full = Vec::new(); - shf.read_to_end(&mut full).unwrap(); - assert_eq!(&full[..], TWO_CHUNKS); - - shf.seek(SeekFrom::Start(0)).unwrap(); - full.clear(); - shf.read_to_end(&mut full).unwrap(); - assert_eq!(&full[..], TWO_CHUNKS); - }); - } -} diff --git a/src/io/itarbundle.rs b/src/io/itarbundle.rs index 7d622432d..5fa81d26d 100644 --- a/src/io/itarbundle.rs +++ b/src/io/itarbundle.rs @@ -1,21 +1,19 @@ // src/io/itarbundle.rs -- I/O on files in an indexed tar file "bundle" -// Copyright 2017-2018 the Tectonic Project +// Copyright 2017-2019 the Tectonic Project // Licensed under the MIT License. use flate2::read::GzDecoder; -use hyper::client::{RedirectPolicy, Response}; -use hyper::header::{Headers, Range}; -use hyper::status::StatusCode; -use hyper::{self, Client, Url}; +use reqwest::{header, Client, RedirectPolicy, Response, StatusCode}; use std::collections::HashMap; use std::ffi::{OsStr, OsString}; use std::io::{BufRead, BufReader, Cursor, Read}; -use super::{create_hyper_client, Bundle, InputHandle, InputOrigin, IoProvider, OpenResult}; +use super::{Bundle, InputHandle, InputOrigin, IoProvider, OpenResult}; use crate::errors::{Error, ErrorKind, Result, ResultExt}; use crate::status::StatusBackend; use crate::{tt_note, tt_warning}; +const MAX_HTTP_REDIRECTS_ALLOWED: usize = 10; const MAX_HTTP_ATTEMPTS: usize = 4; // A simple way to read chunks out of a big seekable byte stream. You could @@ -37,7 +35,7 @@ impl HttpRangeReader { pub fn new(url: &str) -> HttpRangeReader { HttpRangeReader { url: url.to_owned(), - client: create_hyper_client(), + client: Client::new(), } } } @@ -48,15 +46,23 @@ impl RangeRead for HttpRangeReader { fn read_range(&mut self, offset: u64, length: usize) -> Result { let end_inclusive = offset + length as u64 - 1; - let mut headers = Headers::new(); - headers.set(Range::bytes(offset, end_inclusive)); - - let req = self.client.get(&self.url).headers(headers); - let res = req.send()?; - - if res.status != StatusCode::PartialContent { - // FIXME: this loses the actual status code! Should report it. - return Err(hyper::Error::Status.into()); + // We're creating a string for an HTTP range header value here. We'd prefer to do this in a + // more type-safe fashion. For example, we could use the `headers` crate; however, it + // relies on `proc-macro2`, which cannot be statically linked on the musl platform. + let range_value = format!("bytes={}-{}", offset, end_inclusive); + + let res = self + .client + .get(&self.url) + .header(header::RANGE, range_value) + .send()?; + + if res.status() != StatusCode::PARTIAL_CONTENT { + return Err(Error::from(ErrorKind::UnexpectedHttpResponse( + self.url.clone(), + res.status(), + ))) + .chain_err(|| format!("read range expected {}", StatusCode::PARTIAL_CONTENT)); } Ok(res) @@ -187,7 +193,6 @@ impl IoProvider for ITarBundle { } if overall_failed { - // Note: can't save & reuse the hyper errors since they're not cloneable return OpenResult::Err( ErrorKind::Msg(format!( "failed to retrieve \"{}\" from the network; \ @@ -223,33 +228,43 @@ impl ITarIoFactory for HttpITarIoFactory { // we didn't do this separately, the index file would have to be the // one with the redirect setup, which would be confusing and annoying. - let mut probe_client = create_hyper_client(); - fn url_redirection_policy(url: &Url) -> bool { + let redirect_policy = RedirectPolicy::custom(|attempt| { // In the process of resolving the file url it might be neccesary // to stop at a certain level of redirection. This might be required // because some hosts might redirect to a version of the url where // it isn't possible to select the index file by appending .index.gz. // (This mostly happens because CDNs redirect to the file hash.) - if let Some(segments) = url.path_segments() { - segments + if attempt.previous().len() >= MAX_HTTP_REDIRECTS_ALLOWED { + attempt.too_many_redirects() + } else if let Some(segments) = attempt.url().clone().path_segments() { + let follow = segments .last() .map(|file| file.contains('.')) - .unwrap_or(true) + .unwrap_or(true); + if follow { + attempt.follow() + } else { + attempt.stop() + } } else { - true + attempt.follow() } - } - probe_client.set_redirect_policy(RedirectPolicy::FollowIf(url_redirection_policy)); - - let req = probe_client.head(&self.url); - let res = req.send()?; - - if !(res.status.is_success() || res.status == StatusCode::Found) { - return Err(Error::from(hyper::Error::Status)) - .chain_err(|| format!("couldn\'t probe {}", self.url)); + }); + let res = Client::builder() + .redirect(redirect_policy) + .build()? + .head(&self.url) + .send()?; + + if !(res.status().is_success() || res.status() == StatusCode::FOUND) { + return Err(Error::from(ErrorKind::UnexpectedHttpResponse( + self.url.clone(), + res.status(), + ))) + .chain_err(|| "couldn\'t probe".to_string()); } - let final_url = res.url.clone().into_string(); + let final_url = res.url().clone().into_string(); if final_url != self.url { tt_note!(status, "resolved to {}", final_url); @@ -261,12 +276,13 @@ impl ITarIoFactory for HttpITarIoFactory { let mut index_url = self.url.clone(); index_url.push_str(".index.gz"); - let client = create_hyper_client(); - let req = client.get(&index_url); - let res = req.send()?; - if !res.status.is_success() { - return Err(Error::from(hyper::Error::Status)) - .chain_err(|| format!("couldn\'t fetch {}", index_url)); + let res = Client::new().get(&index_url).send()?; + if !res.status().is_success() { + return Err(Error::from(ErrorKind::UnexpectedHttpResponse( + index_url.clone(), + res.status(), + ))) + .chain_err(|| "couldn\'t fetch".to_string()); } Ok(GzDecoder::new(res)) diff --git a/src/io/mod.rs b/src/io/mod.rs index 53784eeb7..4016f9293 100644 --- a/src/io/mod.rs +++ b/src/io/mod.rs @@ -5,9 +5,6 @@ //! Tectonic’s pluggable I/O backend. use flate2::read::GzDecoder; -use hyper::net::HttpsConnector; -use hyper::Client; -use hyper_native_tls::NativeTlsClient; use std::borrow::Cow; use std::ffi::{OsStr, OsString}; use std::fs::File; @@ -22,7 +19,6 @@ use crate::status::StatusBackend; pub mod filesystem; pub mod format_cache; -//pub mod hyper_seekable; -- Not currently used, but nice code to keep around. pub mod itarbundle; pub mod local_cache; pub mod memory; @@ -585,13 +581,6 @@ fn normalize_tex_path(path: &OsStr) -> Cow { } } -// Creates an hyper client capable of HTTPS-connections. -pub fn create_hyper_client() -> Client { - let ssl = NativeTlsClient::new().unwrap(); - let connector = HttpsConnector::new(ssl); - Client::with_connector(connector) -} - // Helper for testing. FIXME: I want this to be conditionally compiled with // #[cfg(test)] but things break if I do that. From 87b3be1ed2e1d9f2aee723738e6d219065d9cc9f Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Mon, 17 Jun 2019 17:51:00 -0400 Subject: [PATCH 2/4] dist: fix the static Linux build (?) After much wailing and gnashing of teeth, I think I have an approach that fixes the static Linux build in the face of proc-macro usage. In particular, proc-macros can work if we cross-compile. Here, we set up a Docker container with a fakey cross-compilation setup that farms out the work to an Alpine Linux chroot. That way we can take advantage of the statically linked, MUSL-based libraries that Alpine provides. We can now build static Tectonic without having to gate any features and using Rust stable, so this should update the CI to not ignore the problem if the static build fails. --- .travis.yml | 3 +- .../x86_64-alpine-linux-musl/Dockerfile | 56 +++++++----------- .../docker/x86_64-alpine-linux-musl/README.md | 57 +++++++++++++++++++ .../cargo-config.toml | 5 ++ .../x86_64-alpine-linux-musl/linkwrapper.sh | 27 +++++++++ .../x86_64-alpine-linux-musl/pkg-config-rs.sh | 25 -------- .../x86_64-alpine-linux-musl/setup_priv.sh | 50 ++++++++++++++++ .../x86_64-alpine-linux-musl/setup_unpriv.sh | 29 ++++++++++ dist/docker/x86_64-alpine-linux-musl/sudoers | 2 + .../x86_64-alpine-linux-musl/toolwrapper.sh | 44 ++++++++++++++ dist/travis.sh | 2 +- 11 files changed, 237 insertions(+), 63 deletions(-) create mode 100644 dist/docker/x86_64-alpine-linux-musl/README.md create mode 100644 dist/docker/x86_64-alpine-linux-musl/cargo-config.toml create mode 100644 dist/docker/x86_64-alpine-linux-musl/linkwrapper.sh delete mode 100755 dist/docker/x86_64-alpine-linux-musl/pkg-config-rs.sh create mode 100644 dist/docker/x86_64-alpine-linux-musl/setup_priv.sh create mode 100644 dist/docker/x86_64-alpine-linux-musl/setup_unpriv.sh create mode 100644 dist/docker/x86_64-alpine-linux-musl/sudoers create mode 100644 dist/docker/x86_64-alpine-linux-musl/toolwrapper.sh diff --git a/.travis.yml b/.travis.yml index 15a9b450c..14d2ee0e0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,11 +28,10 @@ matrix: - os: osx osx_image: xcode8.3 rust: stable - # Static build for Linux; Rust nightly required + # Static build for Linux/x86_64 - os: linux sudo: required dist: xenial - rust: nightly env: IMAGE=x86_64-alpine-linux-musl allow_failures: - rust: nightly diff --git a/dist/docker/x86_64-alpine-linux-musl/Dockerfile b/dist/docker/x86_64-alpine-linux-musl/Dockerfile index dacca5b1c..b21adbb5d 100644 --- a/dist/docker/x86_64-alpine-linux-musl/Dockerfile +++ b/dist/docker/x86_64-alpine-linux-musl/Dockerfile @@ -1,43 +1,29 @@ # Copyright 2018-2019 The Tectonic Project # Licensed under the MIT License. -FROM alpine:edge +FROM ubuntu:18.04 -RUN apk update && \ - apk add \ - g++ \ - git \ - rust \ - cargo \ - fontconfig-dev \ - freetype-static \ - glib-static \ - graphite2-dev \ - graphite2-static \ - harfbuzz-dev \ - harfbuzz-static \ - icu-dev \ - icu-static \ - libpng-static \ - openssl-dev \ - zlib-dev +ADD setup_priv.sh / +RUN sh /setup_priv.sh -ADD pkg-config-rs.sh / -RUN /pkg-config-rs.sh +ADD sudoers /etc/sudoers.d/nopasswd +USER rust +ENV PATH=/alpine/home/rust/.cargo/bin:/usr/sbin:/usr/bin:/sbin:/bin -ENV PKG_CONFIG_ALL_STATIC=1 -ENV OPENSSL_STATIC=1 -ENV OPENSSL_DIR=/usr +ADD setup_unpriv.sh / +ADD toolwrapper.sh /alpine/home/rust/ +ADD linkwrapper.sh /alpine/home/rust/ +RUN sh /setup_unpriv.sh -# cc-rs does not support static linking stdc++, -# so we omit linking information on build.rs by setting CXXSTDLIB='' -# and specify static linking in RUSTFLAGS -ENV CXXSTDLIB="" -ENV RUSTFLAGS="-L /usr/lib -l static=stdc++ -C target-feature=+crt-static" +# With the following customizations, we can just "docker run -v +# $tectonic:/alpine/home/rust/src $image cargo ..." and The Right Thing should +# happen: -# Use a patched pkg-config-rs to allow static linking with system libraries. -# The --no-default-features flag removes serde-derive as a dep, which doesn't -# work when linking statically (rust-lang#40147). -CMD cd /tectonic && \ - echo -e "[patch.crates-io]\npkg-config = { path = \"/pkg-config-rs\" }" >> Cargo.toml && \ - cargo test --release --no-default-features +ADD cargo-config.toml /alpine/home/rust/.cargo/config +ENV RUSTFLAGS="-L /alpine/usr/lib -l static=expat -l static=uuid -l static=stdc++ -C target-feature=+crt-static" +ENV TARGET_CC="x86_64-unknown-linux-musl-cc" +ENV TARGET_CXX="x86_64-unknown-linux-musl-g++" +ENV PKG_CONFIG_ALLOW_CROSS=1 + +WORKDIR /alpine/home/rust/src +CMD ["cargo", "test", "--release", "--all"] diff --git a/dist/docker/x86_64-alpine-linux-musl/README.md b/dist/docker/x86_64-alpine-linux-musl/README.md new file mode 100644 index 000000000..a1eeb3a21 --- /dev/null +++ b/dist/docker/x86_64-alpine-linux-musl/README.md @@ -0,0 +1,57 @@ +# Statically-linked Tectonic cross-compilation environment + +This Docker recipe creates a container that can be used to build a +statically-linked Tectonic executable. The process is pretty complex! + +We used to build Tectonic inside a pure Alpine Linux container. Everything in +Alpine uses musl, the static-linking-friendly libc, and it provides a +toolchain that can create static binaries, and Rust generally supports musl. +So far so good. + +*However*, Tectonic needs “procedural macro” crates to compile, and these +are not compatible with the Alpine static target. Procedural macros are +implemented as dynamic modules loaded into the Rust compiler executable. +On a static target, you ... can't do that. + +It took me a while to figure this out, but the solution is cross-compilation. +The Rust compiler executable is running on the "build" architecture, whereas +the output program will run on the "target" architecture. Procedural macros +should work for a static target architecture *if* the build architecture is +dynamic — a cross-compilation situation. + +Cross-compilation is gnarly for Tectonic because we depend on several system +libraries, like Harfbuzz and Freetype. If we're going to cross-compile, we +need static versions of these libraries available on the build machine *in the +target architecture* — which is usually difficult to set up. In particular, +our build machine will need some C/C++ cross-compilation toolchain, and our +target libraries need to be guaranteed to be compatible with that toolchain. +Copying binaries willy-nilly off the interent *might* work but is probably +asking for trouble. + +How can we conveniently get cross-compiled versions of our dependencies? + +It would be nice to leverage Alpine Linux — it has up-to-date, pre-built, +static binaries of all of the libraries that Tectonic depends upon. You can’t +just install the Alpine toolchain and libraries in an Ubunutu container, but +you *can* install [Alpine in a chroot]. Inside the chroot, the Alpine +toolchain is accessible. + +So our Docker container sets up the Alpine tools, then creates some wrappers +so that *outside* of the chroot we can pretend that the tools are normal +programs. The wrappers strip off `/alpine` prefixes and then run things inside +the chroot. + +[Alpine in a chroot]: https://wiki.alpinelinux.org/wiki/Installing_Alpine_Linux_in_a_chroot + +Once we actually get cross-compiling, it turns out that statically linking +Rust with C++ is a bit of a pain. After some voodoo hacks I got it working, +specifically by using a [linker wrapper script] suggested by GitHub user +`@dl00`. + +[linker wrapper script]: https://github.com/rust-lang/rust/issues/36710#issuecomment-364623950 + +**Note**: Our CI runs this docker container inside its own Ubuntu Xenial VM. +The way that we do things now, we could just skip Docker altogether and set up +the Alpine chroot inside the VM directly. But it seems helpful to capture the +magic in a Docker setup and shouldn't slow things down much, so we'll stick +with the container. diff --git a/dist/docker/x86_64-alpine-linux-musl/cargo-config.toml b/dist/docker/x86_64-alpine-linux-musl/cargo-config.toml new file mode 100644 index 000000000..05fca2237 --- /dev/null +++ b/dist/docker/x86_64-alpine-linux-musl/cargo-config.toml @@ -0,0 +1,5 @@ +[build] +target = "x86_64-unknown-linux-musl" + +[target.x86_64-unknown-linux-musl] +linker = "/alpine/home/rust/linkwrapper.sh" diff --git a/dist/docker/x86_64-alpine-linux-musl/linkwrapper.sh b/dist/docker/x86_64-alpine-linux-musl/linkwrapper.sh new file mode 100644 index 000000000..23ef1c27a --- /dev/null +++ b/dist/docker/x86_64-alpine-linux-musl/linkwrapper.sh @@ -0,0 +1,27 @@ +#! /bin/bash +# Copyright 2019 The Tectonic Project +# Licensed under the MIT License. + +# This script derived from GitHub user @dl00: +# + +platform="x86_64-unknown-linux-musl" + +gcclibdir="$(echo /alpine/usr/lib/gcc/*/*/crtbeginT.o)" +gcclibdir="${gcclibdir%/crtbeginT.o}" + +args=() + +for arg in "$@"; do + if [[ $arg = *"Bdynamic"* ]]; then + true # we do not want this arg + elif [[ $arg = *"crti.o"* ]]; then + args+=("$arg" "$gcclibdir/crtbeginT.o" "-Bstatic") + elif [[ $arg = *"crtn.o"* ]]; then + args+=("-lgcc" "-lgcc_eh" "-lc" "$gcclibdir/crtend.o" "$arg") + else + args+=("$arg") + fi +done + +exec $platform-g++ "${args[@]}" diff --git a/dist/docker/x86_64-alpine-linux-musl/pkg-config-rs.sh b/dist/docker/x86_64-alpine-linux-musl/pkg-config-rs.sh deleted file mode 100755 index 6edf7b458..000000000 --- a/dist/docker/x86_64-alpine-linux-musl/pkg-config-rs.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh -# Copyright 2018 The Tectonic Project -# Licensed under the MIT License. - -set -ex - -git clone --branch 0.3.14 https://github.com/alexcrichton/pkg-config-rs /pkg-config-rs - -# make pkg-config-rs allows static linking with system libraries -cd /pkg-config-rs -patch -p1 <<'EOF' -diff --git a/src/lib.rs b/src/lib.rs -index 88dd310..ffcd7ae 100644 ---- a/src/lib.rs -+++ b/src/lib.rs -@@ -547,7 +547,7 @@ fn is_static_available(name: &str, dirs: &[PathBuf]) -> bool { - }; - - dirs.iter().any(|dir| { -- !system_roots.iter().any(|sys| dir.starts_with(sys)) && -+ // !system_roots.iter().any(|sys| dir.starts_with(sys)) && - dir.join(&libname).exists() - }) - } -EOF diff --git a/dist/docker/x86_64-alpine-linux-musl/setup_priv.sh b/dist/docker/x86_64-alpine-linux-musl/setup_priv.sh new file mode 100644 index 000000000..f2297e8c6 --- /dev/null +++ b/dist/docker/x86_64-alpine-linux-musl/setup_priv.sh @@ -0,0 +1,50 @@ +#! /bin/sh +# Copyright 2019 The Tectonic Project +# Licensed under the MIT License. + +set -ex + +alpine_pkgs="\ +g++ \ +fontconfig-dev \ +freetype-static \ +glib-static \ +graphite2-dev \ +graphite2-static \ +harfbuzz-dev \ +harfbuzz-static \ +icu-dev \ +icu-static \ +libpng-static \ +openssl-dev \ +zlib-dev \ +" + +cd / + +export TERM=dumb +apt-get update +apt-get install -y \ + build-essential \ + sudo \ + wget +apt-get clean +rm -rf /var/lib/apt/lists/* + +wget https://raw.githubusercontent.com/alpinelinux/alpine-chroot-install/v0.10.0/alpine-chroot-install +echo 'dcceb34aa63767579f533a7f2e733c4d662b0d1b alpine-chroot-install' |sha1sum -c + +# This command will error out when it attempts to bind-mount things like /proc +# because that is not allowed inside an unprivileged Docker container. +# Fortunately we can get away without making those mounts, so we can just +# ignore the error. Unfortunately this means that we'll continue on blithely +# if some other error occurs ... +sh alpine-chroot-install -b v3.9 -m "http://dl-cdn.alpinelinux.org/alpine/" || true +rm -f alpine-chroot-install + +/alpine/enter-chroot sh -c "apk update && apk add $alpine_pkgs" + +useradd rust --user-group --create-home --home-dir /alpine/home/rust --shell /bin/bash --groups sudo +/alpine/enter-chroot sh -c "adduser -h /home/rust -H -D rust" + +rm -f "$0" # self-destruct diff --git a/dist/docker/x86_64-alpine-linux-musl/setup_unpriv.sh b/dist/docker/x86_64-alpine-linux-musl/setup_unpriv.sh new file mode 100644 index 000000000..adf3e2d78 --- /dev/null +++ b/dist/docker/x86_64-alpine-linux-musl/setup_unpriv.sh @@ -0,0 +1,29 @@ +#! /bin/sh +# Copyright 2019 The Tectonic Project +# Licensed under the MIT License. + +set -ex + +platform="x86_64-unknown-linux-musl" + +cd + +wget -O rustup.sh https://sh.rustup.rs +sh rustup.sh -y --default-toolchain stable +rm -f rustup.sh + +rustup target add $platform + +sudo chmod +x $HOME/*.sh + +for tool in cc g++ ld pkg-config ; do + ln -s ../../toolwrapper.sh $HOME/.cargo/bin/$platform-$tool +done + +cat <$HOME/.cargo/bin/pkg-config +#! /bin/bash +exec $platform-pkg-config "\$@" +EOF +chmod +x $HOME/.cargo/bin/pkg-config + +sudo rm -f "$0" # self-destruct diff --git a/dist/docker/x86_64-alpine-linux-musl/sudoers b/dist/docker/x86_64-alpine-linux-musl/sudoers new file mode 100644 index 000000000..04651d592 --- /dev/null +++ b/dist/docker/x86_64-alpine-linux-musl/sudoers @@ -0,0 +1,2 @@ +# Allow group sudo to use `sudo` without a password. +%sudo ALL=(ALL:ALL) NOPASSWD:ALL diff --git a/dist/docker/x86_64-alpine-linux-musl/toolwrapper.sh b/dist/docker/x86_64-alpine-linux-musl/toolwrapper.sh new file mode 100644 index 000000000..15c543025 --- /dev/null +++ b/dist/docker/x86_64-alpine-linux-musl/toolwrapper.sh @@ -0,0 +1,44 @@ +#! /bin/bash +# Copyright 2019 The Tectonic Project +# Licensed under the MIT License. + +# Wrap toolchain invocations to happen inside the Alpine chroot. + +platform="x86_64-unknown-linux-musl" + +# $0 + +exename="$(basename $0)" + +if [[ $exename != $platform-* ]] ; then + echo >&2 "error: executable name ($exename) must start with \"$platform-\"" + exit 1 +fi + +exename="${exename#$platform-}" + +# working directory + +curdir=$(pwd) + +if [[ $curdir != /alpine/* ]] ; then + echo >&2 "error: working directory must be inside /alpine/ prefix" + exit 1 +fi + +curdir="${curdir#/alpine}" + +# args. We use printf to avoid "echo" eating flag args like "-n", and a global +# sed substitution in case a single arg contains multiple paths (could happen +# with something like -Wl,foo,bar,baz). + +args=() + +for arg in "$@"; do + args+=("$(printf %s "$arg" |sed -e s@/alpine@@g)") +done + +# ready to go! + +### set -x # <= for debugging +exec /alpine/enter-chroot -u rust sh -c "cd $curdir && \"\$@\"" -- "$exename" "${args[@]}" diff --git a/dist/travis.sh b/dist/travis.sh index f383d44e4..c476dff1f 100644 --- a/dist/travis.sh +++ b/dist/travis.sh @@ -192,7 +192,7 @@ if $is_docker_build ; then docker build -t ttci-$IMAGE dist/docker/$IMAGE/ travis_fold_end docker_build travis_fold_start docker_test "docker test" verbose - docker run -v $(pwd):/tectonic ttci-$IMAGE + docker run -v $(pwd):/alpine/home/rust/src ttci-$IMAGE travis_fold_end docker_test else travis_fold_start cargo_build "cargo build" verbose From e30b633959e58ee1fe37f745d2b83c2bc1df65c9 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Mon, 17 Jun 2019 18:15:20 -0400 Subject: [PATCH 3/4] dist: attempt to fix Travis+Docker permissions issue --- dist/docker/x86_64-alpine-linux-musl/Dockerfile | 2 ++ dist/docker/x86_64-alpine-linux-musl/setup_priv.sh | 5 +++-- dist/travis.sh | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/dist/docker/x86_64-alpine-linux-musl/Dockerfile b/dist/docker/x86_64-alpine-linux-musl/Dockerfile index b21adbb5d..eec236685 100644 --- a/dist/docker/x86_64-alpine-linux-musl/Dockerfile +++ b/dist/docker/x86_64-alpine-linux-musl/Dockerfile @@ -3,6 +3,8 @@ FROM ubuntu:18.04 +ARG uid=1000 + ADD setup_priv.sh / RUN sh /setup_priv.sh diff --git a/dist/docker/x86_64-alpine-linux-musl/setup_priv.sh b/dist/docker/x86_64-alpine-linux-musl/setup_priv.sh index f2297e8c6..9b8a9cd81 100644 --- a/dist/docker/x86_64-alpine-linux-musl/setup_priv.sh +++ b/dist/docker/x86_64-alpine-linux-musl/setup_priv.sh @@ -44,7 +44,8 @@ rm -f alpine-chroot-install /alpine/enter-chroot sh -c "apk update && apk add $alpine_pkgs" -useradd rust --user-group --create-home --home-dir /alpine/home/rust --shell /bin/bash --groups sudo -/alpine/enter-chroot sh -c "adduser -h /home/rust -H -D rust" +useradd rust --user-group --create-home --home-dir /alpine/home/rust \ + --shell /bin/bash --groups sudo --uid $uid +/alpine/enter-chroot sh -c "adduser -h /home/rust -H -D rust -u $uid" rm -f "$0" # self-destruct diff --git a/dist/travis.sh b/dist/travis.sh index c476dff1f..e639002d8 100644 --- a/dist/travis.sh +++ b/dist/travis.sh @@ -189,7 +189,7 @@ fi if $is_docker_build ; then travis_fold_start docker_build "docker build" verbose - docker build -t ttci-$IMAGE dist/docker/$IMAGE/ + docker build --build-arg=uid=$(id -u) -t ttci-$IMAGE dist/docker/$IMAGE/ travis_fold_end docker_build travis_fold_start docker_test "docker test" verbose docker run -v $(pwd):/alpine/home/rust/src ttci-$IMAGE From 70c6ce1f402a819a5fb71e873ad2dd3ea3324c78 Mon Sep 17 00:00:00 2001 From: Peter Williams Date: Tue, 18 Jun 2019 07:58:41 -0400 Subject: [PATCH 4/4] Revert "Remove headers, use string range header" This reverts commit b9625028a12a1813f3ee12709dacc9438c54eb80. (This commit has been squashed into the one adding support for reqwest.) --- Cargo.lock | 57 +++++++++++++++++++++++++++++++++++++++++--- Cargo.toml | 1 + src/io/itarbundle.rs | 15 ++++-------- 3 files changed, 60 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index be9a8a210..a76af28cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -419,7 +419,7 @@ dependencies = [ [[package]] name = "h2" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -434,6 +434,41 @@ dependencies = [ "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "headers" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "headers-core 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "headers-derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", + "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "headers-core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "headers-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.36 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "http" version = "0.1.17" @@ -468,7 +503,7 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "h2 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1152,6 +1187,17 @@ dependencies = [ "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "sha-1" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "sha2" version = "0.8.0" @@ -1237,6 +1283,7 @@ dependencies = [ "error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "fs2 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "headers 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "md-5 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1696,7 +1743,10 @@ dependencies = [ "checksum futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)" = "a2037ec1c6c1c4f79557762eab1f7eae1f64f6cb418ace90fae88f0942b60139" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592" -"checksum h2 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)" = "1e42e3daed5a7e17b12a0c23b5b2fbff23a925a570938ebee4baca1a9a1a2240" +"checksum h2 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)" = "69b2a5a3092cbebbc951fe55408402e696ee2ed09019137d1800fc2c411265d2" +"checksum headers 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc6e2e51d356081258ef05ff4c648138b5d3fe64b7300aaad3b820554a2b7fb6" +"checksum headers-core 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "967131279aaa9f7c20c7205b45a391638a83ab118e6509b2d0ccbe08de044237" +"checksum headers-derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "97c462e8066bca4f0968ddf8d12de64c40f2c2187b3b9a2fa994d06e8ad444a9" "checksum http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "eed324f0f0daf6ec10c474f150505af2c143f251722bf9dbd1261bd1f2ee2c1a" "checksum http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" @@ -1776,6 +1826,7 @@ dependencies = [ "checksum serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)" = "46a3223d0c9ba936b61c0d2e3e559e3217dbfb8d65d06d26e8b3c25de38bae3e" "checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" "checksum serde_urlencoded 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "642dd69105886af2efd227f75a520ec9b44a820d65bc133a9131f7d229fd165a" +"checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68" "checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" "checksum shell32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9ee04b46101f57121c9da2b151988283b6beb79b34f5bb29a58ee48cb695122c" "checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" diff --git a/Cargo.toml b/Cargo.toml index 4f395ac3b..013bd8c44 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,6 +45,7 @@ clap = "^2.33" error-chain = "^0.12" flate2 = "^1.0" fs2 = "^0.4" +headers = "^0.2" lazy_static = "^1.2" libc = "^0.2" tempfile = "^3.0" diff --git a/src/io/itarbundle.rs b/src/io/itarbundle.rs index 5fa81d26d..6dfc59c91 100644 --- a/src/io/itarbundle.rs +++ b/src/io/itarbundle.rs @@ -3,7 +3,7 @@ // Licensed under the MIT License. use flate2::read::GzDecoder; -use reqwest::{header, Client, RedirectPolicy, Response, StatusCode}; +use reqwest::{header::HeaderMap, Client, RedirectPolicy, Response, StatusCode}; use std::collections::HashMap; use std::ffi::{OsStr, OsString}; use std::io::{BufRead, BufReader, Cursor, Read}; @@ -46,16 +46,11 @@ impl RangeRead for HttpRangeReader { fn read_range(&mut self, offset: u64, length: usize) -> Result { let end_inclusive = offset + length as u64 - 1; - // We're creating a string for an HTTP range header value here. We'd prefer to do this in a - // more type-safe fashion. For example, we could use the `headers` crate; however, it - // relies on `proc-macro2`, which cannot be statically linked on the musl platform. - let range_value = format!("bytes={}-{}", offset, end_inclusive); + let mut headers = HeaderMap::new(); + use headers::HeaderMapExt; + headers.typed_insert(headers::Range::bytes(offset..=end_inclusive).unwrap()); - let res = self - .client - .get(&self.url) - .header(header::RANGE, range_value) - .send()?; + let res = self.client.get(&self.url).headers(headers).send()?; if res.status() != StatusCode::PARTIAL_CONTENT { return Err(Error::from(ErrorKind::UnexpectedHttpResponse(