Upgrade dev-dependencies

This commit is contained in:
Dirkjan Ochtman
2022-02-11 10:22:53 +01:00
committed by Sean McArthur
parent 47e9f62fb5
commit 4c31a320be
7 changed files with 132 additions and 124 deletions

View File

@@ -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"]

View File

@@ -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)

View File

@@ -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]

View File

@@ -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;

View File

@@ -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,8 +257,9 @@ 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(
Slice::new(&[
header::ACCEPT, header::ACCEPT,
header::ACCEPT_CHARSET, header::ACCEPT_CHARSET,
header::ACCEPT_ENCODING, header::ACCEPT_ENCODING,
@@ -332,7 +335,8 @@ fn gen_header_name(g: &mut StdRng) -> HeaderName {
header::X_FRAME_OPTIONS, header::X_FRAME_OPTIONS,
header::X_XSS_PROTECTION, 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();

View File

@@ -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"

View File

@@ -6,4 +6,4 @@ publish = false
edition = "2018" edition = "2018"
[dependencies] [dependencies]
walkdir = "1.0.0" walkdir = "2.3.2"