Switching back to isahc.

This commit is contained in:
Dessalines 2020-06-25 15:36:03 -04:00
parent dc94e58cbf
commit 7d1c6e9a40
7 changed files with 160 additions and 84 deletions

190
server/Cargo.lock generated vendored
View file

@ -440,20 +440,6 @@ dependencies = [
"syn", "syn",
] ]
[[package]]
name = "attohttpc"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93610ce1c035e8a273fe56a19852e42798f3c019ca2726e52d2971197f116525"
dependencies = [
"http",
"log",
"rustls",
"url",
"webpki",
"webpki-roots",
]
[[package]] [[package]]
name = "atty" name = "atty"
version = "0.2.14" version = "0.2.14"
@ -795,6 +781,37 @@ dependencies = [
"lazy_static", "lazy_static",
] ]
[[package]]
name = "curl"
version = "0.4.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0447a642435be046540f042950d874a4907f9fee28c0513a0beb3ba89f91eb7"
dependencies = [
"curl-sys",
"libc",
"openssl-probe",
"openssl-sys",
"schannel",
"socket2",
"winapi 0.3.8",
]
[[package]]
name = "curl-sys"
version = "0.4.32+curl-7.70.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "834425a2f22fdd621434196965bf99fbfd9eaed96348488e27b7ac40736c560b"
dependencies = [
"cc",
"libc",
"libnghttp2-sys",
"libz-sys",
"openssl-sys",
"pkg-config",
"vcpkg",
"winapi 0.3.8",
]
[[package]] [[package]]
name = "darling" name = "darling"
version = "0.10.2" version = "0.10.2"
@ -1430,6 +1447,31 @@ dependencies = [
"winreg", "winreg",
] ]
[[package]]
name = "isahc"
version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f54e7cf252df9a36605ccfabea2a754ad30c24b51b77f830486e555ac8e76bce"
dependencies = [
"bytes",
"crossbeam-channel",
"crossbeam-utils",
"curl",
"curl-sys",
"encoding_rs",
"futures-channel",
"futures-io",
"futures-util",
"http",
"lazy_static",
"log",
"mime",
"slab",
"sluice",
"tracing",
"tracing-futures",
]
[[package]] [[package]]
name = "itertools" name = "itertools"
version = "0.9.0" version = "0.9.0"
@ -1502,7 +1544,6 @@ dependencies = [
"actix-rt", "actix-rt",
"actix-web", "actix-web",
"actix-web-actors", "actix-web-actors",
"attohttpc",
"base64 0.12.2", "base64 0.12.2",
"bcrypt", "bcrypt",
"chrono", "chrono",
@ -1517,6 +1558,7 @@ dependencies = [
"htmlescape", "htmlescape",
"http", "http",
"http-signature-normalization", "http-signature-normalization",
"isahc",
"itertools", "itertools",
"jsonwebtoken", "jsonwebtoken",
"lazy_static", "lazy_static",
@ -1589,6 +1631,28 @@ version = "0.2.71"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49" checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49"
[[package]]
name = "libnghttp2-sys"
version = "0.1.4+1.41.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03624ec6df166e79e139a2310ca213283d6b3c30810c54844f307086d4488df1"
dependencies = [
"cc",
"libc",
]
[[package]]
name = "libz-sys"
version = "1.0.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe"
dependencies = [
"cc",
"libc",
"pkg-config",
"vcpkg",
]
[[package]] [[package]]
name = "linked-hash-map" name = "linked-hash-map"
version = "0.3.0" version = "0.3.0"
@ -2357,19 +2421,6 @@ dependencies = [
"semver", "semver",
] ]
[[package]]
name = "rustls"
version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0d4a31f5d68413404705d6982529b0e11a9aacd4839d1d6222ee3b8cb4015e1"
dependencies = [
"base64 0.11.0",
"log",
"ring",
"sct",
"webpki",
]
[[package]] [[package]]
name = "ryu" name = "ryu"
version = "1.0.5" version = "1.0.5"
@ -2413,16 +2464,6 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
[[package]]
name = "sct"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c"
dependencies = [
"ring",
"untrusted",
]
[[package]] [[package]]
name = "security-framework" name = "security-framework"
version = "0.4.4" version = "0.4.4"
@ -2590,6 +2631,18 @@ version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
[[package]]
name = "sluice"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fed13b7cb46f13a15db2c4740f087a848acc8b31af89f95844d40137451f89b1"
dependencies = [
"futures-channel",
"futures-core",
"futures-io",
"futures-util",
]
[[package]] [[package]]
name = "smallvec" name = "smallvec"
version = "1.4.0" version = "1.4.0"
@ -2808,6 +2861,48 @@ dependencies = [
"tokio", "tokio",
] ]
[[package]]
name = "tracing"
version = "0.1.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a41f40ed0e162c911ac6fcb53ecdc8134c46905fdbbae8c50add462a538b495f"
dependencies = [
"cfg-if",
"log",
"tracing-attributes",
"tracing-core",
]
[[package]]
name = "tracing-attributes"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "99bbad0de3fd923c9c3232ead88510b783e5a4d16a6154adffa3d53308de984c"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "tracing-core"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0aa83a9a47081cd522c09c81b31aec2c9273424976f922ad61c053b58350b715"
dependencies = [
"lazy_static",
]
[[package]]
name = "tracing-futures"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab7bb6f14721aa00656086e9335d363c5c8747bae02ebe32ea2c7dece5689b4c"
dependencies = [
"pin-project",
"tracing",
]
[[package]] [[package]]
name = "trust-dns-proto" name = "trust-dns-proto"
version = "0.18.0-alpha.2" version = "0.18.0-alpha.2"
@ -3105,25 +3200,6 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "webpki"
version = "0.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab146130f5f790d45f82aeeb09e55a256573373ec64409fc19a6fb82fb1032ae"
dependencies = [
"ring",
"untrusted",
]
[[package]]
name = "webpki-roots"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8eff4b7516a57307f9349c64bf34caa34b940b66fed4b2fb3136cb7386e5739"
dependencies = [
"webpki",
]
[[package]] [[package]]
name = "widestring" name = "widestring"
version = "0.4.2" version = "0.4.2"

