mirror of
https://github.com/astro/buzzrelay.git
synced 2025-03-14 00:22:41 +00:00
> Oct 07 03:25:59 buzzrelay buzzrelay[676]: 2023-10-07T01:25:59.381211Z ERROR buzzrelay::relay: relay::send Response("{\"error\":\"Invalid Date header: not RFC 2616 compliant date: \\\"Sat, 7 Oct 2023 01:25:58 GMT\\\"\"}") is it the leading 0 in the day position?
39 lines
1.3 KiB
Rust
39 lines
1.3 KiB
Rust
use std::time::SystemTime;
|
|
use http::StatusCode;
|
|
use serde::de::DeserializeOwned;
|
|
use sigh::{PrivateKey, SigningConfig, alg::RsaSha256};
|
|
use crate::{digest, error::Error};
|
|
|
|
pub async fn authorized_fetch<T>(
|
|
client: &reqwest::Client,
|
|
uri: &str,
|
|
key_id: &str,
|
|
private_key: &PrivateKey,
|
|
) -> Result<T, Error>
|
|
where
|
|
T: DeserializeOwned,
|
|
{
|
|
let url = reqwest::Url::parse(uri)
|
|
.map_err(|_| Error::InvalidUri)?;
|
|
let host = format!("{}", url.host().ok_or(Error::InvalidUri)?);
|
|
let digest_header = digest::generate_header(&[])
|
|
.expect("digest::generate_header");
|
|
let mut req = http::Request::builder()
|
|
.uri(uri)
|
|
.header("host", &host)
|
|
.header("content-type", "application/activity+json")
|
|
.header("date", httpdate::fmt_http_date(SystemTime::now()))
|
|
.header("accept", "application/activity+json")
|
|
.header("digest", digest_header)
|
|
.body(vec![])?;
|
|
SigningConfig::new(RsaSha256, private_key, key_id)
|
|
.sign(&mut req)?;
|
|
let req: reqwest::Request = req.try_into()?;
|
|
let res = client.execute(req)
|
|
.await?;
|
|
if res.status() >= StatusCode::OK && res.status() < StatusCode::MULTIPLE_CHOICES {
|
|
Ok(res.json().await?)
|
|
} else {
|
|
Err(Error::Response(res.text().await?))
|
|
}
|
|
}
|