http-signature-normalization/actix/examples/client.rs

84 lines
2.3 KiB
Rust
Raw Normal View History

2022-02-26 17:49:35 +00:00
use actix_rt::task::JoinError;
2021-03-10 02:04:56 +00:00
use awc::Client;
2024-04-15 01:23:46 +00:00
use base64::{engine::general_purpose::STANDARD, Engine};
2023-08-04 23:01:41 +00:00
use http_signature_normalization_actix::{digest::ring::Sha256, prelude::*, Canceled};
2021-09-18 01:04:04 +00:00
use tracing::{error, info};
use tracing_error::ErrorLayer;
use tracing_subscriber::{layer::SubscriberExt, EnvFilter};
2019-09-11 23:06:36 +00:00
async fn request(config: Config) -> Result<(), Box<dyn std::error::Error>> {
2020-03-30 05:53:45 +00:00
let digest = Sha256::new();
let mut response = Client::default()
.post("http://127.0.0.1:8010/")
2021-02-10 21:45:51 +00:00
.append_header(("User-Agent", "Actix Web"))
.append_header(("Accept", "text/plain"))
2020-03-30 05:53:45 +00:00
.signature_with_digest(config, "my-key-id", digest, "Hewwo-owo", |s| {
2021-09-18 01:04:04 +00:00
info!("Signing String\n{}", s);
2024-04-15 01:23:46 +00:00
Ok(STANDARD.encode(s)) as Result<_, MyError>
2020-03-30 05:53:45 +00:00
})
.await?
.send()
.await
.map_err(|e| {
2021-09-18 01:04:04 +00:00
error!("Error, {}", e);
MyError::SendRequest
})?;
let body = response.body().await.map_err(|e| {
2021-09-18 01:04:04 +00:00
error!("Error, {}", e);
MyError::Body
})?;
2021-09-18 01:04:04 +00:00
info!("{:?}", body);
Ok(())
2019-09-11 23:06:36 +00:00
}
#[actix_rt::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
2021-09-18 01:04:04 +00:00
let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"));
let subscriber = tracing_subscriber::Registry::default()
.with(env_filter)
.with(ErrorLayer::default())
.with(tracing_subscriber::fmt::layer());
tracing::subscriber::set_global_default(subscriber)?;
let config = Config::new().require_header("accept").require_digest();
request(config.clone()).await?;
request(config.mastodon_compat()).await?;
Ok(())
}
#[derive(Debug, thiserror::Error)]
2019-09-11 23:06:36 +00:00
pub enum MyError {
#[error("Failed to create signing string, {0}")]
Convert(#[from] PrepareSignError),
2019-09-13 01:29:24 +00:00
#[error("Failed to create header, {0}")]
Header(#[from] InvalidHeaderValue),
2019-09-11 23:06:36 +00:00
#[error("Failed to send request")]
SendRequest,
2019-09-11 23:06:36 +00:00
#[error("Failed to retrieve request body")]
Body,
2020-03-30 05:53:45 +00:00
#[error("Blocking operation was canceled")]
Canceled,
}
2022-02-26 17:49:35 +00:00
impl From<JoinError> for MyError {
fn from(_: JoinError) -> Self {
2021-02-10 21:45:51 +00:00
MyError::Canceled
2020-03-30 05:53:45 +00:00
}
2019-09-11 23:06:36 +00:00
}
2023-08-04 23:01:41 +00:00
impl From<Canceled> for MyError {
fn from(_: Canceled) -> Self {
MyError::Canceled
}
}