2
server/Cargo.toml vendored
View file

@ -40,7 +40,7 @@ htmlescape = "0.3.1"
url = { version = "2.1.1", features = ["serde"] } url = { version = "2.1.1", features = ["serde"] }
config = {version = "0.10.1", default-features = false, features = ["hjson"] } config = {version = "0.10.1", default-features = false, features = ["hjson"] }
percent-encoding = "2.1.0" percent-encoding = "2.1.0"
attohttpc = { version = "0.14.0", default-features = false, features = ["tls-rustls"] } isahc = "0.9.2"
comrak = "0.7" comrak = "0.7"
openssl = "0.10" openssl = "0.10"
http = "0.2.1" http = "0.2.1"

View file

@ -5,6 +5,7 @@ use crate::{
use activitystreams::{context, object::properties::ObjectProperties, public, Activity, Base}; use activitystreams::{context, object::properties::ObjectProperties, public, Activity, Base};
use diesel::PgConnection; use diesel::PgConnection;
use failure::{Error, _core::fmt::Debug}; use failure::{Error, _core::fmt::Debug};
use isahc::prelude::*;
use log::debug; use log::debug;
use serde::Serialize; use serde::Serialize;
use url::Url; use url::Url;
@ -56,18 +57,16 @@ where
for t in to { for t in to {
let to_url = Url::parse(&t)?; let to_url = Url::parse(&t)?;
if !is_apub_id_valid(&to_url) { if !is_apub_id_valid(&to_url) {
debug!("Not sending activity to {} (invalid or blacklisted)", t); debug!("Not sending activity to {} (invalid or blocklisted)", t);
continue; continue;
} }
let mut request = attohttpc::post(t).header("Host", to_url.domain().unwrap()); let request = Request::post(t).header("Host", to_url.domain().unwrap());
let signature = sign(&mut request, actor)?; let signature = sign(&request, actor)?;
let res = request let res = request
.header("Signature", signature) .header("Signature", signature)
.header("Content-Type", "application/json") .header("Content-Type", "application/json")
.text(json.to_owned()) .body(json.to_owned())?
.send()? .send()?;
.text()?;
debug!("Result for activity send: {:?}", res); debug!("Result for activity send: {:?}", res);
} }
Ok(()) Ok(())

View file

@ -1,8 +1,8 @@
use crate::apub::ActorType; use crate::apub::ActorType;
use activitystreams::ext::Extension; use activitystreams::ext::Extension;
use actix_web::HttpRequest; use actix_web::HttpRequest;
use attohttpc::RequestBuilder;
use failure::Error; use failure::Error;
use http::request::Builder;
use http_signature_normalization::Config; use http_signature_normalization::Config;
use log::debug; use log::debug;
use openssl::{ use openssl::{
@ -35,29 +35,28 @@ pub fn generate_actor_keypair() -> Result<Keypair, Error> {
}) })
} }
// TODO is it possible to create this signature, with just the url and actor?
/// Signs request headers with the given keypair. /// Signs request headers with the given keypair.
pub fn sign(request: &mut RequestBuilder, actor: &dyn ActorType) -> Result<String, Error> { pub fn sign(request: &Builder, actor: &dyn ActorType) -> Result<String, Error> {
let signing_key_id = format!("{}#main-key", actor.actor_id()); let signing_key_id = format!("{}#main-key", actor.actor_id());
let headers = request let headers = request
.inspect() .headers_ref()
.headers() .unwrap()
.iter() .iter()
.map(|h| -> Result<(String, String), Error> { .map(|h| -> Result<(String, String), Error> {
Ok((h.0.as_str().to_owned(), h.1.to_str()?.to_owned())) Ok((h.0.as_str().to_owned(), h.1.to_str()?.to_owned()))
}) })
.collect::<Result<BTreeMap<String, String>, Error>>()?; .collect::<Result<BTreeMap<String, String>, Error>>()?;
let mut path_and_query = request.inspect().url().path().to_owned();
if let Some(query) = request.inspect().url().query() {
path_and_query.push_str(query);
}
let signature_header_value = HTTP_SIG_CONFIG let signature_header_value = HTTP_SIG_CONFIG
.begin_sign( .begin_sign(
request.inspect().method().as_str(), request.method_ref().unwrap().as_str(),
&path_and_query, request
.uri_ref()
.unwrap()
.path_and_query()
.unwrap()
.as_str(),
headers, headers,
)? )?
.sign(signing_key_id, |signing_string| { .sign(signing_key_id, |signing_string| {

View file

@ -2,6 +2,7 @@ use activitystreams::object::Note;
use actix_web::Result; use actix_web::Result;
use diesel::{result::Error::NotFound, PgConnection}; use diesel::{result::Error::NotFound, PgConnection};
use failure::{Error, _core::fmt::Debug}; use failure::{Error, _core::fmt::Debug};
use isahc::prelude::*;
use log::debug; use log::debug;
use serde::Deserialize; use serde::Deserialize;
use std::time::Duration; use std::time::Duration;
@ -63,11 +64,11 @@ where
} }
// TODO: this function should return a future // TODO: this function should return a future
let timeout = Duration::from_secs(60); let timeout = Duration::from_secs(60);
let text: String = attohttpc::get(url.as_str()) let text = Request::get(url.as_str())
.header("Accept", APUB_JSON_CONTENT_TYPE) .header("Accept", APUB_JSON_CONTENT_TYPE)
.connect_timeout(timeout) .connect_timeout(timeout)
.timeout(timeout) .timeout(timeout)
// .body(()) .body(())?
.send()? .send()?
.text()?; .text()?;
let res: Response = serde_json::from_str(&text)?; let res: Response = serde_json::from_str(&text)?;

View file

@ -32,6 +32,7 @@ use actix_web::{body::Body, HttpResponse, Result};
use chrono::NaiveDateTime; use chrono::NaiveDateTime;
use diesel::PgConnection; use diesel::PgConnection;
use failure::Error; use failure::Error;
use isahc::prelude::*;
use log::debug; use log::debug;
use serde::Serialize; use serde::Serialize;
use url::Url; use url::Url;
@ -252,7 +253,7 @@ pub fn fetch_webfinger_url(mention: &MentionData) -> Result<String, Error> {
mention.domain mention.domain
); );
debug!("Fetching webfinger url: {}", &fetch_url); debug!("Fetching webfinger url: {}", &fetch_url);
let text: String = attohttpc::get(&fetch_url).send()?.text()?; let text = isahc::get(&fetch_url)?.text()?;
let res: WebFingerResponse = serde_json::from_str(&text)?; let res: WebFingerResponse = serde_json::from_str(&text)?;
let link = res let link = res
.links .links

View file

@ -39,6 +39,7 @@ pub mod websocket;
use crate::settings::Settings; use crate::settings::Settings;
use actix_web::dev::ConnectionInfo; use actix_web::dev::ConnectionInfo;
use chrono::{DateTime, FixedOffset, Local, NaiveDateTime, Utc}; use chrono::{DateTime, FixedOffset, Local, NaiveDateTime, Utc};
use isahc::prelude::*;
use itertools::Itertools; use itertools::Itertools;
use lettre::{ use lettre::{
smtp::{ smtp::{
@ -85,8 +86,7 @@ pub fn is_email_regex(test: &str) -> bool {
} }
pub fn is_image_content_type(test: &str) -> Result<(), failure::Error> { pub fn is_image_content_type(test: &str) -> Result<(), failure::Error> {
if attohttpc::get(test) if isahc::get(test)?
.send()?
.headers() .headers()
.get("Content-Type") .get("Content-Type")
.ok_or_else(|| format_err!("No Content-Type header"))? .ok_or_else(|| format_err!("No Content-Type header"))?
@ -180,7 +180,7 @@ pub struct IframelyResponse {
pub fn fetch_iframely(url: &str) -> Result<IframelyResponse, failure::Error> { pub fn fetch_iframely(url: &str) -> Result<IframelyResponse, failure::Error> {
let fetch_url = format!("http://iframely/oembed?url={}", url); let fetch_url = format!("http://iframely/oembed?url={}", url);
let text: String = attohttpc::get(&fetch_url).send()?.text()?; let text = isahc::get(&fetch_url)?.text()?;
let res: IframelyResponse = serde_json::from_str(&text)?; let res: IframelyResponse = serde_json::from_str(&text)?;
Ok(res) Ok(res)
} }
@ -204,7 +204,7 @@ pub fn fetch_pictrs(image_url: &str) -> Result<PictrsResponse, failure::Error> {
"http://pictrs:8080/image/download?url={}", "http://pictrs:8080/image/download?url={}",
utf8_percent_encode(image_url, NON_ALPHANUMERIC) // TODO this might not be needed utf8_percent_encode(image_url, NON_ALPHANUMERIC) // TODO this might not be needed
); );
let text = attohttpc::get(&fetch_url).send()?.text()?; let text = isahc::get(&fetch_url)?.text()?;
let res: PictrsResponse = serde_json::from_str(&text)?; let res: PictrsResponse = serde_json::from_str(&text)?;
if res.msg == "ok" { if res.msg == "ok" {
Ok(res) Ok(res)