Add connection_verbose setting to log IO events (#774)

This commit is contained in:
Sean McArthur
2020-01-09 13:42:01 -08:00
committed by GitHub
parent 20d50daa8b
commit 50c33a932e
6 changed files with 209 additions and 54 deletions

View File

@@ -64,6 +64,7 @@ struct Config {
#[cfg(feature = "__tls")]
certs_verification: bool,
connect_timeout: Option<Duration>,
connection_verbose: bool,
max_idle_per_host: usize,
#[cfg(feature = "__tls")]
identity: Option<Identity>,
@@ -111,6 +112,7 @@ impl ClientBuilder {
#[cfg(feature = "__tls")]
certs_verification: true,
connect_timeout: None,
connection_verbose: false,
max_idle_per_host: std::usize::MAX,
proxies: Vec::new(),
auto_sys_proxy: true,
@@ -234,6 +236,7 @@ impl ClientBuilder {
};
connector.set_timeout(config.connect_timeout);
connector.set_verbose(config.connection_verbose);
let mut builder = hyper::Client::builder();
if config.http2_only {
@@ -489,6 +492,17 @@ impl ClientBuilder {
self
}
/// Set whether connections should emit verbose logs.
///
/// Enabling this option will emit [log][] messages at the `TRACE` level
/// for read and write operations on connections.
///
/// [log]: https://crates.io/crates/log
pub fn connection_verbose(mut self, verbose: bool) -> ClientBuilder {
self.config.connection_verbose = verbose;
self
}
// HTTP options
/// Sets the maximum idle connection per host allowed in the pool.

View File

@@ -487,6 +487,8 @@ impl PercentEncoding {
}
fn gen_boundary() -> String {
use crate::util::fast_random as random;
let a = random();
let b = random();
let c = random();
@@ -495,42 +497,6 @@ fn gen_boundary() -> String {
format!("{:016x}-{:016x}-{:016x}-{:016x}", a, b, c, d)
}
// xor-shift
fn random() -> u64 {
use std::cell::Cell;
use std::collections::hash_map::RandomState;
use std::hash::{BuildHasher, Hasher};
use std::num::Wrapping;
thread_local! {
static RNG: Cell<Wrapping<u64>> = Cell::new(Wrapping(seed()));
}
fn seed() -> u64 {
let seed = RandomState::new();
let mut out = 0;
let mut cnt = 0;
while out == 0 {
cnt += 1;
let mut hasher = seed.build_hasher();
hasher.write_usize(cnt);
out = hasher.finish();
}
out
}
RNG.with(|rng| {
let mut n = rng.get();
debug_assert_ne!(n.0, 0);
n ^= n >> 12;
n ^= n << 25;
n ^= n >> 27;
rng.set(n);
n.0.wrapping_mul(0x2545_f491_4f6c_dd1d)
})
}
#[cfg(test)]
mod tests {
use super::*;