use bytesbuf::mem::GlobalPool;
use http_extensions::{HttpBodyBuilder, HttpRequest, HttpRequestBuilderExt, HttpResponse, HttpResponseBuilder, StatusExt};
use layered::Service;
use tick::Clock;
#[tokio::main]
async fn main() -> Result<(), ohno::AppError> {
let client = CustomClient::default();
let response = client
.request_builder()
.get("http://localhost:8080")
.text("Hello!")
.fetch_text()
.await?
.ensure_success()?;
println!("response received, status {}, body: {}", response.status(), response.body());
Ok(())
}
#[derive(Debug)]
struct CustomClient {
builder: HttpBodyBuilder,
}
impl AsRef<HttpBodyBuilder> for CustomClient {
fn as_ref(&self) -> &HttpBodyBuilder {
&self.builder
}
}
impl Default for CustomClient {
fn default() -> Self {
Self {
builder: HttpBodyBuilder::new(GlobalPool::new(), &Clock::new_tokio()),
}
}
}
impl Service<HttpRequest> for CustomClient {
type Out = http_extensions::Result<HttpResponse>;
async fn execute(&self, input: HttpRequest) -> Self::Out {
let data = input.into_body().into_bytes().await?;
HttpResponseBuilder::new(&self.builder).status(200).bytes(data).build()
}
}