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/Cargo.lock b/Cargo.lock index 77f43a7d5..a76af28cb 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,79 @@ dependencies = [ "typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "h2" +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)", + "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 = "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" +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 +497,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.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)", - "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 +547,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 +595,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 +631,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 = [ + "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 = [ - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "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 +683,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 +728,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 +800,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 +887,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 +1052,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 +1111,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 +1135,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 +1166,38 @@ 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 = "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" @@ -735,11 +1218,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 +1261,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 +1283,13 @@ 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)", + "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)", "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 +1365,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 +1506,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 +1536,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 +1585,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 +1608,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 +1664,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 +1694,88 @@ 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.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" -"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 +1783,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 +1812,66 @@ 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 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" +"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 +1879,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..013bd8c44 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,12 +45,12 @@ clap = "^2.33" error-chain = "^0.12" flate2 = "^1.0" fs2 = "^0.4" -hyper = "^0.10" -hyper-native-tls = "^0.3" +headers = "^0.2" 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/dist/docker/x86_64-alpine-linux-musl/Dockerfile b/dist/docker/x86_64-alpine-linux-musl/Dockerfile index dacca5b1c..eec236685 100644 --- a/dist/docker/x86_64-alpine-linux-musl/Dockerfile +++ b/dist/docker/x86_64-alpine-linux-musl/Dockerfile @@ -1,43 +1,31 @@ # Copyright 2018-2019 The Tectonic Project # Licensed under the MIT License. -FROM alpine:edge - -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 pkg-config-rs.sh / -RUN /pkg-config-rs.sh - -ENV PKG_CONFIG_ALL_STATIC=1 -ENV OPENSSL_STATIC=1 -ENV OPENSSL_DIR=/usr - -# 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" - -# 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 +FROM ubuntu:18.04 + +ARG uid=1000 + +ADD setup_priv.sh / +RUN sh /setup_priv.sh + +ADD sudoers /etc/sudoers.d/nopasswd +USER rust +ENV PATH=/alpine/home/rust/.cargo/bin:/usr/sbin:/usr/bin:/sbin:/bin + +ADD setup_unpriv.sh / +ADD toolwrapper.sh /alpine/home/rust/ +ADD linkwrapper.sh /alpine/home/rust/ +RUN sh /setup_unpriv.sh + +# With the following customizations, we can just "docker run -v +# $tectonic:/alpine/home/rust/src $image cargo ..." and The Right Thing should +# happen: + +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..9b8a9cd81 --- /dev/null +++ b/dist/docker/x86_64-alpine-linux-musl/setup_priv.sh @@ -0,0 +1,51 @@ +#! /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 --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/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..e639002d8 100644 --- a/dist/travis.sh +++ b/dist/travis.sh @@ -189,10 +189,10 @@ 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):/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 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..6dfc59c91 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::HeaderMap, 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,18 @@ 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 mut headers = HeaderMap::new(); + use headers::HeaderMapExt; + headers.typed_insert(headers::Range::bytes(offset..=end_inclusive).unwrap()); - let req = self.client.get(&self.url).headers(headers); - let res = req.send()?; + let res = self.client.get(&self.url).headers(headers).send()?; - if res.status != StatusCode::PartialContent { - // FIXME: this loses the actual status code! Should report it. - return Err(hyper::Error::Status.into()); + 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 +188,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 +223,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 +271,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.