in elasticsearch/src/http/transport.rs [497:594]
fn request_builder<B, Q>(
&self,
connection: &Connection,
method: Method,
path: &str,
headers: HeaderMap,
query_string: Option<&Q>,
body: Option<B>,
#[allow(unused_variables)] timeout: Option<Duration>,
) -> Result<reqwest::RequestBuilder, Error>
where
B: Body,
Q: Serialize + ?Sized,
{
let reqwest_method = self.method(method);
let url = connection.url.join(path.trim_start_matches('/'))?;
let mut request_builder = self.client.request(reqwest_method, url);
#[cfg(not(target_arch = "wasm32"))]
if let Some(t) = timeout {
request_builder = request_builder.timeout(t);
}
// set credentials before any headers, as credentials append to existing headers in reqwest,
// whilst setting headers() overwrites, so if an Authorization header has been specified
// on a specific request, we want it to overwrite.
let creds_guard = self.credentials.read();
if let Some(c) = creds_guard.as_ref() {
request_builder = match c {
Credentials::Basic(u, p) => request_builder.basic_auth(u, Some(p)),
Credentials::Bearer(t) => request_builder.bearer_auth(t),
#[cfg(any(feature = "native-tls", feature = "rustls-tls"))]
Credentials::Certificate(_) => request_builder,
Credentials::ApiKey(i, k) => {
let mut header_value = b"ApiKey ".to_vec();
{
let mut encoder = EncoderWriter::new(&mut header_value, &BASE64_STANDARD);
write!(encoder, "{}:", i).unwrap();
write!(encoder, "{}", k).unwrap();
}
let mut header_value = HeaderValue::from_bytes(&header_value).unwrap();
header_value.set_sensitive(true);
request_builder.header(AUTHORIZATION, header_value)
}
Credentials::EncodedApiKey(k) => {
let mut header_value = HeaderValue::try_from(format!("ApiKey {}", k)).unwrap();
header_value.set_sensitive(true);
request_builder.header(AUTHORIZATION, header_value)
}
}
}
drop(creds_guard);
// default headers first, overwrite with any provided
let mut request_headers = HeaderMap::with_capacity(4 + headers.len());
request_headers.insert(CONTENT_TYPE, HeaderValue::from_static(DEFAULT_CONTENT_TYPE));
request_headers.insert(ACCEPT, HeaderValue::from_static(DEFAULT_ACCEPT));
request_headers.insert(USER_AGENT, HeaderValue::from_static(DEFAULT_USER_AGENT));
for (name, value) in headers {
request_headers.insert(name.unwrap(), value);
}
// if meta header enabled, send it last so that it's not overridden.
if self.send_meta {
request_headers.insert(
"x-elastic-client-meta",
HeaderValue::from_static(CLIENT_META.as_str()),
);
}
request_builder = request_builder.headers(request_headers);
if let Some(b) = body {
let bytes = if let Some(bytes) = b.bytes() {
bytes
} else {
let mut bytes_mut = self.bytes_mut();
b.write(&mut bytes_mut)?;
bytes_mut.split().freeze()
};
match self.request_body_compression {
true => {
let mut encoder = GzEncoder::new(Vec::new(), Compression::default());
encoder.write_all(&bytes)?;
request_builder = request_builder.body(encoder.finish()?);
request_builder = request_builder.header(CONTENT_ENCODING, "gzip");
}
false => {
request_builder = request_builder.body(bytes);
}
}
};
if let Some(q) = query_string {
request_builder = request_builder.query(q);
}
Ok(request_builder)
}