Make headers method on WASM client for compatibility with async_impl (#991)

The replace_headers method had to be moved since the async_impl module
is not compiled while compiling to wasm. This caused the replace_headers
method to be unavailable. fast_random had to be excluded from the wasm
build to prevent dead code warnings in the wasm target.
This commit is contained in:
Jason van den Hurk
2020-08-07 00:07:43 +02:00
committed by GitHub
parent 77d7e452e1
commit 83fa93ccaf
5 changed files with 44 additions and 30 deletions

View File

@@ -1,4 +1,7 @@
use crate::header::HeaderMap;
// xor-shift
#[cfg(not(target_arch = "wasm32"))]
pub(crate) fn fast_random() -> u64 {
use std::cell::Cell;
use std::collections::hash_map::RandomState;
@@ -33,3 +36,30 @@ pub(crate) fn fast_random() -> u64 {
n.0.wrapping_mul(0x2545_f491_4f6c_dd1d)
})
}
pub(crate) fn replace_headers(dst: &mut HeaderMap, src: HeaderMap) {
// IntoIter of HeaderMap yields (Option<HeaderName>, HeaderValue).
// The first time a name is yielded, it will be Some(name), and if
// there are more values with the same name, the next yield will be
// None.
//
// TODO: a complex exercise would be to optimize this to only
// require 1 hash/lookup of the key, but doing something fancy
// with header::Entry...
let mut prev_name = None;
for (key, value) in src {
match key {
Some(key) => {
dst.insert(key.clone(), value);
prev_name = Some(key);
}
None => match prev_name {
Some(ref key) => {
dst.append(key.clone(), value);
}
None => unreachable!("HeaderMap::into_iter yielded None first"),
},
}
}
}