use crate::{transport::HTTPTransport, Request};
pub trait IntoBody<T: HTTPTransport> {
fn into(self, request: Request<T>) -> (Request<T>, Vec<u8>);
}
impl<T: HTTPTransport> IntoBody<T> for Vec<u8> {
fn into(self, request: Request<T>) -> (Request<T>, Vec<u8>) {
let request = if request.header("Content-Length").is_some() {
request
} else {
request.set_header("Content-Length", self.len().to_string())
};
(request, self)
}
}
impl<T: HTTPTransport> IntoBody<T> for &[u8] {
fn into(self, request: Request<T>) -> (Request<T>, Vec<u8>) {
let body: Vec<u8> = self.to_owned();
let request = if request.header("Content-Length").is_some() {
request
} else {
request.set_header("Content-Length", body.len().to_string())
};
(request, body)
}
}
impl<T: HTTPTransport> IntoBody<T> for String {
fn into(self, request: Request<T>) -> (Request<T>, Vec<u8>) {
let body: Vec<u8> = self.into_bytes();
let request = if request.header("Content-Length").is_some() {
request
} else {
request.set_header("Content-Length", body.len().to_string())
};
(request, body)
}
}
impl<T: HTTPTransport> IntoBody<T> for &str {
fn into(self, request: Request<T>) -> (Request<T>, Vec<u8>) {
let body: Vec<u8> = self.to_owned().into_bytes();
let request = if request.header("Content-Length").is_some() {
request
} else {
request.set_header("Content-Length", body.len().to_string())
};
(request, body)
}
}
impl<T: HTTPTransport> IntoBody<T> for &[(&str, &str)] {
fn into(self, request: Request<T>) -> (Request<T>, Vec<u8>) {
let encoded = form_urlencoded::Serializer::new(String::new()).extend_pairs(self).finish();
let body: Vec<u8> = encoded.into_bytes();
let request = if request.header("Content-Type").is_some() {
request
} else {
request.set_header("Content-Type", "application/x-www-form-urlencoded")
};
let request = if request.header("Content-Length").is_some() {
request
} else {
request.set_header("Content-Length", body.len().to_string())
};
(request, body)
}
}
#[cfg(feature = "json")]
impl<T: HTTPTransport> IntoBody<T> for serde_json::Value {
fn into(self, request: Request<T>) -> (Request<T>, Vec<u8>) {
let body: Vec<u8> = self.to_string().into_bytes();
let request = if request.header("Content-Type").is_some() {
request
} else {
request.set_header("Content-Type", "application/json")
};
let request = if request.header("Content-Length").is_some() {
request
} else {
request.set_header("Content-Length", body.len().to_string())
};
(request, body)
}
}