Upgrade dev-dependencies
This commit is contained in:
committed by
Sean McArthur
parent
47e9f62fb5
commit
4c31a320be
16
Cargo.toml
16
Cargo.toml
@@ -55,22 +55,20 @@ indexmap = { version = "1.5.2", features = ["std"] }
|
|||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
|
||||||
# Fuzzing
|
# Fuzzing
|
||||||
quickcheck = { version = "0.4.1", default-features = false }
|
quickcheck = { version = "1.0.3", default-features = false }
|
||||||
rand = "0.3.15"
|
rand = "0.8.4"
|
||||||
|
|
||||||
# HPACK fixtures
|
# HPACK fixtures
|
||||||
hex = "0.2.0"
|
hex = "0.4.3"
|
||||||
walkdir = "1.0.0"
|
walkdir = "2.3.2"
|
||||||
serde = "1.0.0"
|
serde = "1.0.0"
|
||||||
serde_json = "1.0.0"
|
serde_json = "1.0.0"
|
||||||
|
|
||||||
# Examples
|
# Examples
|
||||||
tokio = { version = "1", features = ["rt-multi-thread", "macros", "sync", "net"] }
|
tokio = { version = "1", features = ["rt-multi-thread", "macros", "sync", "net"] }
|
||||||
env_logger = { version = "0.5.3", default-features = false }
|
env_logger = { version = "0.9", default-features = false }
|
||||||
rustls = "0.19"
|
tokio-rustls = "0.23.2"
|
||||||
tokio-rustls = "0.22"
|
webpki-roots = "0.22.2"
|
||||||
webpki = "0.21"
|
|
||||||
webpki-roots = "0.21"
|
|
||||||
|
|
||||||
[package.metadata.docs.rs]
|
[package.metadata.docs.rs]
|
||||||
features = ["stream"]
|
features = ["stream"]
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ use http::{Method, Request};
|
|||||||
use tokio::net::TcpStream;
|
use tokio::net::TcpStream;
|
||||||
use tokio_rustls::TlsConnector;
|
use tokio_rustls::TlsConnector;
|
||||||
|
|
||||||
use rustls::Session;
|
use tokio_rustls::rustls::{OwnedTrustAnchor, RootCertStore, ServerName};
|
||||||
use webpki::DNSNameRef;
|
|
||||||
|
|
||||||
|
use std::convert::TryFrom;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::net::ToSocketAddrs;
|
use std::net::ToSocketAddrs;
|
||||||
|
|
||||||
@@ -16,9 +16,19 @@ pub async fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
let _ = env_logger::try_init();
|
let _ = env_logger::try_init();
|
||||||
|
|
||||||
let tls_client_config = std::sync::Arc::new({
|
let tls_client_config = std::sync::Arc::new({
|
||||||
let mut c = rustls::ClientConfig::new();
|
let mut root_store = RootCertStore::empty();
|
||||||
c.root_store
|
root_store.add_server_trust_anchors(webpki_roots::TLS_SERVER_ROOTS.0.iter().map(|ta| {
|
||||||
.add_server_trust_anchors(&webpki_roots::TLS_SERVER_ROOTS);
|
OwnedTrustAnchor::from_subject_spki_name_constraints(
|
||||||
|
ta.subject,
|
||||||
|
ta.spki,
|
||||||
|
ta.name_constraints,
|
||||||
|
)
|
||||||
|
}));
|
||||||
|
|
||||||
|
let mut c = tokio_rustls::rustls::ClientConfig::builder()
|
||||||
|
.with_safe_defaults()
|
||||||
|
.with_root_certificates(root_store)
|
||||||
|
.with_no_client_auth();
|
||||||
c.alpn_protocols.push(ALPN_H2.as_bytes().to_owned());
|
c.alpn_protocols.push(ALPN_H2.as_bytes().to_owned());
|
||||||
c
|
c
|
||||||
});
|
});
|
||||||
@@ -33,13 +43,13 @@ pub async fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
println!("ADDR: {:?}", addr);
|
println!("ADDR: {:?}", addr);
|
||||||
|
|
||||||
let tcp = TcpStream::connect(&addr).await?;
|
let tcp = TcpStream::connect(&addr).await?;
|
||||||
let dns_name = DNSNameRef::try_from_ascii_str("http2.akamai.com").unwrap();
|
let dns_name = ServerName::try_from("http2.akamai.com").unwrap();
|
||||||
let connector = TlsConnector::from(tls_client_config);
|
let connector = TlsConnector::from(tls_client_config);
|
||||||
let res = connector.connect(dns_name, tcp).await;
|
let res = connector.connect(dns_name, tcp).await;
|
||||||
let tls = res.unwrap();
|
let tls = res.unwrap();
|
||||||
{
|
{
|
||||||
let (_, session) = tls.get_ref();
|
let (_, session) = tls.get_ref();
|
||||||
let negotiated_protocol = session.get_alpn_protocol();
|
let negotiated_protocol = session.alpn_protocol();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
Some(ALPN_H2.as_bytes()),
|
Some(ALPN_H2.as_bytes()),
|
||||||
negotiated_protocol.as_ref().map(|x| &**x)
|
negotiated_protocol.as_ref().map(|x| &**x)
|
||||||
|
|||||||
@@ -13,12 +13,10 @@ cargo-fuzz = true
|
|||||||
arbitrary = { version = "1", features = ["derive"] }
|
arbitrary = { version = "1", features = ["derive"] }
|
||||||
libfuzzer-sys = { version = "0.4.0", features = ["arbitrary-derive"] }
|
libfuzzer-sys = { version = "0.4.0", features = ["arbitrary-derive"] }
|
||||||
tokio = { version = "1", features = [ "full" ] }
|
tokio = { version = "1", features = [ "full" ] }
|
||||||
bytes = "0.5.2"
|
|
||||||
h2 = { path = "../", features = [ "unstable" ] }
|
h2 = { path = "../", features = [ "unstable" ] }
|
||||||
h2-support = { path = "../tests/h2-support" }
|
h2-support = { path = "../tests/h2-support" }
|
||||||
futures = { version = "0.3", default-features = false, features = ["std"] }
|
futures = { version = "0.3", default-features = false, features = ["std"] }
|
||||||
http = "0.2"
|
http = "0.2"
|
||||||
env_logger = { version = "0.5.3", default-features = false }
|
|
||||||
|
|
||||||
# Prevent this from interfering with workspaces
|
# Prevent this from interfering with workspaces
|
||||||
[workspace]
|
[workspace]
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#[cfg(fuzzing)]
|
#[cfg(fuzzing)]
|
||||||
pub mod fuzz_logic {
|
pub mod fuzz_logic {
|
||||||
use crate::hpack;
|
use crate::hpack;
|
||||||
use bytes::{BufMut, BytesMut};
|
use bytes::BytesMut;
|
||||||
use http::header::HeaderName;
|
use http::header::HeaderName;
|
||||||
use std::io::Cursor;
|
use std::io::Cursor;
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,9 @@ use http::header::{HeaderName, HeaderValue};
|
|||||||
|
|
||||||
use bytes::BytesMut;
|
use bytes::BytesMut;
|
||||||
use quickcheck::{Arbitrary, Gen, QuickCheck, TestResult};
|
use quickcheck::{Arbitrary, Gen, QuickCheck, TestResult};
|
||||||
use rand::{Rng, SeedableRng, StdRng};
|
use rand::distributions::Slice;
|
||||||
|
use rand::rngs::StdRng;
|
||||||
|
use rand::{thread_rng, Rng, SeedableRng};
|
||||||
|
|
||||||
use std::io::Cursor;
|
use std::io::Cursor;
|
||||||
|
|
||||||
@@ -46,9 +48,9 @@ struct HeaderFrame {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl FuzzHpack {
|
impl FuzzHpack {
|
||||||
fn new(seed: [usize; 4]) -> FuzzHpack {
|
fn new(seed: [u8; 32]) -> FuzzHpack {
|
||||||
// Seed the RNG
|
// Seed the RNG
|
||||||
let mut rng = StdRng::from_seed(&seed);
|
let mut rng = StdRng::from_seed(seed);
|
||||||
|
|
||||||
// Generates a bunch of source headers
|
// Generates a bunch of source headers
|
||||||
let mut source: Vec<Header<Option<HeaderName>>> = vec![];
|
let mut source: Vec<Header<Option<HeaderName>>> = vec![];
|
||||||
@@ -58,12 +60,12 @@ impl FuzzHpack {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Actual test run headers
|
// Actual test run headers
|
||||||
let num: usize = rng.gen_range(40, 500);
|
let num: usize = rng.gen_range(40..500);
|
||||||
|
|
||||||
let mut frames: Vec<HeaderFrame> = vec![];
|
let mut frames: Vec<HeaderFrame> = vec![];
|
||||||
let mut added = 0;
|
let mut added = 0;
|
||||||
|
|
||||||
let skew: i32 = rng.gen_range(1, 5);
|
let skew: i32 = rng.gen_range(1..5);
|
||||||
|
|
||||||
// Rough number of headers to add
|
// Rough number of headers to add
|
||||||
while added < num {
|
while added < num {
|
||||||
@@ -72,24 +74,24 @@ impl FuzzHpack {
|
|||||||
headers: vec![],
|
headers: vec![],
|
||||||
};
|
};
|
||||||
|
|
||||||
match rng.gen_range(0, 20) {
|
match rng.gen_range(0..20) {
|
||||||
0 => {
|
0 => {
|
||||||
// Two resizes
|
// Two resizes
|
||||||
let high = rng.gen_range(128, MAX_CHUNK * 2);
|
let high = rng.gen_range(128..MAX_CHUNK * 2);
|
||||||
let low = rng.gen_range(0, high);
|
let low = rng.gen_range(0..high);
|
||||||
|
|
||||||
frame.resizes.extend(&[low, high]);
|
frame.resizes.extend(&[low, high]);
|
||||||
}
|
}
|
||||||
1..=3 => {
|
1..=3 => {
|
||||||
frame.resizes.push(rng.gen_range(128, MAX_CHUNK * 2));
|
frame.resizes.push(rng.gen_range(128..MAX_CHUNK * 2));
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut is_name_required = true;
|
let mut is_name_required = true;
|
||||||
|
|
||||||
for _ in 0..rng.gen_range(1, (num - added) + 1) {
|
for _ in 0..rng.gen_range(1..(num - added) + 1) {
|
||||||
let x: f64 = rng.gen_range(0.0, 1.0);
|
let x: f64 = rng.gen_range(0.0..1.0);
|
||||||
let x = x.powi(skew);
|
let x = x.powi(skew);
|
||||||
|
|
||||||
let i = (x * source.len() as f64) as usize;
|
let i = (x * source.len() as f64) as usize;
|
||||||
@@ -177,31 +179,31 @@ impl FuzzHpack {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Arbitrary for FuzzHpack {
|
impl Arbitrary for FuzzHpack {
|
||||||
fn arbitrary<G: Gen>(g: &mut G) -> Self {
|
fn arbitrary(_: &mut Gen) -> Self {
|
||||||
FuzzHpack::new(quickcheck::Rng::gen(g))
|
FuzzHpack::new(thread_rng().gen())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn gen_header(g: &mut StdRng) -> Header<Option<HeaderName>> {
|
fn gen_header(g: &mut StdRng) -> Header<Option<HeaderName>> {
|
||||||
use http::{Method, StatusCode};
|
use http::{Method, StatusCode};
|
||||||
|
|
||||||
if g.gen_weighted_bool(10) {
|
if g.gen_ratio(1, 10) {
|
||||||
match g.next_u32() % 5 {
|
match g.gen_range(0u32..5) {
|
||||||
0 => {
|
0 => {
|
||||||
let value = gen_string(g, 4, 20);
|
let value = gen_string(g, 4, 20);
|
||||||
Header::Authority(to_shared(value))
|
Header::Authority(to_shared(value))
|
||||||
}
|
}
|
||||||
1 => {
|
1 => {
|
||||||
let method = match g.next_u32() % 6 {
|
let method = match g.gen_range(0u32..6) {
|
||||||
0 => Method::GET,
|
0 => Method::GET,
|
||||||
1 => Method::POST,
|
1 => Method::POST,
|
||||||
2 => Method::PUT,
|
2 => Method::PUT,
|
||||||
3 => Method::PATCH,
|
3 => Method::PATCH,
|
||||||
4 => Method::DELETE,
|
4 => Method::DELETE,
|
||||||
5 => {
|
5 => {
|
||||||
let n: usize = g.gen_range(3, 7);
|
let n: usize = g.gen_range(3..7);
|
||||||
let bytes: Vec<u8> = (0..n)
|
let bytes: Vec<u8> = (0..n)
|
||||||
.map(|_| g.choose(b"ABCDEFGHIJKLMNOPQRSTUVWXYZ").unwrap().clone())
|
.map(|_| *g.sample(Slice::new(b"ABCDEFGHIJKLMNOPQRSTUVWXYZ").unwrap()))
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
Method::from_bytes(&bytes).unwrap()
|
Method::from_bytes(&bytes).unwrap()
|
||||||
@@ -212,7 +214,7 @@ fn gen_header(g: &mut StdRng) -> Header<Option<HeaderName>> {
|
|||||||
Header::Method(method)
|
Header::Method(method)
|
||||||
}
|
}
|
||||||
2 => {
|
2 => {
|
||||||
let value = match g.next_u32() % 2 {
|
let value = match g.gen_range(0u32..2) {
|
||||||
0 => "http",
|
0 => "http",
|
||||||
1 => "https",
|
1 => "https",
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
@@ -221,7 +223,7 @@ fn gen_header(g: &mut StdRng) -> Header<Option<HeaderName>> {
|
|||||||
Header::Scheme(to_shared(value.to_string()))
|
Header::Scheme(to_shared(value.to_string()))
|
||||||
}
|
}
|
||||||
3 => {
|
3 => {
|
||||||
let value = match g.next_u32() % 100 {
|
let value = match g.gen_range(0u32..100) {
|
||||||
0 => "/".to_string(),
|
0 => "/".to_string(),
|
||||||
1 => "/index.html".to_string(),
|
1 => "/index.html".to_string(),
|
||||||
_ => gen_string(g, 2, 20),
|
_ => gen_string(g, 2, 20),
|
||||||
@@ -237,14 +239,14 @@ fn gen_header(g: &mut StdRng) -> Header<Option<HeaderName>> {
|
|||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let name = if g.gen_weighted_bool(10) {
|
let name = if g.gen_ratio(1, 10) {
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
Some(gen_header_name(g))
|
Some(gen_header_name(g))
|
||||||
};
|
};
|
||||||
let mut value = gen_header_value(g);
|
let mut value = gen_header_value(g);
|
||||||
|
|
||||||
if g.gen_weighted_bool(30) {
|
if g.gen_ratio(1, 30) {
|
||||||
value.set_sensitive(true);
|
value.set_sensitive(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -255,84 +257,86 @@ fn gen_header(g: &mut StdRng) -> Header<Option<HeaderName>> {
|
|||||||
fn gen_header_name(g: &mut StdRng) -> HeaderName {
|
fn gen_header_name(g: &mut StdRng) -> HeaderName {
|
||||||
use http::header;
|
use http::header;
|
||||||
|
|
||||||
if g.gen_weighted_bool(2) {
|
if g.gen_ratio(1, 2) {
|
||||||
g.choose(&[
|
g.sample(
|
||||||
header::ACCEPT,
|
Slice::new(&[
|
||||||
header::ACCEPT_CHARSET,
|
header::ACCEPT,
|
||||||
header::ACCEPT_ENCODING,
|
header::ACCEPT_CHARSET,
|
||||||
header::ACCEPT_LANGUAGE,
|
header::ACCEPT_ENCODING,
|
||||||
header::ACCEPT_RANGES,
|
header::ACCEPT_LANGUAGE,
|
||||||
header::ACCESS_CONTROL_ALLOW_CREDENTIALS,
|
header::ACCEPT_RANGES,
|
||||||
header::ACCESS_CONTROL_ALLOW_HEADERS,
|
header::ACCESS_CONTROL_ALLOW_CREDENTIALS,
|
||||||
header::ACCESS_CONTROL_ALLOW_METHODS,
|
header::ACCESS_CONTROL_ALLOW_HEADERS,
|
||||||
header::ACCESS_CONTROL_ALLOW_ORIGIN,
|
header::ACCESS_CONTROL_ALLOW_METHODS,
|
||||||
header::ACCESS_CONTROL_EXPOSE_HEADERS,
|
header::ACCESS_CONTROL_ALLOW_ORIGIN,
|
||||||
header::ACCESS_CONTROL_MAX_AGE,
|
header::ACCESS_CONTROL_EXPOSE_HEADERS,
|
||||||
header::ACCESS_CONTROL_REQUEST_HEADERS,
|
header::ACCESS_CONTROL_MAX_AGE,
|
||||||
header::ACCESS_CONTROL_REQUEST_METHOD,
|
header::ACCESS_CONTROL_REQUEST_HEADERS,
|
||||||
header::AGE,
|
header::ACCESS_CONTROL_REQUEST_METHOD,
|
||||||
header::ALLOW,
|
header::AGE,
|
||||||
header::ALT_SVC,
|
header::ALLOW,
|
||||||
header::AUTHORIZATION,
|
header::ALT_SVC,
|
||||||
header::CACHE_CONTROL,
|
header::AUTHORIZATION,
|
||||||
header::CONNECTION,
|
header::CACHE_CONTROL,
|
||||||
header::CONTENT_DISPOSITION,
|
header::CONNECTION,
|
||||||
header::CONTENT_ENCODING,
|
header::CONTENT_DISPOSITION,
|
||||||
header::CONTENT_LANGUAGE,
|
header::CONTENT_ENCODING,
|
||||||
header::CONTENT_LENGTH,
|
header::CONTENT_LANGUAGE,
|
||||||
header::CONTENT_LOCATION,
|
header::CONTENT_LENGTH,
|
||||||
header::CONTENT_RANGE,
|
header::CONTENT_LOCATION,
|
||||||
header::CONTENT_SECURITY_POLICY,
|
header::CONTENT_RANGE,
|
||||||
header::CONTENT_SECURITY_POLICY_REPORT_ONLY,
|
header::CONTENT_SECURITY_POLICY,
|
||||||
header::CONTENT_TYPE,
|
header::CONTENT_SECURITY_POLICY_REPORT_ONLY,
|
||||||
header::COOKIE,
|
header::CONTENT_TYPE,
|
||||||
header::DNT,
|
header::COOKIE,
|
||||||
header::DATE,
|
header::DNT,
|
||||||
header::ETAG,
|
header::DATE,
|
||||||
header::EXPECT,
|
header::ETAG,
|
||||||
header::EXPIRES,
|
header::EXPECT,
|
||||||
header::FORWARDED,
|
header::EXPIRES,
|
||||||
header::FROM,
|
header::FORWARDED,
|
||||||
header::HOST,
|
header::FROM,
|
||||||
header::IF_MATCH,
|
header::HOST,
|
||||||
header::IF_MODIFIED_SINCE,
|
header::IF_MATCH,
|
||||||
header::IF_NONE_MATCH,
|
header::IF_MODIFIED_SINCE,
|
||||||
header::IF_RANGE,
|
header::IF_NONE_MATCH,
|
||||||
header::IF_UNMODIFIED_SINCE,
|
header::IF_RANGE,
|
||||||
header::LAST_MODIFIED,
|
header::IF_UNMODIFIED_SINCE,
|
||||||
header::LINK,
|
header::LAST_MODIFIED,
|
||||||
header::LOCATION,
|
header::LINK,
|
||||||
header::MAX_FORWARDS,
|
header::LOCATION,
|
||||||
header::ORIGIN,
|
header::MAX_FORWARDS,
|
||||||
header::PRAGMA,
|
header::ORIGIN,
|
||||||
header::PROXY_AUTHENTICATE,
|
header::PRAGMA,
|
||||||
header::PROXY_AUTHORIZATION,
|
header::PROXY_AUTHENTICATE,
|
||||||
header::PUBLIC_KEY_PINS,
|
header::PROXY_AUTHORIZATION,
|
||||||
header::PUBLIC_KEY_PINS_REPORT_ONLY,
|
header::PUBLIC_KEY_PINS,
|
||||||
header::RANGE,
|
header::PUBLIC_KEY_PINS_REPORT_ONLY,
|
||||||
header::REFERER,
|
header::RANGE,
|
||||||
header::REFERRER_POLICY,
|
header::REFERER,
|
||||||
header::REFRESH,
|
header::REFERRER_POLICY,
|
||||||
header::RETRY_AFTER,
|
header::REFRESH,
|
||||||
header::SERVER,
|
header::RETRY_AFTER,
|
||||||
header::SET_COOKIE,
|
header::SERVER,
|
||||||
header::STRICT_TRANSPORT_SECURITY,
|
header::SET_COOKIE,
|
||||||
header::TE,
|
header::STRICT_TRANSPORT_SECURITY,
|
||||||
header::TRAILER,
|
header::TE,
|
||||||
header::TRANSFER_ENCODING,
|
header::TRAILER,
|
||||||
header::USER_AGENT,
|
header::TRANSFER_ENCODING,
|
||||||
header::UPGRADE,
|
header::USER_AGENT,
|
||||||
header::UPGRADE_INSECURE_REQUESTS,
|
header::UPGRADE,
|
||||||
header::VARY,
|
header::UPGRADE_INSECURE_REQUESTS,
|
||||||
header::VIA,
|
header::VARY,
|
||||||
header::WARNING,
|
header::VIA,
|
||||||
header::WWW_AUTHENTICATE,
|
header::WARNING,
|
||||||
header::X_CONTENT_TYPE_OPTIONS,
|
header::WWW_AUTHENTICATE,
|
||||||
header::X_DNS_PREFETCH_CONTROL,
|
header::X_CONTENT_TYPE_OPTIONS,
|
||||||
header::X_FRAME_OPTIONS,
|
header::X_DNS_PREFETCH_CONTROL,
|
||||||
header::X_XSS_PROTECTION,
|
header::X_FRAME_OPTIONS,
|
||||||
])
|
header::X_XSS_PROTECTION,
|
||||||
.unwrap()
|
])
|
||||||
|
.unwrap(),
|
||||||
|
)
|
||||||
.clone()
|
.clone()
|
||||||
} else {
|
} else {
|
||||||
let value = gen_string(g, 1, 25);
|
let value = gen_string(g, 1, 25);
|
||||||
@@ -349,9 +353,7 @@ fn gen_string(g: &mut StdRng, min: usize, max: usize) -> String {
|
|||||||
let bytes: Vec<_> = (min..max)
|
let bytes: Vec<_> = (min..max)
|
||||||
.map(|_| {
|
.map(|_| {
|
||||||
// Chars to pick from
|
// Chars to pick from
|
||||||
g.choose(b"ABCDEFGHIJKLMNOPQRSTUVabcdefghilpqrstuvwxyz----")
|
*g.sample(Slice::new(b"ABCDEFGHIJKLMNOPQRSTUVabcdefghilpqrstuvwxyz----").unwrap())
|
||||||
.unwrap()
|
|
||||||
.clone()
|
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ edition = "2018"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
h2 = { path = "../.." }
|
h2 = { path = "../.." }
|
||||||
|
|
||||||
env_logger = { version = "0.5.3", default-features = false }
|
env_logger = { version = "0.9", default-features = false }
|
||||||
futures = { version = "0.3", default-features = false, features = ["std"] }
|
futures = { version = "0.3", default-features = false, features = ["std"] }
|
||||||
honggfuzz = "0.5"
|
honggfuzz = "0.5"
|
||||||
http = "0.2"
|
http = "0.2"
|
||||||
|
|||||||
@@ -6,4 +6,4 @@ publish = false
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
walkdir = "1.0.0"
|
walkdir = "2.3.2"
|
||||||
|
|||||||
Reference in New Issue
Block a user