use crate::auth::encode_pairs;
use crate::canonical::CanonicalError;
use crate::config::ResolvedConfig;
use crate::protocol::{Protocol, ProviderCtx, WireRequest};
use crate::registry::Registry;
use crate::transport::TransportResponse;
use super::Host;
pub(super) fn send(
mut wire: WireRequest,
cfg: &ResolvedConfig,
proto: &'static dyn Protocol,
ctx: &ProviderCtx,
host: &Host,
) -> Result<TransportResponse, CanonicalError> {
append_query(&mut wire.url, &cfg.provider.generation_query);
wire.set_header("content-type", proto.content_type());
for (name, value) in ctx.beta_headers {
wire.set_header(name, value);
}
cfg.stamp_transport(&mut wire);
Registry::builtin().auth(cfg.provider.auth).apply(
&mut wire,
ctx,
&cfg.auth_ctx(),
host.store,
host.clock,
host.transport,
)?;
host.transport.send(wire)
}
pub(crate) fn append_query(url: &mut String, query: &[(String, String)]) {
if query.is_empty() {
return;
}
let pairs: Vec<(&str, &str)> = query
.iter()
.map(|(key, value)| (key.as_str(), value.as_str()))
.collect();
let separator = if url.contains('?') {
if url.ends_with('?') || url.ends_with('&') {
""
} else {
"&"
}
} else {
"?"
};
url.push_str(separator);
url.push_str(&encode_pairs(&pairs));
}