From a48a111cee6298f4628d4ae12b60a43c1b17cecf Mon Sep 17 00:00:00 2001 From: Naveen Gattu Date: Thu, 23 Dec 2021 11:15:35 -0800 Subject: [PATCH] Upgrade Hyper --- Cargo.lock | 859 ++++++++---------- components/constellation/Cargo.toml | 3 +- components/devtools/Cargo.toml | 5 +- components/devtools/actors/network_event.rs | 4 +- components/devtools_traits/Cargo.toml | 3 +- components/devtools_traits/lib.rs | 2 +- components/malloc_size_of/Cargo.toml | 8 +- components/malloc_size_of/lib.rs | 4 +- components/net/Cargo.toml | 29 +- components/net/connector.rs | 68 +- components/net/cookie.rs | 2 +- components/net/cookie_storage.rs | 4 +- components/net/decoder.rs | 196 ++-- components/net/fetch/cors_cache.rs | 2 +- components/net/fetch/methods.rs | 10 +- components/net/filemanager_thread.rs | 2 +- components/net/http_cache.rs | 5 +- components/net/http_loader.rs | 103 +-- components/net/resource_thread.rs | 129 ++- components/net/tests/fetch.rs | 2 +- components/net/tests/http_cache.rs | 2 +- components/net/tests/http_loader.rs | 28 +- components/net/tests/main.rs | 171 ++-- components/net/tests/mime_classifier.rs | 2 +- components/net/websocket_loader.rs | 6 +- components/net_traits/Cargo.toml | 8 +- components/net_traits/lib.rs | 4 +- components/net_traits/request.rs | 2 +- components/script/Cargo.toml | 9 +- components/script/dom/bindings/trace.rs | 4 +- components/script/dom/htmlformelement.rs | 2 +- components/script/dom/response.rs | 2 +- components/script/dom/xmlhttprequest.rs | 2 +- components/script_traits/Cargo.toml | 8 +- components/script_traits/lib.rs | 2 +- components/webdriver_server/Cargo.toml | 5 +- components/webdriver_server/capabilities.rs | 11 +- components/webdriver_server/lib.rs | 14 +- servo-tidy.toml | 19 +- .../content-length/parsing.window.js.ini | 7 +- .../metadata/cors/credentials-flag.htm.ini | 8 - .../content-length/parsing.window.js.ini | 7 +- 42 files changed, 872 insertions(+), 891 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b11d8803271..e331f8260dc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -108,12 +108,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "antidote" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34fde25430d87a9388dadbe6e34d7f72a462c8b43ac8d309b42b0a8505d7e2a5" - [[package]] name = "app_units" version = "0.7.1" @@ -180,6 +174,27 @@ dependencies = [ "syn", ] +[[package]] +name = "async-stream" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "171374e7e3b2504e0e5236e3b59260560f9fe94bfe9ac39ba5e4e929c5590625" +dependencies = [ + "async-stream-impl", + "futures-core", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "648ed8c8d2ce5409ccd57453d9d1b214b342a0d69376a6feda1fd6cae3299308" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "async-tungstenite" version = "0.9.3" @@ -190,7 +205,7 @@ dependencies = [ "futures-util", "log", "openssl", - "pin-project", + "pin-project 1.0.2", "tokio 0.2.21", "tokio-openssl 0.4.0", "tungstenite", @@ -265,6 +280,12 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d5ca2cd0adc3f48f9e9ea5a6bbdf9ccc0bfade884847e484d452414c7ccffb3" +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + [[package]] name = "binary-space-partition" version = "0.1.2" @@ -506,7 +527,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" dependencies = [ "byteorder", - "either", "iovec", ] @@ -519,6 +539,12 @@ dependencies = [ "loom", ] +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + [[package]] name = "bzip2" version = "0.3.3" @@ -841,7 +867,7 @@ checksum = "b9417a0c314565e2abffaece67e95a8cb51f9238cd39f3764d9dfdf09e72b20c" dependencies = [ "bytes 0.5.5", "memchr", - "pin-project-lite", + "pin-project-lite 0.1.11", ] [[package]] @@ -905,7 +931,8 @@ dependencies = [ "gaol", "gfx", "gfx_traits", - "http 0.1.21", + "headers", + "http", "ipc-channel", "keyboard-types", "layout_traits", @@ -954,6 +981,15 @@ dependencies = [ "time", ] +[[package]] +name = "cookie" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "888604f00b3db336d2af898ec3c1d5d0ddf5e6d462220f2ededc33a87ac4bbd5" +dependencies = [ + "time", +] + [[package]] name = "copyless" version = "0.1.4" @@ -1117,17 +1153,6 @@ dependencies = [ "crossbeam-utils 0.8.1", ] -[[package]] -name = "crossbeam-deque" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" -dependencies = [ - "crossbeam-epoch 0.8.2", - "crossbeam-utils 0.7.2", - "maybe-uninit", -] - [[package]] name = "crossbeam-deque" version = "0.8.0" @@ -1135,25 +1160,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9" dependencies = [ "cfg-if 1.0.0", - "crossbeam-epoch 0.9.1", + "crossbeam-epoch", "crossbeam-utils 0.8.1", ] -[[package]] -name = "crossbeam-epoch" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" -dependencies = [ - "autocfg", - "cfg-if 0.1.10", - "crossbeam-utils 0.7.2", - "lazy_static", - "maybe-uninit", - "memoffset 0.5.6", - "scopeguard", -] - [[package]] name = "crossbeam-epoch" version = "0.9.1" @@ -1164,21 +1174,10 @@ dependencies = [ "const_fn", "crossbeam-utils 0.8.1", "lazy_static", - "memoffset 0.6.1", + "memoffset", "scopeguard", ] -[[package]] -name = "crossbeam-queue" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" -dependencies = [ - "cfg-if 0.1.10", - "crossbeam-utils 0.7.2", - "maybe-uninit", -] - [[package]] name = "crossbeam-utils" version = "0.7.2" @@ -1391,8 +1390,7 @@ dependencies = [ "devtools_traits", "embedder_traits", "headers", - "http 0.1.21", - "hyper", + "http", "ipc-channel", "log", "msg", @@ -1410,7 +1408,8 @@ name = "devtools_traits" version = "0.0.1" dependencies = [ "bitflags", - "http 0.1.21", + "headers", + "http", "ipc-channel", "malloc_size_of", "malloc_size_of_derive", @@ -1863,16 +1862,6 @@ version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15496a72fabf0e62bdc3df11a59a3787429221dd0710ba8ef163d6f7a9112c94" -[[package]] -name = "futures-cpupool" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" -dependencies = [ - "futures 0.1.31", - "num_cpus", -] - [[package]] name = "futures-executor" version = "0.3.8" @@ -1928,7 +1917,7 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project", + "pin-project 1.0.2", "pin-utils", "proc-macro-hack", "proc-macro-nested", @@ -2617,20 +2606,41 @@ checksum = "b1334b94d8ce67319ddc44663daef53d8c1538629a11562530c981dbd9085b9a" [[package]] name = "h2" -version = "0.1.26" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" +checksum = "5e4728fd124914ad25e99e3d15a9361a879f6620f63cb56bbb08f95abb97a535" dependencies = [ - "byteorder", - "bytes 0.4.12", + "bytes 0.5.5", "fnv", - "futures 0.1.31", - "http 0.1.21", + "futures-core", + "futures-sink", + "futures-util", + "http", "indexmap", - "log", "slab", - "string", - "tokio-io", + "tokio 0.2.21", + "tokio-util 0.3.1", + "tracing", + "tracing-futures", +] + +[[package]] +name = "h2" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f072413d126e57991455e0a922b31e4c8ba7c2ffbebf6b78b4f8521397d65cd" +dependencies = [ + "bytes 1.1.0", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio 1.15.0", + "tokio-util 0.6.9", + "tracing", ] [[package]] @@ -2669,28 +2679,27 @@ dependencies = [ [[package]] name = "headers" -version = "0.2.3" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "882ca7d8722f33ce2c2db44f95425d6267ed59ca96ce02acbe58320054ceb642" +checksum = "a4c4eb0471fcb85846d8b0690695ef354f9afb11cb03cac2e1d7c9253351afb0" dependencies = [ - "base64 0.10.1", + "base64 0.13.0", "bitflags", - "bytes 0.4.12", + "bytes 1.1.0", "headers-core", - "http 0.1.21", + "http", + "httpdate 1.0.2", "mime", - "sha-1 0.8.2", - "time", + "sha-1 0.9.1", ] [[package]] name = "headers-core" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "967131279aaa9f7c20c7205b45a391638a83ab118e6509b2d0ccbe08de044237" +checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" dependencies = [ - "bytes 0.4.12", - "http 0.1.21", + "http", ] [[package]] @@ -2737,17 +2746,6 @@ dependencies = [ "syn", ] -[[package]] -name = "http" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" -dependencies = [ - "bytes 0.4.12", - "fnv", - "itoa", -] - [[package]] name = "http" version = "0.2.1" @@ -2761,14 +2759,23 @@ dependencies = [ [[package]] name = "http-body" -version = "0.1.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" +checksum = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "http 0.1.21", - "tokio-buf", + "bytes 0.5.5", + "http", +] + +[[package]] +name = "http-body" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +dependencies = [ + "bytes 1.1.0", + "http", + "pin-project-lite 0.2.8", ] [[package]] @@ -2777,6 +2784,18 @@ version = "1.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc35c995b9d93ec174cf9a27d425c7892722101e14993cd227fdb51d70cf9589" +[[package]] +name = "httpdate" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + [[package]] name = "humantime" version = "2.0.1" @@ -2785,62 +2804,80 @@ checksum = "3c1ad908cc71012b7bea4d0c53ba96a8cba9962f048fa68d143376143d863b7a" [[package]] name = "hyper" -version = "0.12.36" +version = "0.13.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c843caf6296fc1f93444735205af9ed4e109a539005abb2564ae1d6fad34c52" +checksum = "8a6f157065790a3ed2f88679250419b5cdd96e714a0d65f7797fd337186e96bb" dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "futures-cpupool", - "h2", - "http 0.1.21", - "http-body", + "bytes 0.5.5", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.2.7", + "http", + "http-body 0.3.1", "httparse", - "iovec", + "httpdate 0.3.2", "itoa", - "log", - "net2", - "rustc_version 0.2.3", - "time", - "tokio 0.1.22", - "tokio-buf", - "tokio-executor", - "tokio-io", - "tokio-reactor", - "tokio-tcp", - "tokio-threadpool", - "tokio-timer", + "pin-project 1.0.2", + "socket2 0.3.19", + "tokio 0.2.21", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf09f61b52cfcf4c00de50df88ae423d6c02354e385a86341133b5338630ad1" +dependencies = [ + "bytes 1.1.0", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.9", + "http", + "http-body 0.4.4", + "httparse", + "httpdate 0.3.2", + "itoa", + "pin-project 1.0.2", + "socket2 0.4.2", + "tokio 1.15.0", + "tower-service", + "tracing", "want", ] [[package]] name = "hyper-openssl" -version = "0.7.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52657b5cdb2a8067efd29a02e011b7cf656b473ec8a5c34e86645e85d763006" +checksum = "a9d52322a69f0a93f177d76ca82073fcec8d5b4eb6e28525d5b3142fa718195c" dependencies = [ - "antidote", - "bytes 0.4.12", - "futures 0.1.31", - "hyper", - "lazy_static", + "http", + "hyper 0.14.5", "linked_hash_set", + "once_cell", "openssl", "openssl-sys", - "tokio-io", - "tokio-openssl 0.3.0", + "parking_lot 0.11.0", + "tokio 1.15.0", + "tokio-openssl 0.6.3", + "tower-layer", ] [[package]] name = "hyper_serde" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bf0fc731a638339172253834b4ba8d60a9ecbeb4c031fcfcacd25b3cdf6e6c1" +checksum = "843b2c3c0cee11aa3042250e849a333124a6a873f8f66e5fdaab7980df1ac8ee" dependencies = [ - "cookie", + "cookie 0.11.2", "headers", - "http 0.1.21", - "hyper", + "http", + "hyper 0.14.5", "mime", "serde", "serde_bytes", @@ -2960,7 +2997,7 @@ dependencies = [ "fnv", "lazy_static", "libc", - "mio", + "mio 0.6.22", "rand", "serde", "tempfile", @@ -3281,9 +3318,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.87" +version = "0.2.112" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "265d751d31d6780a3f956bb5b8022feba2d94eeee5a84ba64f4212eedca42213" +checksum = "1b03d17f364a3a042d5e5d46b053bbbf82c92c9430c592dd4c064dc6ee997125" [[package]] name = "libdbus-sys" @@ -3534,7 +3571,7 @@ dependencies = [ "cssparser", "euclid", "hashglobe", - "hyper", + "http", "hyper_serde", "keyboard-types", "selectors", @@ -3546,7 +3583,7 @@ dependencies = [ "string_cache", "thin-slice", "time", - "tokio 0.2.21", + "tokio 1.15.0", "url", "uuid", "void", @@ -3630,15 +3667,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.6.1" @@ -3768,6 +3796,19 @@ dependencies = [ "winapi", ] +[[package]] +name = "mio" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "winapi", +] + [[package]] name = "mio-extras" version = "2.0.5" @@ -3776,21 +3817,10 @@ checksum = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" dependencies = [ "lazycell", "log", - "mio", + "mio 0.6.22", "slab", ] -[[package]] -name = "mio-uds" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" -dependencies = [ - "iovec", - "libc", - "mio", -] - [[package]] name = "miow" version = "0.3.7" @@ -3966,20 +3996,19 @@ dependencies = [ "async-tungstenite", "base64 0.10.1", "brotli", - "bytes 0.4.12", + "bytes 1.1.0", "content-security-policy", - "cookie", + "cookie 0.11.2", "crossbeam-channel 0.4.4", "data-url", "devtools_traits", "embedder_traits", "flate2", - "futures 0.1.31", "futures 0.3.5", "futures-util", "headers", - "http 0.1.21", - "hyper", + "http", + "hyper 0.14.5", "hyper-openssl", "hyper_serde", "immeta", @@ -4007,10 +4036,10 @@ dependencies = [ "servo_url", "std_test_override", "time", - "tokio 0.1.22", "tokio 0.2.21", - "tokio-compat", - "tokio-openssl 0.3.0", + "tokio 1.15.0", + "tokio-openssl 0.6.3", + "tokio-stream", "tokio-test", "tungstenite", "url", @@ -4034,11 +4063,11 @@ name = "net_traits" version = "0.0.1" dependencies = [ "content-security-policy", - "cookie", + "cookie 0.11.2", "embedder_traits", "headers", - "http 0.1.21", - "hyper", + "http", + "hyper 0.14.5", "hyper_serde", "image", "ipc-channel", @@ -4131,6 +4160,15 @@ dependencies = [ "version_check", ] +[[package]] +name = "ntapi" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" +dependencies = [ + "winapi", +] + [[package]] name = "num-complex" version = "0.2.4" @@ -4376,17 +4414,6 @@ dependencies = [ "stable_deref_trait", ] -[[package]] -name = "parking_lot" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" -dependencies = [ - "lock_api 0.3.4", - "parking_lot_core 0.6.2", - "rustc_version 0.2.3", -] - [[package]] name = "parking_lot" version = "0.10.2" @@ -4408,21 +4435,6 @@ dependencies = [ "parking_lot_core 0.8.0", ] -[[package]] -name = "parking_lot_core" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" -dependencies = [ - "cfg-if 0.1.10", - "cloudabi 0.0.3", - "libc", - "redox_syscall", - "rustc_version 0.2.3", - "smallvec 0.6.13", - "winapi", -] - [[package]] name = "parking_lot_core" version = "0.7.2" @@ -4490,7 +4502,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39fe46acc5503595e5949c17b818714d26fdf9b4920eacf3b2947f0199f4a6ff" dependencies = [ - "rustc_version 0.3.3", + "rustc_version", ] [[package]] @@ -4609,13 +4621,33 @@ dependencies = [ "siphasher", ] +[[package]] +name = "pin-project" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9615c18d31137579e9ff063499264ddc1278e7b1982757ebc111028c4d1dc909" +dependencies = [ + "pin-project-internal 0.4.29", +] + [[package]] name = "pin-project" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ccc2237c2c489783abd8c4c80e5450fc0e98644555b1364da68cc29aa151ca7" dependencies = [ - "pin-project-internal", + "pin-project-internal 1.0.2", +] + +[[package]] +name = "pin-project-internal" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "044964427019eed9d49d9d5bbce6047ef18f37100ea400912a9fa4a3523ab12a" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -4635,6 +4667,12 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c917123afa01924fc84bb20c4c03f004d9c38e5127e3c039bbf7f4b9c76a2f6b" +[[package]] +name = "pin-project-lite" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" + [[package]] name = "pin-utils" version = "0.1.0" @@ -4900,7 +4938,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b0d8e0819fadc20c74ea8373106ead0600e3a67ef1fe8da56e39b9ae7275674" dependencies = [ "autocfg", - "crossbeam-deque 0.8.0", + "crossbeam-deque", "either", "rayon-core", ] @@ -4912,7 +4950,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" dependencies = [ "crossbeam-channel 0.5.0", - "crossbeam-deque 0.8.0", + "crossbeam-deque", "crossbeam-utils 0.8.1", "lazy_static", "num_cpus", @@ -5038,22 +5076,13 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver 0.9.0", -] - [[package]] name = "rustc_version" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" dependencies = [ - "semver 0.11.0", + "semver", ] [[package]] @@ -5129,7 +5158,7 @@ dependencies = [ "canvas_traits", "chrono", "content-security-policy", - "cookie", + "cookie 0.11.2", "crossbeam-channel 0.4.4", "cssparser", "data-url", @@ -5145,8 +5174,7 @@ dependencies = [ "fxhash", "headers", "html5ever", - "http 0.1.21", - "hyper", + "http", "hyper_serde", "image", "indexmap", @@ -5273,14 +5301,14 @@ dependencies = [ "bitflags", "bluetooth_traits", "canvas_traits", - "cookie", + "cookie 0.11.2", "crossbeam-channel 0.4.4", "devtools_traits", "embedder_traits", "euclid", "gfx_traits", - "http 0.1.21", - "hyper", + "headers", + "http", "hyper_serde", "ipc-channel", "keyboard-types", @@ -5347,30 +5375,15 @@ dependencies = [ "to_shmem_derive", ] -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser 0.7.0", -] - [[package]] name = "semver" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" dependencies = [ - "semver-parser 0.10.2", + "semver-parser", ] -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - [[package]] name = "semver-parser" version = "0.10.2" @@ -5959,6 +5972,27 @@ dependencies = [ "wayland-protocols", ] +[[package]] +name = "socket2" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "winapi", +] + +[[package]] +name = "socket2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dc90fe6c7be1a323296982db1836d1ea9e47b6839496dde9a541bc496df3516" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "sparkle" version = "0.1.25" @@ -6017,15 +6051,6 @@ dependencies = [ "lock_api 0.4.1", ] -[[package]] -name = "string" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d" -dependencies = [ - "bytes 0.4.12", -] - [[package]] name = "string_cache" version = "0.8.1" @@ -6246,9 +6271,9 @@ checksum = "e454d048db5527d000bfddb77bd072bbf3a1e2ae785f16d9bd116e07c2ab45eb" [[package]] name = "syn" -version = "1.0.48" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc371affeffc477f42a221a1e4297aedcea33d47d19b61455588bd9d8f6b19ac" +checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" dependencies = [ "proc-macro2", "quote", @@ -6444,30 +6469,6 @@ dependencies = [ "synstructure", ] -[[package]] -name = "tokio" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "mio", - "num_cpus", - "tokio-codec", - "tokio-current-thread", - "tokio-executor", - "tokio-fs", - "tokio-io", - "tokio-reactor", - "tokio-sync", - "tokio-tcp", - "tokio-threadpool", - "tokio-timer", - "tokio-udp", - "tokio-uds", -] - [[package]] name = "tokio" version = "0.2.21" @@ -6479,92 +6480,28 @@ dependencies = [ "futures-core", "iovec", "lazy_static", - "mio", + "memchr", + "mio 0.6.22", "num_cpus", - "pin-project-lite", + "pin-project-lite 0.1.11", "slab", - "tokio-macros", + "tokio-macros 0.2.6", ] [[package]] -name = "tokio-buf" -version = "0.1.1" +name = "tokio" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46" +checksum = "fbbf1c778ec206785635ce8ad57fe52b3009ae9e0c9f574a728f3049d3e55838" dependencies = [ - "bytes 0.4.12", - "either", - "futures 0.1.31", -] - -[[package]] -name = "tokio-codec" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25b2998660ba0e70d18684de5d06b70b70a3a747469af9dea7618cc59e75976b" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "tokio-io", -] - -[[package]] -name = "tokio-compat" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "107b625135aa7b9297dd2d99ccd6ca6ab124a5d1230778e159b9095adca4c722" -dependencies = [ - "futures 0.1.31", - "futures-core", - "futures-util", - "pin-project-lite", - "tokio 0.2.21", - "tokio-current-thread", - "tokio-executor", - "tokio-reactor", - "tokio-timer", -] - -[[package]] -name = "tokio-current-thread" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e" -dependencies = [ - "futures 0.1.31", - "tokio-executor", -] - -[[package]] -name = "tokio-executor" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671" -dependencies = [ - "crossbeam-utils 0.7.2", - "futures 0.1.31", -] - -[[package]] -name = "tokio-fs" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "297a1206e0ca6302a0eed35b700d292b275256f596e2f3fea7729d5e629b6ff4" -dependencies = [ - "futures 0.1.31", - "tokio-io", - "tokio-threadpool", -] - -[[package]] -name = "tokio-io" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "log", + "bytes 1.1.0", + "libc", + "memchr", + "mio 0.7.14", + "num_cpus", + "pin-project-lite 0.2.8", + "tokio-macros 1.7.0", + "winapi", ] [[package]] @@ -6579,14 +6516,14 @@ dependencies = [ ] [[package]] -name = "tokio-openssl" -version = "0.3.0" +name = "tokio-macros" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771d6246b170ae108d67d9963c23f31a579016c016d73bd4bd7d6ef0252afda7" +checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" dependencies = [ - "futures 0.1.31", - "openssl", - "tokio-io", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -6600,119 +6537,67 @@ dependencies = [ ] [[package]] -name = "tokio-reactor" -version = "0.1.12" +name = "tokio-openssl" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351" +checksum = "c08f9ffb7809f1b20c1b398d92acf4cc719874b3b2b2d9ea2f09b4a80350878a" dependencies = [ - "crossbeam-utils 0.7.2", - "futures 0.1.31", - "lazy_static", - "log", - "mio", - "num_cpus", - "parking_lot 0.9.0", - "slab", - "tokio-executor", - "tokio-io", - "tokio-sync", + "futures-util", + "openssl", + "openssl-sys", + "tokio 1.15.0", ] [[package]] -name = "tokio-sync" +name = "tokio-stream" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfe50152bc8164fcc456dab7891fa9bf8beaf01c5ee7e1dd43a397c3cf87dee" +checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" dependencies = [ - "fnv", - "futures 0.1.31", -] - -[[package]] -name = "tokio-tcp" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "iovec", - "mio", - "tokio-io", - "tokio-reactor", + "futures-core", + "pin-project-lite 0.2.8", + "tokio 1.15.0", ] [[package]] name = "tokio-test" -version = "0.2.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed0049c119b6d505c4447f5c64873636c7af6c75ab0d45fd9f618d82acb8016d" +checksum = "53474327ae5e166530d17f2d956afcb4f8a004de581b3cae10f12006bc8163e3" +dependencies = [ + "async-stream", + "bytes 1.1.0", + "futures-core", + "tokio 1.15.0", + "tokio-stream", +] + +[[package]] +name = "tokio-util" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" dependencies = [ "bytes 0.5.5", "futures-core", + "futures-sink", + "log", + "pin-project-lite 0.1.11", "tokio 0.2.21", ] [[package]] -name = "tokio-threadpool" -version = "0.1.18" +name = "tokio-util" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df720b6581784c118f0eb4310796b12b1d242a7eb95f716a8367855325c25f89" +checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" dependencies = [ - "crossbeam-deque 0.7.3", - "crossbeam-queue", - "crossbeam-utils 0.7.2", - "futures 0.1.31", - "lazy_static", + "bytes 1.1.0", + "futures-core", + "futures-sink", "log", - "num_cpus", - "slab", - "tokio-executor", -] - -[[package]] -name = "tokio-timer" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296" -dependencies = [ - "crossbeam-utils 0.7.2", - "futures 0.1.31", - "slab", - "tokio-executor", -] - -[[package]] -name = "tokio-udp" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2a0b10e610b39c38b031a2fcab08e4b82f16ece36504988dcbd81dbba650d82" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "log", - "mio", - "tokio-codec", - "tokio-io", - "tokio-reactor", -] - -[[package]] -name = "tokio-uds" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab57a4ac4111c8c9dbcf70779f6fc8bc35ae4b2454809febac840ad19bd7e4e0" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "iovec", - "libc", - "log", - "mio", - "mio-uds", - "tokio-codec", - "tokio-io", - "tokio-reactor", + "pin-project-lite 0.2.8", + "tokio 1.15.0", ] [[package]] @@ -6725,24 +6610,48 @@ dependencies = [ ] [[package]] -name = "tracing" -version = "0.1.15" +name = "tower-layer" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41f40ed0e162c911ac6fcb53ecdc8134c46905fdbbae8c50add462a538b495f" +checksum = "343bc9466d3fe6b0f960ef45960509f84480bf4fd96f92901afe7ff3df9d3a62" + +[[package]] +name = "tower-service" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" + +[[package]] +name = "tracing" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", + "log", + "pin-project-lite 0.2.8", "tracing-core", ] [[package]] name = "tracing-core" -version = "0.1.10" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aa83a9a47081cd522c09c81b31aec2c9273424976f922ad61c053b58350b715" +checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" dependencies = [ "lazy_static", ] +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project 1.0.2", + "tracing", +] + [[package]] name = "tracy-rs" version = "0.1.2" @@ -6776,7 +6685,7 @@ dependencies = [ "base64 0.12.0", "byteorder", "bytes 0.5.5", - "http 0.2.1", + "http", "httparse", "input_buffer", "log", @@ -6954,36 +6863,37 @@ dependencies = [ [[package]] name = "want" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" dependencies = [ - "futures 0.1.31", "log", "try-lock", ] [[package]] name = "warp" -version = "0.1.22" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99b53196ba54e91e31ba1e90309a31053218cc1d4697f6e48f7c7e3d255e64fc" +checksum = "f41be6df54c97904af01aa23e613d4521eed7ab23537cede692d4058f6449407" dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", + "bytes 0.5.5", + "futures 0.3.5", "headers", - "http 0.1.21", - "hyper", + "http", + "hyper 0.13.10", "log", "mime", "mime_guess", + "pin-project 0.4.29", "scoped-tls", "serde", "serde_json", "serde_urlencoded", - "tokio 0.1.22", - "tokio-io", - "tokio-threadpool", + "tokio 0.2.21", + "tower-service", + "tracing", + "tracing-futures", "urlencoding", ] @@ -7132,20 +7042,22 @@ dependencies = [ [[package]] name = "webdriver" -version = "0.40.1" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad517a7e5bb5228bee491b97f5c471b31606a42e89fda90a966d8245a4308e31" +checksum = "3484940751923901dc09b362740cad90bcfb62ec93d8abf38add2c3ac728c596" dependencies = [ - "base64 0.10.1", - "cookie", - "http 0.1.21", + "base64 0.12.0", + "bytes 0.5.5", + "cookie 0.12.0", + "http", "log", + "once_cell", "regex", "serde", "serde_derive", "serde_json", "time", - "tokio 0.1.22", + "tokio 0.2.21", "unicode-segmentation", "url", "warp", @@ -7157,10 +7069,11 @@ version = "0.0.1" dependencies = [ "base64 0.10.1", "compositing", - "cookie", + "cookie 0.11.2", "crossbeam-channel 0.4.4", "euclid", - "hyper", + "headers", + "http", "image", "ipc-channel", "keyboard-types", @@ -7421,7 +7334,7 @@ dependencies = [ "lazy_static", "libc", "log", - "mio", + "mio 0.6.22", "mio-extras", "ndk", "ndk-glue", @@ -7473,7 +7386,7 @@ dependencies = [ "bytes 0.4.12", "httparse", "log", - "mio", + "mio 0.6.22", "mio-extras", "rand", "sha-1 0.8.2", diff --git a/components/constellation/Cargo.toml b/components/constellation/Cargo.toml index b70bde4341e..6ef5c41f00a 100644 --- a/components/constellation/Cargo.toml +++ b/components/constellation/Cargo.toml @@ -22,7 +22,8 @@ embedder_traits = { path = "../embedder_traits" } euclid = "0.20" gfx = { path = "../gfx" } gfx_traits = { path = "../gfx_traits" } -http = "0.1" +http = "0.2" +headers = "0.3" ipc-channel = "0.14" keyboard-types = "0.5" layout_traits = { path = "../layout_traits" } diff --git a/components/devtools/Cargo.toml b/components/devtools/Cargo.toml index 68da8489cb7..ef86fe41686 100644 --- a/components/devtools/Cargo.toml +++ b/components/devtools/Cargo.toml @@ -14,9 +14,8 @@ path = "lib.rs" crossbeam-channel = "0.4" devtools_traits = { path = "../devtools_traits" } embedder_traits = { path = "../embedder_traits" } -headers = "0.2" -http = "0.1" -hyper = "0.12" +headers = "0.3" +http = "0.2" ipc-channel = "0.14" log = "0.4" msg = { path = "../msg" } diff --git a/components/devtools/actors/network_event.rs b/components/devtools/actors/network_event.rs index 622ac6002eb..1c593e3dcb6 100644 --- a/components/devtools/actors/network_event.rs +++ b/components/devtools/actors/network_event.rs @@ -12,8 +12,7 @@ use crate::StreamId; use devtools_traits::HttpRequest as DevtoolsHttpRequest; use devtools_traits::HttpResponse as DevtoolsHttpResponse; use headers::{ContentType, Cookie, HeaderMapExt}; -use http::{header, HeaderMap}; -use hyper::{Method, StatusCode}; +use http::{header, HeaderMap, Method, StatusCode}; use serde_json::{Map, Value}; use std::net::TcpStream; use time::Tm; @@ -343,6 +342,7 @@ impl NetworkEventActor { pub fn add_request(&mut self, request: DevtoolsHttpRequest) { self.request.url = request.url.as_str().to_owned(); + self.request.method = request.method.clone(); self.request.headers = request.headers.clone(); self.request.body = request.body; diff --git a/components/devtools_traits/Cargo.toml b/components/devtools_traits/Cargo.toml index 366f4d42370..d6c13c581ad 100644 --- a/components/devtools_traits/Cargo.toml +++ b/components/devtools_traits/Cargo.toml @@ -12,7 +12,8 @@ path = "lib.rs" [dependencies] bitflags = "1.0" -http = "0.1" +headers = "0.3" +http = "0.2" ipc-channel = "0.14" malloc_size_of = { path = "../malloc_size_of" } malloc_size_of_derive = "0.1" diff --git a/components/devtools_traits/lib.rs b/components/devtools_traits/lib.rs index d7047960329..dbdf255b71b 100644 --- a/components/devtools_traits/lib.rs +++ b/components/devtools_traits/lib.rs @@ -18,8 +18,8 @@ extern crate malloc_size_of_derive; #[macro_use] extern crate serde; -use http::method::Method; use http::HeaderMap; +use http::Method; use ipc_channel::ipc::IpcSender; use msg::constellation_msg::{BrowsingContextId, PipelineId}; use servo_url::ServoUrl; diff --git a/components/malloc_size_of/Cargo.toml b/components/malloc_size_of/Cargo.toml index 040d377aeb6..60c7fee9c7d 100644 --- a/components/malloc_size_of/Cargo.toml +++ b/components/malloc_size_of/Cargo.toml @@ -13,7 +13,7 @@ servo = [ "accountable-refcell", "content-security-policy", "crossbeam-channel", - "hyper", + "http", "hyper_serde", "keyboard-types", "serde", @@ -34,8 +34,8 @@ crossbeam-channel = { version = "0.4", optional = true } cssparser = "0.29" euclid = "0.20" hashglobe = { path = "../hashglobe" } -hyper = { version = "0.12", optional = true } -hyper_serde = { version = "0.11", optional = true } +http = { version = "0.2", optional = true } +hyper_serde = { version = "0.12", optional = true } keyboard-types = { version = "0.5", optional = true } selectors = { path = "../selectors" } serde = { version = "1.0.27", optional = true } @@ -46,7 +46,7 @@ smallvec = "1.0" string_cache = { version = "0.8", optional = true } thin-slice = "0.1.0" time = { version = "0.1.41", optional = true } -tokio = "0.2" +tokio = "1" url = { version = "2.0", optional = true } uuid = { version = "0.8", features = ["v4"], optional = true } void = "1.0.2" diff --git a/components/malloc_size_of/lib.rs b/components/malloc_size_of/lib.rs index 046b6d2fc5d..559d10e5926 100644 --- a/components/malloc_size_of/lib.rs +++ b/components/malloc_size_of/lib.rs @@ -57,7 +57,7 @@ extern crate cssparser; extern crate euclid; extern crate hashglobe; #[cfg(feature = "servo")] -extern crate hyper; +extern crate http; #[cfg(feature = "servo")] extern crate hyper_serde; #[cfg(feature = "servo")] @@ -957,7 +957,7 @@ impl MallocSizeOf for tokio::sync::mpsc::UnboundedSender { } #[cfg(feature = "servo")] -impl MallocSizeOf for hyper::StatusCode { +impl MallocSizeOf for http::StatusCode { fn size_of(&self, _ops: &mut MallocSizeOfOps) -> usize { 0 } diff --git a/components/net/Cargo.toml b/components/net/Cargo.toml index 9bca5e1435b..9be41935f62 100644 --- a/components/net/Cargo.toml +++ b/components/net/Cargo.toml @@ -19,7 +19,7 @@ async-recursion = "0.3.2" async-tungstenite = { version = "0.9", features = ["tokio-openssl"] } base64 = "0.10.1" brotli = "3" -bytes = "0.4" +bytes = "1" content-security-policy = { version = "0.4.0", features = ["serde"] } cookie_rs = { package = "cookie", version = "0.11" } crossbeam-channel = "0.4" @@ -27,14 +27,13 @@ data-url = "0.1.0" devtools_traits = { path = "../devtools_traits" } embedder_traits = { path = "../embedder_traits" } flate2 = "1" -futures = "0.1" -futures03 = { version = "0.3", package = "futures" } -futures-util = { version = "0.3", features = ["compat"] } -headers = "0.2" -http = "0.1" -hyper = "0.12" -hyper-openssl = "0.7" -hyper_serde = "0.11" +futures = { version = "0.3", package = "futures" } +futures-util = { version = "0.3" } +headers = "0.3" +http = "0.2" +hyper = { version = "0.14", features = ["client", "http1", "http2", "tcp", "stream"] } +hyper-openssl = "0.9.1" +hyper_serde = "0.12" immeta = "0.4" ipc-channel = "0.14" lazy_static = "1" @@ -59,19 +58,21 @@ servo_arc = { path = "../servo_arc" } servo_config = { path = "../config" } servo_url = { path = "../url" } time = "0.1.41" -tokio = "0.1" +tokio = { version = "1", package = "tokio", features = ["sync", "macros", "rt-multi-thread"] } tokio2 = { version = "0.2", package = "tokio", features = ["sync", "macros", "rt-threaded", "tcp"] } -tokio-compat = "0.1" +tokio-stream = "0.1" tungstenite = "0.11" url = "2.0" uuid = { version = "0.8", features = ["v4"] } webrender_api = { git = "https://github.com/servo/webrender" } [dev-dependencies] -futures = "0.1" +futures = {version = "0.3", features = ["compat"]} std_test_override = { path = "../std_test_override" } -tokio-openssl = "0.3" -tokio-test = "0.2" +tokio-openssl = "0.6" +tokio-test = "0.4" +tokio-stream = { version = "0.1", features = ["net"] } +hyper = { version = "0.14", features = ["full"] } [[test]] name = "main" diff --git a/components/net/connector.rs b/components/net/connector.rs index dc44002a85a..cd24d8697f5 100644 --- a/components/net/connector.rs +++ b/components/net/connector.rs @@ -3,10 +3,12 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::hosts::replace_host; -use hyper::client::connect::{Connect, Destination}; +use crate::http_loader::HANDLE; +use futures::{task::Context, task::Poll, Future}; +use http::uri::{Authority, Uri as Destination}; use hyper::client::HttpConnector as HyperHttpConnector; -use hyper::rt::Future; -use hyper::{Body, Client}; +use hyper::rt::Executor; +use hyper::{service::Service, Body, Client}; use hyper_openssl::HttpsConnector; use openssl::ex_data::Index; use openssl::ssl::{ @@ -15,7 +17,6 @@ use openssl::ssl::{ use openssl::x509::{self, X509StoreContext}; use std::collections::hash_map::{Entry, HashMap}; use std::sync::{Arc, Mutex}; -use tokio::prelude::future::Executor; pub const BUF_SIZE: usize = 32768; pub const ALPN_H2_H1: &'static [u8] = b"\x02h2\x08http/1.1"; @@ -67,30 +68,53 @@ impl ConnectionCerts { } } +#[derive(Clone)] pub struct HttpConnector { inner: HyperHttpConnector, } impl HttpConnector { fn new() -> HttpConnector { - let mut inner = HyperHttpConnector::new(4); + let mut inner = HyperHttpConnector::new(); inner.enforce_http(false); inner.set_happy_eyeballs_timeout(None); HttpConnector { inner } } } -impl Connect for HttpConnector { - type Transport = ::Transport; - type Error = ::Error; - type Future = ::Future; +impl Service for HttpConnector { + type Response = >::Response; + type Error = >::Error; + type Future = >::Future; - fn connect(&self, dest: Destination) -> Self::Future { + fn call(&mut self, dest: Destination) -> Self::Future { // Perform host replacement when making the actual TCP connection. let mut new_dest = dest.clone(); - let addr = replace_host(dest.host()); - new_dest.set_host(&*addr).unwrap(); - self.inner.connect(new_dest) + let mut parts = dest.into_parts(); + + if let Some(auth) = parts.authority { + let host = auth.host(); + let host = replace_host(host); + + let authority = if let Some(port) = auth.port() { + format!("{}:{}", host, port.as_str()) + } else { + format!("{}", &*host) + }; + + if let Ok(authority) = Authority::from_maybe_shared(authority) { + parts.authority = Some(authority); + if let Ok(dest) = Destination::from_parts(parts) { + new_dest = dest + } + } + } + + self.inner.call(new_dest) + } + + fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { + Ok(()).into() } } @@ -209,18 +233,28 @@ pub fn create_tls_config( cfg } -pub fn create_http_client(tls_config: TlsConfig, executor: E) -> Client +struct TokioExecutor {} + +impl Executor for TokioExecutor where - E: Executor + Send + 'static>> + Sync + Send + 'static, + F: Future + 'static + std::marker::Send, { + fn execute(&self, fut: F) { + HANDLE.lock().unwrap().as_ref().unwrap().spawn(fut); + } +} + +pub fn create_http_client(tls_config: TlsConfig) -> Client { let mut connector = HttpsConnector::with_connector(HttpConnector::new(), tls_config).unwrap(); connector.set_callback(|configuration, destination| { - configuration.set_ex_data(*HOST_INDEX, Host(destination.host().to_owned())); + if let Some(host) = destination.host() { + configuration.set_ex_data(*HOST_INDEX, Host(host.to_owned())); + } Ok(()) }); Client::builder() .http1_title_case_headers(true) - .executor(executor) + .executor(TokioExecutor {}) .build(connector) } diff --git a/components/net/cookie.rs b/components/net/cookie.rs index 4d77d0911c4..3c0b904496d 100644 --- a/components/net/cookie.rs +++ b/components/net/cookie.rs @@ -5,7 +5,7 @@ //! Implementation of cookie creation and matching as specified by //! http://tools.ietf.org/html/rfc6265 -use hyper_serde::{self, Serde}; +use hyper_serde::Serde; use net_traits::pub_domains::is_pub_domain; use net_traits::CookieSource; use servo_url::ServoUrl; diff --git a/components/net/cookie_storage.rs b/components/net/cookie_storage.rs index f0815635476..380f2ece094 100644 --- a/components/net/cookie_storage.rs +++ b/components/net/cookie_storage.rs @@ -159,14 +159,14 @@ impl CookieStorage { // http://tools.ietf.org/html/rfc6265#section-5.4 pub fn cookies_for_url(&mut self, url: &ServoUrl, source: CookieSource) -> Option { let filterer = |c: &&mut Cookie| -> bool { - info!( + debug!( " === SENT COOKIE : {} {} {:?} {:?}", c.cookie.name(), c.cookie.value(), c.cookie.domain(), c.cookie.path() ); - info!( + debug!( " === SENT COOKIE RESULT {}", c.appropriate_for_url(url, source) ); diff --git a/components/net/decoder.rs b/components/net/decoder.rs index b54035fa4d9..d151e08ceec 100644 --- a/components/net/decoder.rs +++ b/components/net/decoder.rs @@ -29,20 +29,24 @@ The following types directly support the gzip compression case: use crate::connector::BUF_SIZE; use brotli::Decompressor; -use bytes::{Buf, BufMut, BytesMut}; +use bytes::{Buf, BufMut, Bytes, BytesMut}; use flate2::read::DeflateDecoder; -use futures::{Async, Future, Poll, Stream}; +use futures::{task::Context, task::Poll, Future, Stream}; use hyper::header::{HeaderValue, CONTENT_ENCODING, TRANSFER_ENCODING}; -use hyper::{self, Body, Chunk, Response}; +use hyper::{self, Body, Response}; use libflate::non_blocking::gzip; use std::cmp; use std::fmt; use std::io::{self, Read}; use std::mem; +use std::pin::Pin; +use std::sync::{Arc, Mutex}; +use std::task::Waker; +#[derive(Debug)] pub enum Error { Io(io::Error), - Hyper(hyper::error::Error), + Hyper(hyper::Error), } impl From for Error { @@ -51,8 +55,8 @@ impl From for Error { } } -impl From for Error { - fn from(err: hyper::error::Error) -> Error { +impl From for Error { + fn from(err: hyper::Error) -> Error { Error::Hyper(err) } } @@ -93,10 +97,11 @@ struct Pending { } /// A gzip decoder that reads from a `libflate::gzip::Decoder` into a `BytesMut` and emits the results -/// as a `Chunk`. +/// as a `Bytes`. struct Gzip { inner: Box>>>, buf: BytesMut, + reader: Arc>>, } impl fmt::Debug for Decoder { @@ -162,37 +167,36 @@ impl Decoder { } impl Stream for Decoder { - type Item = Chunk; - type Error = Error; + type Item = Result; - fn poll(&mut self) -> Poll, Self::Error> { + fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { // Do a read or poll for a pending decoder value. let new_value = match self.inner { - Inner::Pending(ref mut future) => match future.poll() { - Ok(Async::Ready(inner)) => inner, - Ok(Async::NotReady) => return Ok(Async::NotReady), - Err(e) => return Err(e.into()), + Inner::Pending(ref mut future) => match Pin::new(future).poll(cx) { + Poll::Ready(inner) => inner, + Poll::Pending => return Poll::Pending, }, - Inner::PlainText(ref mut body) => return body.poll().map_err(|e| e.into()), - Inner::Gzip(ref mut decoder) => return decoder.poll(), - Inner::Brotli(ref mut decoder) => return decoder.poll(), - Inner::Deflate(ref mut decoder) => return decoder.poll(), + Inner::PlainText(ref mut body) => { + return Pin::new(body).poll_next(cx).map_err(|e| e.into()) + }, + Inner::Gzip(ref mut decoder) => return Pin::new(decoder).poll_next(cx), + Inner::Brotli(ref mut decoder) => return Pin::new(decoder).poll_next(cx), + Inner::Deflate(ref mut decoder) => return Pin::new(decoder).poll_next(cx), }; + // self.inner = new_value; - self.poll() + self.poll_next(cx) } } impl Future for Pending { - type Item = Inner; - type Error = hyper::error::Error; + type Output = Inner; - fn poll(&mut self) -> Poll { - let body_state = match self.body.poll_stream() { - Ok(Async::Ready(state)) => state, - Ok(Async::NotReady) => return Ok(Async::NotReady), - Err(e) => return Err(e), + fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + let body_state = match self.body.poll_stream(cx) { + Poll::Ready(state) => state, + Poll::Pending => return Poll::Pending, }; let body = mem::replace(&mut self.body, ReadableChunks::new(Body::empty())); @@ -200,110 +204,133 @@ impl Future for Pending { // if the stream was empty, or truly had an UnexpectedEof. // Therefore, we need to check for EOF first. match body_state { - StreamState::Eof => Ok(Async::Ready(Inner::PlainText(Body::empty()))), - StreamState::HasMore => Ok(Async::Ready(match self.type_ { + StreamState::Eof => Poll::Ready(Inner::PlainText(Body::empty())), + StreamState::HasMore => Poll::Ready(match self.type_ { DecoderType::Gzip => Inner::Gzip(Gzip::new(body)), DecoderType::Brotli => Inner::Brotli(Brotli::new(body)), DecoderType::Deflate => Inner::Deflate(Deflate::new(body)), - })), + }), } } } impl Gzip { fn new(stream: ReadableChunks) -> Self { + let stream = Arc::new(Mutex::new(stream)); + let reader = stream.clone(); Gzip { buf: BytesMut::with_capacity(INIT_BUFFER_SIZE), inner: Box::new(gzip::Decoder::new(Peeked::new(stream))), + reader: reader, } } } #[allow(unsafe_code)] -fn poll_with_read(reader: &mut dyn Read, buf: &mut BytesMut) -> Poll, Error> { - if buf.remaining_mut() == 0 { - buf.reserve(INIT_BUFFER_SIZE); - } +fn poll_with_read(reader: &mut dyn Read, buf: &mut BytesMut) -> Poll>> { + // Ensure a full size buffer is available. + // `reserve` is optimized to reclaim space over allocating. + buf.reserve(INIT_BUFFER_SIZE); // The buffer contains uninitialised memory so getting a readable slice is unsafe. // We trust the reader not to read from the memory given. // // To be safe, this memory could be zeroed before passing to the reader. // Otherwise we might need to deal with the case where the reader panics. + let read = { - let mut buf = unsafe { buf.bytes_mut() }; - reader.read(&mut buf) + let buf = unsafe { + let ptr = buf.chunk_mut().as_mut_ptr(); + std::slice::from_raw_parts_mut(ptr, buf.capacity()) + }; + reader.read(&mut *buf) }; match read { - Ok(read) if read == 0 => Ok(Async::Ready(None)), + Ok(read) if read == 0 => Poll::Ready(None), Ok(read) => { unsafe { buf.advance_mut(read) }; - let chunk = Chunk::from(buf.split_to(read).freeze()); - - Ok(Async::Ready(Some(chunk))) + let chunk = buf.split_to(read).freeze(); + Poll::Ready(Some(Ok(chunk))) }, - Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => Ok(Async::NotReady), - Err(e) => Err(e.into()), + Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => Poll::Pending, + Err(e) => Poll::Ready(Some(Err(e.into()))), } } impl Stream for Gzip { - type Item = Chunk; - type Error = Error; + type Item = Result; - fn poll(&mut self) -> Poll, Self::Error> { - poll_with_read(&mut self.inner, &mut self.buf) + fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + let mut buf = self.buf.clone(); + if let Ok(mut reader) = self.reader.lock() { + reader.waker = Some(cx.waker().clone()); + } + poll_with_read(&mut self.inner, &mut buf) } } /// A brotli decoder that reads from a `brotli::Decompressor` into a `BytesMut` and emits the results -/// as a `Chunk`. +/// as a `Bytes`. struct Brotli { inner: Box>>>, buf: BytesMut, + reader: Arc>>, } impl Brotli { fn new(stream: ReadableChunks) -> Self { + let stream = Arc::new(Mutex::new(stream)); + let reader = stream.clone(); Self { buf: BytesMut::with_capacity(INIT_BUFFER_SIZE), inner: Box::new(Decompressor::new(Peeked::new(stream), BUF_SIZE)), + reader: reader, } } } impl Stream for Brotli { - type Item = Chunk; - type Error = Error; + type Item = Result; - fn poll(&mut self) -> Poll, Self::Error> { - poll_with_read(&mut self.inner, &mut self.buf) + fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + let mut buf = self.buf.clone(); + if let Ok(mut reader) = self.reader.lock() { + reader.waker = Some(cx.waker().clone()); + } + poll_with_read(&mut self.inner, &mut buf) } } /// A deflate decoder that reads from a `deflate::Decoder` into a `BytesMut` and emits the results -/// as a `Chunk`. +/// as a `Bytes`. struct Deflate { inner: Box>>>, buf: BytesMut, + reader: Arc>>, } impl Deflate { fn new(stream: ReadableChunks) -> Self { + let stream = Arc::new(Mutex::new(stream)); + let reader = stream.clone(); Self { buf: BytesMut::with_capacity(INIT_BUFFER_SIZE), inner: Box::new(DeflateDecoder::new(Peeked::new(stream))), + reader: reader, } } } impl Stream for Deflate { - type Item = Chunk; - type Error = Error; + type Item = Result; - fn poll(&mut self) -> Poll, Self::Error> { - poll_with_read(&mut self.inner, &mut self.buf) + fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + let mut buf = self.buf.clone(); + if let Ok(mut reader) = self.reader.lock() { + reader.waker = Some(cx.waker().clone()); + } + poll_with_read(&mut self.inner, &mut buf) } } @@ -311,17 +338,21 @@ impl Stream for Deflate { pub struct ReadableChunks { state: ReadState, stream: S, + waker: Option, } enum ReadState { /// A chunk is ready to be read from. - Ready(Chunk), + Ready(Bytes), /// The next chunk isn't ready yet. NotReady, /// The stream has finished. Eof, + /// Stream is in err + Error(hyper::Error), } +#[derive(Debug)] enum StreamState { /// More bytes can be read from the stream. HasMore, @@ -334,7 +365,7 @@ struct Peeked { state: PeekedState, peeked_buf: [u8; 10], pos: usize, - inner: R, + inner: Arc>, } enum PeekedState { @@ -346,7 +377,7 @@ enum PeekedState { impl Peeked { #[inline] - fn new(inner: R) -> Self { + fn new(inner: Arc>) -> Self { Peeked { state: PeekedState::NotReady, peeked_buf: [0; 10], @@ -383,11 +414,13 @@ impl Read for Peeked { if self.pos == peeked_buf_len { self.not_ready(); } - return Ok(len); }, PeekedState::NotReady => { - let read = self.inner.read(&mut self.peeked_buf[self.pos..]); + let mut buf = &mut self.peeked_buf[self.pos..]; + let stream = self.inner.clone(); + let mut reader = stream.lock().unwrap(); + let read = reader.read(&mut buf); match read { Ok(0) => self.ready(), @@ -411,6 +444,7 @@ impl ReadableChunks { ReadableChunks { state: ReadState::NotReady, stream: stream, + waker: None, } } } @@ -423,9 +457,12 @@ impl fmt::Debug for ReadableChunks { impl Read for ReadableChunks where - S: Stream, + S: Stream> + std::marker::Unpin, { fn read(&mut self, buf: &mut [u8]) -> io::Result { + let waker = self.waker.as_ref().unwrap().clone(); + let mut cx = Context::from_waker(&waker); + loop { let ret; match self.state { @@ -440,15 +477,15 @@ where return Ok(len); } }, - ReadState::NotReady => match self.poll_stream() { - Ok(Async::Ready(StreamState::HasMore)) => continue, - Ok(Async::Ready(StreamState::Eof)) => return Ok(0), - Ok(Async::NotReady) => return Err(io::ErrorKind::WouldBlock.into()), - Err(e) => { - return Err(io::Error::new(io::ErrorKind::Other, e)); - }, + ReadState::NotReady => match self.poll_stream(&mut cx) { + Poll::Ready(StreamState::HasMore) => continue, + Poll::Ready(StreamState::Eof) => return Ok(0), + Poll::Pending => return Err(io::ErrorKind::WouldBlock.into()), }, ReadState::Eof => return Ok(0), + ReadState::Error(ref err) => { + return Err(io::Error::new(io::ErrorKind::Other, err.to_string())) + }, } self.state = ReadState::NotReady; return Ok(ret); @@ -458,26 +495,29 @@ where impl ReadableChunks where - S: Stream, + S: Stream> + std::marker::Unpin, { /// Poll the readiness of the inner reader. /// /// This function will update the internal state and return a simplified /// version of the `ReadState`. - fn poll_stream(&mut self) -> Poll { - match self.stream.poll() { - Ok(Async::Ready(Some(chunk))) => { + fn poll_stream(&mut self, cx: &mut Context<'_>) -> Poll { + match Pin::new(&mut self.stream).poll_next(cx) { + Poll::Ready(Some(Ok(chunk))) => { self.state = ReadState::Ready(chunk); - Ok(Async::Ready(StreamState::HasMore)) + Poll::Ready(StreamState::HasMore) }, - Ok(Async::Ready(None)) => { - self.state = ReadState::Eof; + Poll::Ready(Some(Err(err))) => { + self.state = ReadState::Error(err); - Ok(Async::Ready(StreamState::Eof)) + Poll::Ready(StreamState::Eof) }, - Ok(Async::NotReady) => Ok(Async::NotReady), - Err(e) => Err(e), + Poll::Ready(None) => { + self.state = ReadState::Eof; + Poll::Ready(StreamState::Eof) + }, + Poll::Pending => Poll::Pending, } } } diff --git a/components/net/fetch/cors_cache.rs b/components/net/fetch/cors_cache.rs index 0a809529c69..666a160a591 100644 --- a/components/net/fetch/cors_cache.rs +++ b/components/net/fetch/cors_cache.rs @@ -10,7 +10,7 @@ //! with CORSRequest being expanded into FetchRequest (etc) use http::header::HeaderName; -use hyper::Method; +use http::Method; use net_traits::request::{CredentialsMode, Origin, Request}; use servo_url::ServoUrl; use time::{self, Timespec}; diff --git a/components/net/fetch/methods.rs b/components/net/fetch/methods.rs index a7d82cac318..cf99b0d8adb 100644 --- a/components/net/fetch/methods.rs +++ b/components/net/fetch/methods.rs @@ -14,8 +14,8 @@ use crossbeam_channel::Sender; use devtools_traits::DevtoolsControlMsg; use headers::{AccessControlExposeHeaders, ContentType, HeaderMapExt, Range}; use http::header::{self, HeaderMap, HeaderName}; -use hyper::Method; -use hyper::StatusCode; +use http::Method; +use http::StatusCode; use ipc_channel::ipc::{self, IpcReceiver}; use mime::{self, Mime}; use net_traits::blob_url_store::{parse_blob_url, BlobURLStoreError}; @@ -40,7 +40,7 @@ use std::ops::Bound; use std::str; use std::sync::atomic::Ordering; use std::sync::{Arc, Mutex}; -use tokio2::sync::mpsc::{ +use tokio::sync::mpsc::{ unbounded_channel, UnboundedReceiver as TokioReceiver, UnboundedSender as TokioSender, }; @@ -522,7 +522,9 @@ async fn wait_for_response( Some(Data::Payload(vec)) => { target.process_response_chunk(vec); }, - Some(Data::Done) => break, + Some(Data::Done) => { + break; + }, Some(Data::Cancelled) => { response.aborted.store(true, Ordering::Release); break; diff --git a/components/net/filemanager_thread.rs b/components/net/filemanager_thread.rs index a1e8ff40116..bc217874981 100644 --- a/components/net/filemanager_thread.rs +++ b/components/net/filemanager_thread.rs @@ -27,7 +27,7 @@ use std::ops::Index; use std::path::{Path, PathBuf}; use std::sync::atomic::{self, AtomicBool, AtomicUsize, Ordering}; use std::sync::{Arc, Mutex, RwLock, Weak}; -use tokio2::sync::mpsc::UnboundedSender as TokioSender; +use tokio::sync::mpsc::UnboundedSender as TokioSender; use url::Url; use uuid::Uuid; diff --git a/components/net/http_cache.rs b/components/net/http_cache.rs index fe97ed13c8a..31f171c1c28 100644 --- a/components/net/http_cache.rs +++ b/components/net/http_cache.rs @@ -12,8 +12,7 @@ use headers::{ CacheControl, ContentRange, Expires, HeaderMapExt, LastModified, Pragma, Range, Vary, }; use http::header::HeaderValue; -use http::{header, HeaderMap}; -use hyper::{Method, StatusCode}; +use http::{header, HeaderMap, Method, StatusCode}; use malloc_size_of::Measurable; use malloc_size_of::{ MallocSizeOf, MallocSizeOfOps, MallocUnconditionalShallowSizeOf, MallocUnconditionalSizeOf, @@ -29,7 +28,7 @@ use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Mutex; use std::time::SystemTime; use time::{Duration, Timespec, Tm}; -use tokio2::sync::mpsc::{unbounded_channel as unbounded, UnboundedSender as TokioSender}; +use tokio::sync::mpsc::{unbounded_channel as unbounded, UnboundedSender as TokioSender}; /// The key used to differentiate requests in the cache. #[derive(Clone, Eq, Hash, MallocSizeOf, PartialEq)] diff --git a/components/net/http_loader.rs b/components/net/http_loader.rs index cb0d43c255c..595fb3c124d 100644 --- a/components/net/http_loader.rs +++ b/components/net/http_loader.rs @@ -12,12 +12,13 @@ use crate::hsts::HstsList; use crate::http_cache::{CacheKey, HttpCache}; use crate::resource_thread::AuthCache; use async_recursion::async_recursion; -use crossbeam_channel::{unbounded, Receiver, Sender}; +use core::convert::Infallible; +use crossbeam_channel::Sender; use devtools_traits::{ ChromeToDevtoolsControlMsg, DevtoolsControlMsg, HttpRequest as DevtoolsHttpRequest, }; use devtools_traits::{HttpResponse as DevtoolsHttpResponse, NetworkEvent}; -use futures_util::compat::*; +use futures::{future, StreamExt, TryFutureExt, TryStreamExt}; use headers::authorization::Basic; use headers::{AccessControlAllowCredentials, AccessControlAllowHeaders, HeaderMapExt}; use headers::{ @@ -28,12 +29,11 @@ use headers::{AccessControlAllowOrigin, AccessControlMaxAge}; use headers::{CacheControl, ContentEncoding, ContentLength}; use headers::{IfModifiedSince, LastModified, Origin as HyperOrigin, Pragma, Referer, UserAgent}; use http::header::{ - self, HeaderName, HeaderValue, ACCEPT, CONTENT_ENCODING, CONTENT_LANGUAGE, CONTENT_LOCATION, - CONTENT_TYPE, + self, HeaderValue, ACCEPT, CONTENT_ENCODING, CONTENT_LANGUAGE, CONTENT_LOCATION, CONTENT_TYPE, }; -use http::{HeaderMap, Request as HyperRequest}; -use hyper::header::TRANSFER_ENCODING; -use hyper::{Body, Client, Method, Response as HyperResponse, StatusCode}; +use http::{HeaderMap, Method, Request as HyperRequest, StatusCode}; +use hyper::header::{HeaderName, TRANSFER_ENCODING}; +use hyper::{Body, Client, Response as HyperResponse}; use hyper_serde::Serde; use ipc_channel::ipc::{self, IpcSender}; use ipc_channel::router::ROUTER; @@ -65,14 +65,15 @@ use std::ops::Deref; use std::sync::{Arc as StdArc, Condvar, Mutex, RwLock}; use std::time::{Duration, SystemTime}; use time::{self, Tm}; -use tokio::prelude::{future, Future, Sink, Stream}; -use tokio::sync::mpsc::{channel, Receiver as TokioReceiver, Sender as TokioSender}; -use tokio2::sync::mpsc::{unbounded_channel, UnboundedSender as Tokio02Sender}; -use tokio_compat::runtime::{Builder, Runtime}; +use tokio::runtime::Runtime; +use tokio::sync::mpsc::{ + channel, unbounded_channel, Receiver as TokioReceiver, Sender as TokioSender, + UnboundedReceiver, UnboundedSender, +}; +use tokio_stream::wrappers::ReceiverStream; lazy_static! { - pub static ref HANDLE: Mutex> = - Mutex::new(Some(Builder::new().build().unwrap())); + pub static ref HANDLE: Mutex> = Mutex::new(Some(Runtime::new().unwrap())); } /// The various states an entry of the HttpCache can be in. @@ -110,10 +111,7 @@ impl HttpState { history_states: RwLock::new(HashMap::new()), http_cache: RwLock::new(HttpCache::new()), http_cache_state: Mutex::new(HashMap::new()), - client: create_http_client( - tls_config, - HANDLE.lock().unwrap().as_ref().unwrap().executor(), - ), + client: create_http_client(tls_config), extra_certs: ExtraCerts::new(), connection_certs: ConnectionCerts::new(), } @@ -440,7 +438,7 @@ enum BodyStream { Chunked(TokioReceiver>), /// A body whose bytes are buffered /// and sent in one chunk over the network. - Buffered(Receiver), + Buffered(UnboundedReceiver), } /// The sink side of the body passed to hyper, @@ -451,7 +449,7 @@ enum BodySink { /// A Crossbeam sender used to send chunks to the fetch worker, /// where they will be buffered /// in order to ensure they are not streamed them over the network. - Buffered(Sender), + Buffered(UnboundedSender), } impl BodySink { @@ -459,12 +457,9 @@ impl BodySink { match self { BodySink::Chunked(ref sender) => { let sender = sender.clone(); - HANDLE - .lock() - .unwrap() - .as_mut() - .unwrap() - .spawn(sender.send(bytes).map(|_| ()).map_err(|_| ())); + HANDLE.lock().unwrap().as_mut().unwrap().spawn(async move { + let _ = sender.send(bytes).await; + }); }, BodySink::Buffered(ref sender) => { let _ = sender.send(BodyChunk::Chunk(bytes)); @@ -474,20 +469,7 @@ impl BodySink { pub fn close(&self) { match self { - BodySink::Chunked(ref sender) => { - let mut sender = sender.clone(); - HANDLE - .lock() - .unwrap() - .as_mut() - .unwrap() - .spawn(future::lazy(move || { - if sender.close().is_err() { - warn!("Failed to close network request sink."); - } - Ok(()) - })); - }, + BodySink::Chunked(_) => { /* no need to close sender */ }, BodySink::Buffered(ref sender) => { let _ = sender.send(BodyChunk::Done); }, @@ -506,7 +488,7 @@ async fn obtain_response( request_id: Option<&str>, is_xhr: bool, context: &FetchContext, - fetch_terminated: Tokio02Sender, + fetch_terminated: UnboundedSender, ) -> Result<(HyperResponse, Option), NetworkError> { { let mut headers = request_headers.clone(); @@ -537,7 +519,7 @@ async fn obtain_response( // However since this doesn't appear documented, and we're using an ancient version, // for now we buffer manually to ensure we don't stream requests // to servers that might not know how to handle them. - let (sender, receiver) = unbounded(); + let (sender, receiver) = unbounded_channel(); (BodySink::Buffered(sender), BodyStream::Buffered(receiver)) }; @@ -557,6 +539,7 @@ async fn obtain_response( ROUTER.add_route( body_port.to_opaque(), Box::new(move |message| { + info!("Received message"); let bytes: Vec = match message.to().unwrap() { BodyChunkResponse::Chunk(bytes) => bytes, BodyChunkResponse::Done => { @@ -593,23 +576,25 @@ async fn obtain_response( ); let body = match stream { - BodyStream::Chunked(receiver) => Body::wrap_stream(receiver), - BodyStream::Buffered(receiver) => { + BodyStream::Chunked(receiver) => { + let stream = ReceiverStream::new(receiver); + Body::wrap_stream(stream.map(Ok::<_, Infallible>)) + }, + BodyStream::Buffered(mut receiver) => { // Accumulate bytes received over IPC into a vector. let mut body = vec![]; loop { - match receiver.recv() { - Ok(BodyChunk::Chunk(mut bytes)) => { + match receiver.recv().await { + Some(BodyChunk::Chunk(mut bytes)) => { body.append(&mut bytes); }, - Ok(BodyChunk::Done) => break, - Err(_) => warn!("Failed to read all chunks from request body."), + Some(BodyChunk::Done) => break, + None => warn!("Failed to read all chunks from request body."), } } body.into() }, }; - HyperRequest::builder() .method(method) .uri(encoded_url) @@ -709,12 +694,11 @@ async fn obtain_response( debug!("Not notifying devtools (no request_id)"); None }; - Ok((Decoder::detect(res), msg)) + future::ready(Ok((Decoder::detect(res), msg))) }) .map_err(move |e| { NetworkError::from_hyper_error(&e, connection_certs_clone.remove(host_clone)) }) - .compat() // convert from Future01 to Future03 .await } } @@ -1850,7 +1834,7 @@ async fn http_network_fetch( send_response_to_devtools( &sender, request_id.unwrap(), - meta_headers.map(Serde::into_inner), + meta_headers.map(|hdrs| Serde::into_inner(hdrs)), meta_status, pipeline_id, ); @@ -1866,19 +1850,22 @@ async fn http_network_fetch( HANDLE.lock().unwrap().as_ref().unwrap().spawn( res.into_body() - .map_err(|_| ()) - .fold(res_body, move |res_body, chunk| { + .map_err(|e| { + warn!("Error streaming response body: {:?}", e); + () + }) + .try_fold(res_body, move |res_body, chunk| { if cancellation_listener.lock().unwrap().cancelled() { *res_body.lock().unwrap() = ResponseBody::Done(vec![]); let _ = done_sender.send(Data::Cancelled); - return tokio::prelude::future::failed(()); + return future::ready(Err(())); } if let ResponseBody::Receiving(ref mut body) = *res_body.lock().unwrap() { - let bytes = chunk.into_bytes(); + let bytes = chunk; body.extend_from_slice(&*bytes); let _ = done_sender.send(Data::Payload(bytes.to_vec())); } - tokio::prelude::future::ok(res_body) + future::ready(Ok(res_body)) }) .and_then(move |res_body| { debug!("successfully finished response for {:?}", url1); @@ -1893,10 +1880,10 @@ async fn http_network_fetch( .unwrap() .set_attribute(ResourceAttribute::ResponseEnd); let _ = done_sender2.send(Data::Done); - tokio::prelude::future::ok(()) + future::ready(Ok(())) }) .map_err(move |_| { - warn!("finished response for {:?} with error", url2); + debug!("finished response for {:?}", url2); let mut body = res_body2.lock().unwrap(); let completed_body = match *body { ResponseBody::Receiving(ref mut body) => mem::replace(body, vec![]), diff --git a/components/net/resource_thread.rs b/components/net/resource_thread.rs index e59aca10fcf..4b858eaa48f 100644 --- a/components/net/resource_thread.rs +++ b/components/net/resource_thread.rs @@ -16,7 +16,7 @@ use crate::hsts::HstsList; use crate::http_cache::HttpCache; use crate::http_loader::{http_redirect_fetch, HttpState, HANDLE}; use crate::storage_thread::StorageThreadFactory; -use crate::websocket_loader::{self, HANDLE as WS_HANDLE}; +use crate::websocket_loader; use crossbeam_channel::Sender; use devtools_traits::DevtoolsControlMsg; use embedder_traits::resources::{self, Resource}; @@ -155,15 +155,12 @@ fn create_http_states( history_states: RwLock::new(HashMap::new()), http_cache: RwLock::new(http_cache), http_cache_state: Mutex::new(HashMap::new()), - client: create_http_client( - create_tls_config( - &certs, - ALPN_H2_H1, - extra_certs.clone(), - connection_certs.clone(), - ), - HANDLE.lock().unwrap().as_ref().unwrap().executor(), - ), + client: create_http_client(create_tls_config( + &certs, + ALPN_H2_H1, + extra_certs.clone(), + connection_certs.clone(), + )), extra_certs, connection_certs, }; @@ -178,15 +175,12 @@ fn create_http_states( history_states: RwLock::new(HashMap::new()), http_cache: RwLock::new(HttpCache::new()), http_cache_state: Mutex::new(HashMap::new()), - client: create_http_client( - create_tls_config( - &certs, - ALPN_H2_H1, - extra_certs.clone(), - connection_certs.clone(), - ), - HANDLE.lock().unwrap().as_ref().unwrap().executor(), - ), + client: create_http_client(create_tls_config( + &certs, + ALPN_H2_H1, + extra_certs.clone(), + connection_certs.clone(), + )), extra_certs, connection_certs, }; @@ -616,12 +610,6 @@ impl CoreResourceManager { // or a short timeout has been reached. self.thread_pool.exit(); - // Shut-down the async runtime used by fetch workers. - drop(HANDLE.lock().unwrap().take()); - - // Shut-down the async runtime used by websocket workers. - drop(WS_HANDLE.lock().unwrap().take()); - debug!("Exited CoreResourceManager"); } @@ -680,58 +668,49 @@ impl CoreResourceManager { _ => (FileTokenCheck::NotRequired, None), }; - HANDLE - .lock() - .unwrap() - .as_ref() - .unwrap() - .spawn_std(async move { - // XXXManishearth: Check origin against pipeline id (also ensure that the mode is allowed) - // todo load context / mimesniff in fetch - // todo referrer policy? - // todo service worker stuff - let context = FetchContext { - state: http_state, - user_agent: ua, - devtools_chan: dc.map(|dc| Arc::new(Mutex::new(dc))), - filemanager: Arc::new(Mutex::new(filemanager)), - file_token, - cancellation_listener: Arc::new(Mutex::new(CancellationListener::new( - cancel_chan, - ))), - timing: ServoArc::new(Mutex::new(ResourceFetchTiming::new( - request.timing_type(), - ))), - }; + HANDLE.lock().unwrap().as_ref().unwrap().spawn(async move { + // XXXManishearth: Check origin against pipeline id (also ensure that the mode is allowed) + // todo load context / mimesniff in fetch + // todo referrer policy? + // todo service worker stuff + let context = FetchContext { + state: http_state, + user_agent: ua, + devtools_chan: dc.map(|dc| Arc::new(Mutex::new(dc))), + filemanager: Arc::new(Mutex::new(filemanager)), + file_token, + cancellation_listener: Arc::new(Mutex::new(CancellationListener::new(cancel_chan))), + timing: ServoArc::new(Mutex::new(ResourceFetchTiming::new(request.timing_type()))), + }; - match res_init_ { - Some(res_init) => { - let response = Response::from_init(res_init, timing_type); - http_redirect_fetch( - &mut request, - &mut CorsCache::new(), - response, - true, - &mut sender, - &mut None, - &context, - ) - .await; - }, - None => { - fetch(&mut request, &mut sender, &context).await; - }, - }; + match res_init_ { + Some(res_init) => { + let response = Response::from_init(res_init, timing_type); + http_redirect_fetch( + &mut request, + &mut CorsCache::new(), + response, + true, + &mut sender, + &mut None, + &context, + ) + .await; + }, + None => { + fetch(&mut request, &mut sender, &context).await; + }, + }; - // Remove token after fetch. - if let Some(id) = blob_url_file_id.as_ref() { - context - .filemanager - .lock() - .unwrap() - .invalidate_token(&context.file_token, id); - } - }); + // Remove token after fetch. + if let Some(id) = blob_url_file_id.as_ref() { + context + .filemanager + .lock() + .unwrap() + .invalidate_token(&context.file_token, id); + } + }); } fn websocket_connect( diff --git a/components/net/tests/fetch.rs b/components/net/tests/fetch.rs index 9416a81e8de..4c0149b8f1a 100644 --- a/components/net/tests/fetch.rs +++ b/components/net/tests/fetch.rs @@ -20,7 +20,7 @@ use headers::{AccessControlAllowMethods, AccessControlMaxAge, HeaderMapExt}; use headers::{CacheControl, ContentLength, ContentType, Expires, LastModified, Pragma, UserAgent}; use http::header::{self, HeaderMap, HeaderName, HeaderValue}; use http::{Method, StatusCode}; -use hyper::body::Body; +use hyper::Body; use hyper::{Request as HyperRequest, Response as HyperResponse}; use mime::{self, Mime}; use msg::constellation_msg::TEST_PIPELINE_ID; diff --git a/components/net/tests/http_cache.rs b/components/net/tests/http_cache.rs index 8dd09b650da..30a4052928a 100644 --- a/components/net/tests/http_cache.rs +++ b/components/net/tests/http_cache.rs @@ -10,7 +10,7 @@ use net_traits::request::{Origin, Referrer, Request}; use net_traits::response::{HttpsState, Response, ResponseBody}; use net_traits::{ResourceFetchTiming, ResourceTimingType}; use servo_url::ServoUrl; -use tokio2::sync::mpsc::unbounded_channel as unbounded; +use tokio::sync::mpsc::unbounded_channel as unbounded; #[test] fn test_refreshing_resource_sets_done_chan_the_appropriate_value() { diff --git a/components/net/tests/http_loader.rs b/components/net/tests/http_loader.rs index e9de2cb983f..e84b0ec3fc5 100644 --- a/components/net/tests/http_loader.rs +++ b/components/net/tests/http_loader.rs @@ -15,7 +15,6 @@ use devtools_traits::HttpResponse as DevtoolsHttpResponse; use devtools_traits::{ChromeToDevtoolsControlMsg, DevtoolsControlMsg, NetworkEvent}; use flate2::write::{DeflateEncoder, GzEncoder}; use flate2::Compression; -use futures::{self, Future, Stream}; use headers::authorization::Basic; use headers::{ Authorization, ContentLength, Date, HeaderMapExt, Host, StrictTransportSecurity, UserAgent, @@ -23,7 +22,7 @@ use headers::{ use http::header::{self, HeaderMap, HeaderValue}; use http::uri::Authority; use http::{Method, StatusCode}; -use hyper::body::Body; +use hyper::Body; use hyper::{Request as HyperRequest, Response as HyperResponse}; use ipc_channel::ipc; use ipc_channel::router::ROUTER; @@ -51,13 +50,6 @@ fn mock_origin() -> ImmutableOrigin { ServoUrl::parse("http://servo.org").unwrap().origin() } -fn read_response(req: HyperRequest) -> impl Future { - req.into_body() - .concat2() - .and_then(|body| futures::future::ok(str::from_utf8(&body).unwrap().to_owned())) - .map_err(|_| ()) -} - fn assert_cookie_for_domain( cookie_jar: &RwLock, domain: &str, @@ -521,28 +513,18 @@ fn test_load_should_decode_the_response_as_gzip_when_response_headers_have_conte #[test] fn test_load_doesnt_send_request_body_on_any_redirect() { + use hyper::body::HttpBody; + let post_handler = move |request: HyperRequest, response: &mut HyperResponse| { assert_eq!(request.method(), Method::GET); - read_response(request) - .and_then(|data| { - assert_eq!(data, ""); - futures::future::ok(()) - }) - .poll() - .unwrap(); + assert_eq!(request.size_hint().exact(), Some(0)); *response.body_mut() = b"Yay!".to_vec().into(); }; let (post_server, post_url) = make_server(post_handler); let post_redirect_url = post_url.clone(); let pre_handler = move |request: HyperRequest, response: &mut HyperResponse| { - read_response(request) - .and_then(|data| { - assert_eq!(data, "Body on POST"); - futures::future::ok(()) - }) - .poll() - .unwrap(); + assert_eq!(request.size_hint().exact(), Some(13)); response.headers_mut().insert( header::LOCATION, HeaderValue::from_str(&post_redirect_url.to_string()).unwrap(), diff --git a/components/net/tests/main.rs b/components/net/tests/main.rs index f814980f4aa..46f3eb1bb05 100644 --- a/components/net/tests/main.rs +++ b/components/net/tests/main.rs @@ -21,14 +21,17 @@ mod mime_classifier; mod resource_thread; mod subresource_integrity; +use core::convert::Infallible; +use core::pin::Pin; use crossbeam_channel::{unbounded, Sender}; use devtools_traits::DevtoolsControlMsg; use embedder_traits::resources::{self, Resource}; use embedder_traits::{EmbedderProxy, EventLoopWaker}; -use futures::{Future, Stream}; +use futures::future::ready; +use futures::StreamExt; use hyper::server::conn::Http; use hyper::server::Server as HyperServer; -use hyper::service::service_fn_ok; +use hyper::service::{make_service_fn, service_fn}; use hyper::{Body, Request as HyperRequest, Response as HyperResponse}; use net::connector::{create_tls_config, ConnectionCerts, ExtraCerts, ALPN_H2_H1}; use net::fetch::cors_cache::CorsCache; @@ -40,20 +43,27 @@ use net_traits::filemanager_thread::FileTokenCheck; use net_traits::request::Request; use net_traits::response::Response; use net_traits::{FetchTaskTarget, ResourceFetchTiming, ResourceTimingType}; -use openssl::ssl::{SslAcceptor, SslFiletype, SslMethod}; +use openssl::ssl::{Ssl, SslAcceptor, SslFiletype, SslMethod}; use servo_arc::Arc as ServoArc; use servo_url::ServoUrl; use std::net::TcpListener as StdTcpListener; use std::path::PathBuf; use std::sync::{Arc, Mutex, Weak}; use tokio::net::TcpListener; -use tokio::reactor::Handle; -use tokio::runtime::Runtime; -use tokio_openssl::SslAcceptorExt; +use tokio::net::TcpStream; +use tokio::runtime::{Builder, Runtime}; +use tokio_openssl::SslStream; +use tokio_stream::wrappers::TcpListenerStream; use tokio_test::block_on; lazy_static! { - pub static ref HANDLE: Mutex = Mutex::new(Runtime::new().unwrap()); + pub static ref HANDLE: Mutex = Mutex::new( + Builder::new_multi_thread() + .enable_io() + .worker_threads(10) + .build() + .unwrap() + ); } const DEFAULT_USER_AGENT: &'static str = "Such Browser. Very Layout. Wow."; @@ -134,33 +144,34 @@ fn fetch(request: &mut Request, dc: Option>) -> Respo fn fetch_with_context(request: &mut Request, mut context: &mut FetchContext) -> Response { let (sender, receiver) = unbounded(); let mut target = FetchResponseCollector { sender: sender }; - - block_on(methods::fetch(request, &mut target, &mut context)); - - receiver.recv().unwrap() + block_on(async move { + methods::fetch(request, &mut target, &mut context).await; + receiver.recv().unwrap() + }) } fn fetch_with_cors_cache(request: &mut Request, cache: &mut CorsCache) -> Response { let (sender, receiver) = unbounded(); let mut target = FetchResponseCollector { sender: sender }; - - block_on(methods::fetch_with_cors_cache( - request, - cache, - &mut target, - &mut new_fetch_context(None, None, None), - )); - - receiver.recv().unwrap() + block_on(async move { + methods::fetch_with_cors_cache( + request, + cache, + &mut target, + &mut new_fetch_context(None, None, None), + ) + .await; + receiver.recv().unwrap() + }) } pub(crate) struct Server { - pub close_channel: futures::sync::oneshot::Sender<()>, + pub close_channel: tokio::sync::oneshot::Sender<()>, } impl Server { fn close(self) { - self.close_channel.send(()).unwrap(); + self.close_channel.send(()).expect("err closing server:"); } } @@ -172,19 +183,26 @@ where let listener = StdTcpListener::bind("0.0.0.0:0").unwrap(); let url_string = format!("http://localhost:{}", listener.local_addr().unwrap().port()); let url = ServoUrl::parse(&url_string).unwrap(); - let (tx, rx) = futures::sync::oneshot::channel::<()>(); - let server = HyperServer::from_tcp(listener) - .unwrap() - .serve(move || { - let handler = handler.clone(); - service_fn_ok(move |req: HyperRequest| { - let mut response = HyperResponse::new(Vec::::new().into()); - handler(req, &mut response); - response + let (tx, rx) = tokio::sync::oneshot::channel::<()>(); + let server = async move { + HyperServer::from_tcp(listener) + .unwrap() + .serve(make_service_fn(move |_| { + let handler = handler.clone(); + ready(Ok::<_, Infallible>(service_fn( + move |req: HyperRequest| { + let mut response = HyperResponse::new(Vec::::new().into()); + handler(req, &mut response); + ready(Ok::<_, Infallible>(response)) + }, + ))) + })) + .with_graceful_shutdown(async move { + rx.await.ok(); }) - }) - .with_graceful_shutdown(rx) - .map_err(|_| ()); + .await + .expect("Could not start server"); + }; HANDLE.lock().unwrap().spawn(server); let server = Server { close_channel: tx }; @@ -197,43 +215,64 @@ where { let handler = Arc::new(handler); let listener = StdTcpListener::bind("[::0]:0").unwrap(); - let listener = TcpListener::from_std(listener, &Handle::default()).unwrap(); + let listener = HANDLE + .lock() + .unwrap() + .block_on(async move { TcpListener::from_std(listener).unwrap() }); + let url_string = format!("http://localhost:{}", listener.local_addr().unwrap().port()); + let mut listener = TcpListenerStream::new(listener); + let url = ServoUrl::parse(&url_string).unwrap(); + let (tx, mut rx) = tokio::sync::oneshot::channel::<()>(); - let server = listener.incoming().map_err(|_| ()).for_each(move |sock| { - let mut tls_server_config = SslAcceptor::mozilla_intermediate_v5(SslMethod::tls()).unwrap(); - tls_server_config - .set_certificate_file(&cert_path, SslFiletype::PEM) - .unwrap(); - tls_server_config - .set_private_key_file(&key_path, SslFiletype::PEM) - .unwrap(); + let server = async move { + loop { + let stream = tokio::select! { + stream = listener.next() => stream, + _ = &mut rx => break + }; - let handler = handler.clone(); - tls_server_config - .build() - .accept_async(sock) - .map_err(|_| ()) - .and_then(move |ssl| { - Http::new() - .serve_connection( - ssl, - service_fn_ok(move |req: HyperRequest| { - let mut response = HyperResponse::new(Vec::::new().into()); - handler(req, &mut response); - response - }), - ) - .map_err(|_| ()) - }) - }); + let stream = match stream { + Some(stream) => stream.expect("Could not accept stream: "), + _ => break, + }; - let (tx, rx) = futures::sync::oneshot::channel::<()>(); - let server = server - .select(rx.map_err(|_| ())) - .map(|_| ()) - .map_err(|_| ()); + let stream = stream.into_std().unwrap(); + stream + .set_read_timeout(Some(std::time::Duration::new(5, 0))) + .unwrap(); + let stream = TcpStream::from_std(stream).unwrap(); + + let mut tls_server_config = + SslAcceptor::mozilla_intermediate_v5(SslMethod::tls()).unwrap(); + tls_server_config + .set_certificate_file(&cert_path, SslFiletype::PEM) + .unwrap(); + tls_server_config + .set_private_key_file(&key_path, SslFiletype::PEM) + .unwrap(); + + let tls_server_config = tls_server_config.build(); + let ssl = Ssl::new(tls_server_config.context()).unwrap(); + let mut stream = SslStream::new(ssl, stream).unwrap(); + + let _ = Pin::new(&mut stream).accept().await; + + let handler = handler.clone(); + + let _ = Http::new() + .serve_connection( + stream, + service_fn(move |req: HyperRequest| { + let mut response = HyperResponse::new(Body::empty()); + handler(req, &mut response); + ready(Ok::<_, Infallible>(response)) + }), + ) + .await; + } + }; HANDLE.lock().unwrap().spawn(server); diff --git a/components/net/tests/mime_classifier.rs b/components/net/tests/mime_classifier.rs index 3317b355d71..0fac4a027e2 100644 --- a/components/net/tests/mime_classifier.rs +++ b/components/net/tests/mime_classifier.rs @@ -43,7 +43,7 @@ fn test_sniff_mp4_matcher_long() { let matcher = Mp4Matcher; let mut data: [u8; 260] = [0; 260]; - &data[..11].clone_from_slice(&[ + let _ = &data[..11].clone_from_slice(&[ 0x00, 0x00, 0x01, 0x04, 0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34, ]); diff --git a/components/net/websocket_loader.rs b/components/net/websocket_loader.rs index 2ad8c00a436..a73b48e1f41 100644 --- a/components/net/websocket_loader.rs +++ b/components/net/websocket_loader.rs @@ -19,9 +19,9 @@ use crate::http_loader::HttpState; use async_tungstenite::tokio::{client_async_tls_with_connector_and_config, ConnectStream}; use async_tungstenite::WebSocketStream; use embedder_traits::resources::{self, Resource}; -use futures03::future::TryFutureExt; -use futures03::sink::SinkExt; -use futures03::stream::StreamExt; +use futures::future::TryFutureExt; +use futures::sink::SinkExt; +use futures::stream::StreamExt; use http::header::{HeaderMap, HeaderName, HeaderValue}; use ipc_channel::ipc::{IpcReceiver, IpcSender}; use ipc_channel::router::ROUTER; diff --git a/components/net_traits/Cargo.toml b/components/net_traits/Cargo.toml index 0e663b91bfd..76fb2113fb7 100644 --- a/components/net_traits/Cargo.toml +++ b/components/net_traits/Cargo.toml @@ -16,10 +16,10 @@ doctest = false content-security-policy = { version = "0.4.0", features = ["serde"] } cookie = "0.11" embedder_traits = { path = "../embedder_traits" } -headers = "0.2" -http = "0.1" -hyper = "0.12" -hyper_serde = "0.11" +headers = "0.3" +http = "0.2" +hyper = "0.14" +hyper_serde = "0.12" ipc-channel = "0.14" lazy_static = "1" log = "0.4" diff --git a/components/net_traits/lib.rs b/components/net_traits/lib.rs index de7871e8348..ac6ef9e3ad3 100644 --- a/components/net_traits/lib.rs +++ b/components/net_traits/lib.rs @@ -21,9 +21,9 @@ use crate::response::{HttpsState, Response, ResponseInit}; use crate::storage_thread::StorageThreadMsg; use cookie::Cookie; use headers::{ContentType, HeaderMapExt, ReferrerPolicy as ReferrerPolicyHeader}; +use http::StatusCode; use http::{Error as HttpError, HeaderMap}; use hyper::Error as HyperError; -use hyper::StatusCode; use hyper_serde::Serde; use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; use ipc_channel::router::ROUTER; @@ -759,7 +759,7 @@ pub enum NetworkError { impl NetworkError { pub fn from_hyper_error(error: &HyperError, cert_bytes: Option>) -> Self { let s = error.to_string(); - if s.contains("the handshake failed") { + if s.to_lowercase().contains("ssl") { NetworkError::SslValidation(s, cert_bytes.unwrap_or_default()) } else { NetworkError::Internal(s) diff --git a/components/net_traits/request.rs b/components/net_traits/request.rs index cfdd8edf399..443f4c57dab 100644 --- a/components/net_traits/request.rs +++ b/components/net_traits/request.rs @@ -8,7 +8,7 @@ use crate::ResourceTimingType; use content_security_policy::{self as csp, CspList}; use http::header::{HeaderName, AUTHORIZATION}; use http::HeaderMap; -use hyper::Method; +use http::Method; use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; use mime::Mime; use msg::constellation_msg::PipelineId; diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml index 1c9464db740..539dffc906e 100644 --- a/components/script/Cargo.toml +++ b/components/script/Cargo.toml @@ -54,11 +54,10 @@ enum-iterator = "0.3" euclid = "0.20" fnv = "1.0" fxhash = "0.2" -headers = "0.2" +headers = "0.3" html5ever = "0.25" -http = "0.1" -hyper = "0.12" -hyper_serde = "0.11" +http = "0.2" +hyper_serde = "0.12" image = "0.23" indexmap = { version = "1.0.2", features = ["std"] } ipc-channel = "0.14" @@ -113,7 +112,7 @@ unicode-segmentation = "1.1.0" url = "2.0" utf-8 = "0.7" uuid = { version = "0.8", features = ["v4", "serde"] } -webdriver = "0.40" +webdriver = "0.44" webgpu = { path = "../webgpu" } webrender_api = { git = "https://github.com/servo/webrender" } webxr-api = { git = "https://github.com/servo/webxr", features = ["ipc"] } diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index 02b72fc3c2d..efba7c718d1 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -73,8 +73,8 @@ use euclid::Length as EuclidLength; use html5ever::buffer_queue::BufferQueue; use html5ever::{LocalName, Namespace, Prefix, QualName}; use http::header::HeaderMap; -use hyper::Method; -use hyper::StatusCode; +use http::Method; +use http::StatusCode; use indexmap::IndexMap; use ipc_channel::ipc::{IpcReceiver, IpcSender}; use js::glue::{CallObjectTracer, CallScriptTracer, CallStringTracer, CallValueTracer}; diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs index d06fd85a426..80adec9718a 100644 --- a/components/script/dom/htmlformelement.rs +++ b/components/script/dom/htmlformelement.rs @@ -61,7 +61,7 @@ use dom_struct::dom_struct; use encoding_rs::{Encoding, UTF_8}; use headers::{ContentType, HeaderMapExt}; use html5ever::{LocalName, Prefix}; -use hyper::Method; +use http::Method; use mime::{self, Mime}; use net_traits::http_percent_encode; use net_traits::request::Referrer; diff --git a/components/script/dom/response.rs b/components/script/dom/response.rs index 85d20a62d06..ef183340a97 100644 --- a/components/script/dom/response.rs +++ b/components/script/dom/response.rs @@ -24,7 +24,7 @@ use crate::script_runtime::JSContext as SafeJSContext; use crate::script_runtime::StreamConsumer; use dom_struct::dom_struct; use http::header::HeaderMap as HyperHeaders; -use hyper::StatusCode; +use http::StatusCode; use hyper_serde::Serde; use js::jsapi::JSObject; use servo_url::ServoUrl; diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index b6adac383b7..1c6db3a5953 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -45,7 +45,7 @@ use headers::{ContentLength, ContentType, HeaderMapExt}; use html5ever::serialize; use html5ever::serialize::SerializeOpts; use http::header::{self, HeaderMap, HeaderName, HeaderValue}; -use hyper::Method; +use http::Method; use hyper_serde::Serde; use ipc_channel::ipc; use ipc_channel::router::ROUTER; diff --git a/components/script_traits/Cargo.toml b/components/script_traits/Cargo.toml index 14a709cea20..266d80d3317 100644 --- a/components/script_traits/Cargo.toml +++ b/components/script_traits/Cargo.toml @@ -20,9 +20,9 @@ devtools_traits = { path = "../devtools_traits" } embedder_traits = { path = "../embedder_traits" } euclid = "0.20" gfx_traits = { path = "../gfx_traits" } -http = "0.1" -hyper = "0.12" -hyper_serde = "0.11" +headers = "0.3" +http = "0.2" +hyper_serde = "0.12" ipc-channel = "0.14" keyboard-types = "0.5" libc = "0.2" @@ -41,7 +41,7 @@ smallvec = "0.6" style_traits = { path = "../style_traits", features = ["servo"] } time = "0.1.41" uuid = { version = "0.8", features = ["v4"] } -webdriver = "0.40" +webdriver = "0.44" webgpu = { path = "../webgpu" } webrender_api = { git = "https://github.com/servo/webrender" } webxr-api = { git = "https://github.com/servo/webxr", features = ["ipc"] } diff --git a/components/script_traits/lib.rs b/components/script_traits/lib.rs index be926307bd9..4d8ba59c0ea 100644 --- a/components/script_traits/lib.rs +++ b/components/script_traits/lib.rs @@ -34,7 +34,7 @@ use embedder_traits::EventLoopWaker; use euclid::{default::Point2D, Length, Rect, Scale, Size2D, UnknownUnit, Vector2D}; use gfx_traits::Epoch; use http::HeaderMap; -use hyper::Method; +use http::Method; use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; use ipc_channel::Error as IpcError; use keyboard_types::webdriver::Event as WebDriverInputEvent; diff --git a/components/webdriver_server/Cargo.toml b/components/webdriver_server/Cargo.toml index b568d1cfb09..d5b7957afe5 100644 --- a/components/webdriver_server/Cargo.toml +++ b/components/webdriver_server/Cargo.toml @@ -16,7 +16,8 @@ compositing = { path = "../compositing" } cookie = "0.11" crossbeam-channel = "0.4" euclid = "0.20" -hyper = "0.12" +headers = "0.3" +http = "0.2" image = "0.23" ipc-channel = "0.14" keyboard-types = "0.5" @@ -31,4 +32,4 @@ servo_config = { path = "../config" } servo_url = { path = "../url" } style_traits = { path = "../style_traits" } uuid = { version = "0.8", features = ["v4"] } -webdriver = "0.40" +webdriver = "0.44" diff --git a/components/webdriver_server/capabilities.rs b/components/webdriver_server/capabilities.rs index 5e9b877c84c..50b0be26acb 100644 --- a/components/webdriver_server/capabilities.rs +++ b/components/webdriver_server/capabilities.rs @@ -4,7 +4,7 @@ use serde_json::{Map, Value}; use webdriver::capabilities::{BrowserCapabilities, Capabilities}; -use webdriver::error::WebDriverResult; +use webdriver::error::{WebDriverError, WebDriverResult}; pub struct ServoCapabilities { pub browser_name: String, @@ -71,9 +71,16 @@ impl BrowserCapabilities for ServoCapabilities { Ok(self.accept_custom) } - fn validate_custom(&self, _: &str, _: &Value) -> WebDriverResult<()> { + fn validate_custom(&mut self, _: &str, _: &Value) -> WebDriverResult<()> { Ok(()) } + + fn web_socket_url( + &mut self, + _: &serde_json::Map, + ) -> Result { + todo!() + } } fn get_platform_name() -> Option { diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index cd54d1a8c8f..e4be9215a84 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -22,7 +22,7 @@ use capabilities::ServoCapabilities; use compositing::ConstellationMsg; use crossbeam_channel::{after, unbounded, Receiver, Sender}; use euclid::{Rect, Size2D}; -use hyper::Method; +use http::method::Method; use image::{DynamicImage, ImageFormat, RgbImage}; use ipc_channel::ipc::{self, IpcSender}; use ipc_channel::router::ROUTER; @@ -70,7 +70,7 @@ use webdriver::httpapi::WebDriverExtensionRoute; use webdriver::response::{CookieResponse, CookiesResponse}; use webdriver::response::{ElementRectResponse, NewSessionResponse, ValueResponse}; use webdriver::response::{TimeoutsResponse, WebDriverResponse, WindowRectResponse}; -use webdriver::server::{self, Session, WebDriverHandler}; +use webdriver::server::{self, Session, SessionTeardownKind, WebDriverHandler}; fn extension_routes() -> Vec<(Method, &'static str, ServoExtensionRoute)> { return vec![ @@ -103,6 +103,7 @@ fn cookie_msg_to_cookie(cookie: cookie::Cookie) -> Cookie { .map(|time| Date(time.to_timespec().sec as u64)), secure: cookie.secure().unwrap_or(false), http_only: cookie.http_only().unwrap_or(false), + same_site: cookie.same_site().map(|s| s.to_string()), } } @@ -112,7 +113,12 @@ pub fn start_server(port: u16, constellation_chan: Sender) { .name("WebDriverHttpServer".to_owned()) .spawn(move || { let address = SocketAddrV4::new("0.0.0.0".parse().unwrap(), port); - match server::start(SocketAddr::V4(address), handler, extension_routes()) { + match server::start( + "localhost".to_owned(), + SocketAddr::V4(address), + handler, + extension_routes(), + ) { Ok(listening) => info!("WebDriver server listening on {}", listening.socket), Err(_) => panic!("Unable to start WebDriver HTTPD server"), } @@ -1780,7 +1786,7 @@ impl WebDriverHandler for Handler { } } - fn delete_session(&mut self, _session: &Option) { + fn teardown_session(&mut self, _session: SessionTeardownKind) { self.session = None; } } diff --git a/servo-tidy.toml b/servo-tidy.toml index e1215e1593e..d793aa4a906 100644 --- a/servo-tidy.toml +++ b/servo-tidy.toml @@ -34,16 +34,15 @@ packages = [ "cfg-if", "cloudabi", "cocoa", + "cookie", "crossbeam-channel", - "crossbeam-deque", - "crossbeam-epoch", "crossbeam-utils", "env_logger", "fixedbitset", "gleam", + "h2", "libloading", "lock_api", - "memoffset", "metal", "miniz_oxide", "num-rational", @@ -52,16 +51,22 @@ packages = [ "petgraph", "ron", "wayland-sys", - "rustc_version", - "semver", - "semver-parser", # https://github.com/servo/servo/issues/26933 "futures", + "mio", "tokio-openssl", "tokio", - "http", + "tokio-macros", + "tokio-util", + "http-body", + "httpdate", + "hyper", "bytes", + "pin-project", + "pin-project-lite", + "pin-project-internal", + "socket2", # https://github.com/servo/servo/pull/23288#issuecomment-494687746 "gl_generator", diff --git a/tests/wpt/metadata-layout-2020/fetch/content-length/parsing.window.js.ini b/tests/wpt/metadata-layout-2020/fetch/content-length/parsing.window.js.ini index e2400d925c3..7b95ee9125b 100644 --- a/tests/wpt/metadata-layout-2020/fetch/content-length/parsing.window.js.ini +++ b/tests/wpt/metadata-layout-2020/fetch/content-length/parsing.window.js.ini @@ -41,16 +41,13 @@ [Content-Length%3A%20] expected: FAIL - [Input: "Content-Length: 42,42". Expected: 42.] - expected: FAIL - [Input: "Content-Length: 42\\r\\nContent-Length: 42,42". Expected: 42.] expected: FAIL - [Input: "Content-Length: 30,30". Expected: 30.] + [Input: "Content-Length: 030, 30". Expected: network error.] expected: FAIL - [Input: "Content-Length: 30\\r\\nContent-Length: 30,30". Expected: 30.] + [Input: "Content-Length: 030,30". Expected: network error.] expected: FAIL [Input: "Content-Length: aaaah\\r\\nContent-Length: aaaah". Expected: 42.] diff --git a/tests/wpt/metadata/cors/credentials-flag.htm.ini b/tests/wpt/metadata/cors/credentials-flag.htm.ini index ff476934a29..e69de29bb2d 100644 --- a/tests/wpt/metadata/cors/credentials-flag.htm.ini +++ b/tests/wpt/metadata/cors/credentials-flag.htm.ini @@ -1,8 +0,0 @@ -[credentials-flag.htm] - type: testharness - [Access-Control-Allow-Credentials: True should be disallowed (async)] - expected: FAIL - - [Access-Control-Allow-Credentials: TRUE should be disallowed (async)] - expected: FAIL - diff --git a/tests/wpt/metadata/fetch/content-length/parsing.window.js.ini b/tests/wpt/metadata/fetch/content-length/parsing.window.js.ini index e2400d925c3..7b95ee9125b 100644 --- a/tests/wpt/metadata/fetch/content-length/parsing.window.js.ini +++ b/tests/wpt/metadata/fetch/content-length/parsing.window.js.ini @@ -41,16 +41,13 @@ [Content-Length%3A%20] expected: FAIL - [Input: "Content-Length: 42,42". Expected: 42.] - expected: FAIL - [Input: "Content-Length: 42\\r\\nContent-Length: 42,42". Expected: 42.] expected: FAIL - [Input: "Content-Length: 30,30". Expected: 30.] + [Input: "Content-Length: 030, 30". Expected: network error.] expected: FAIL - [Input: "Content-Length: 30\\r\\nContent-Length: 30,30". Expected: 30.] + [Input: "Content-Length: 030,30". Expected: network error.] expected: FAIL [Input: "Content-Length: aaaah\\r\\nContent-Length: aaaah". Expected: 42.]