Always set User-Agent header when using fetcher

This commit is contained in:
silverpill 2022-12-03 10:46:24 +00:00
parent 4ec5cf0f9b
commit 28aea5b023

View file

@ -1,7 +1,7 @@
use std::path::Path; use std::path::Path;
use std::time::Duration; use std::time::Duration;
use reqwest::{Client, Method, Proxy}; use reqwest::{Client, Method, Proxy, RequestBuilder};
use serde_json::Value; use serde_json::Value;
use crate::activitypub::activity::Object; use crate::activitypub::activity::Object;
@ -48,6 +48,21 @@ fn build_client(instance: &Instance) -> reqwest::Result<Client> {
.build() .build()
} }
fn build_request(
instance: &Instance,
client: Client,
method: Method,
url: &str,
) -> RequestBuilder {
let mut request_builder = client.request(method, url);
if !instance.is_private {
// Public instance should set User-Agent header
request_builder = request_builder
.header(reqwest::header::USER_AGENT, instance.agent());
};
request_builder
}
/// Sends GET request to fetch AP object /// Sends GET request to fetch AP object
async fn send_request( async fn send_request(
instance: &Instance, instance: &Instance,
@ -55,11 +70,12 @@ async fn send_request(
query_params: &[(&str, &str)], query_params: &[(&str, &str)],
) -> Result<String, FetchError> { ) -> Result<String, FetchError> {
let client = build_client(instance)?; let client = build_client(instance)?;
let mut request_builder = client.get(url); let mut request_builder = build_request(instance, client, Method::GET, url)
.header(reqwest::header::ACCEPT, AP_MEDIA_TYPE);
if !query_params.is_empty() { if !query_params.is_empty() {
request_builder = request_builder.query(query_params); request_builder = request_builder.query(query_params);
}; };
if !instance.is_private { if !instance.is_private {
// Only public instance can send signed request // Only public instance can send signed request
let headers = create_http_signature( let headers = create_http_signature(
@ -74,14 +90,8 @@ async fn send_request(
.header("Date", headers.date) .header("Date", headers.date)
.header("Signature", headers.signature); .header("Signature", headers.signature);
}; };
if !instance.is_private {
// Public instance should set User-Agent header
request_builder = request_builder
.header(reqwest::header::USER_AGENT, instance.agent());
};
let data = request_builder let data = request_builder
.header(reqwest::header::ACCEPT, AP_MEDIA_TYPE)
.send().await? .send().await?
.error_for_status()? .error_for_status()?
.text().await?; .text().await?;
@ -96,7 +106,9 @@ pub async fn fetch_file(
output_dir: &Path, output_dir: &Path,
) -> Result<(String, Option<String>), FetchError> { ) -> Result<(String, Option<String>), FetchError> {
let client = build_client(instance)?; let client = build_client(instance)?;
let response = client.get(url).send().await?; let request_builder =
build_request(instance, client, Method::GET, url);
let response = request_builder.send().await?;
if let Some(file_size) = response.content_length() { if let Some(file_size) = response.content_length() {
if file_size > FILE_MAX_SIZE { if file_size > FILE_MAX_SIZE {
return Err(FetchError::OtherError("file is too large")); return Err(FetchError::OtherError("file is too large"));
@ -121,12 +133,8 @@ pub async fn perform_webfinger_query(
actor_address.hostname, actor_address.hostname,
); );
let client = build_client(instance)?; let client = build_client(instance)?;
let mut request_builder = client.get(&webfinger_url); let request_builder =
if !instance.is_private { build_request(instance, client, Method::GET, &webfinger_url);
// Public instance should set User-Agent header
request_builder = request_builder
.header(reqwest::header::USER_AGENT, instance.agent());
};
let webfinger_data = request_builder let webfinger_data = request_builder
.query(&[("resource", webfinger_account_uri)]) .query(&[("resource", webfinger_account_uri)])
.send().await? .send().await?