forked from mirrors/relay
Fix mutex scoping, map payload in-place
This commit is contained in:
parent
af570c6581
commit
c3d5de600d
6 changed files with 50 additions and 49 deletions
2
.env
Normal file
2
.env
Normal file
|
@ -0,0 +1,2 @@
|
|||
HOSTNAME=localhost:8079
|
||||
PORT=8079
|
2
Cargo.lock
generated
2
Cargo.lock
generated
|
@ -1933,7 +1933,7 @@ checksum = "b5eb417147ba9860a96cfe72a0b93bf88fee1744b5636ec99ab20c1aa9376581"
|
|||
|
||||
[[package]]
|
||||
name = "relay"
|
||||
version = "0.2.0"
|
||||
version = "0.2.1"
|
||||
dependencies = [
|
||||
"activitystreams",
|
||||
"activitystreams-ext",
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
[package]
|
||||
name = "relay"
|
||||
description = "A simple activitypub relay"
|
||||
version = "0.2.0"
|
||||
version = "0.2.1"
|
||||
authors = ["asonix <asonix@asonix.dog>"]
|
||||
license-file = "LICENSE"
|
||||
readme = "README.md"
|
||||
|
|
|
@ -1,14 +1,12 @@
|
|||
use actix_web::{
|
||||
dev::{Payload, Service, ServiceRequest, Transform},
|
||||
http::StatusCode,
|
||||
http::{Method, StatusCode},
|
||||
web::BytesMut,
|
||||
HttpMessage, HttpResponse, ResponseError,
|
||||
};
|
||||
use futures::{
|
||||
channel::mpsc::channel,
|
||||
future::{ok, try_join, LocalBoxFuture, Ready},
|
||||
sink::SinkExt,
|
||||
stream::StreamExt,
|
||||
future::{ok, LocalBoxFuture, Ready, TryFutureExt},
|
||||
stream::{once, TryStreamExt},
|
||||
};
|
||||
use log::{error, info};
|
||||
use std::task::{Context, Poll};
|
||||
|
@ -68,40 +66,23 @@ where
|
|||
}
|
||||
|
||||
fn call(&mut self, mut req: S::Request) -> Self::Future {
|
||||
if self.0 {
|
||||
let (mut tx, rx) = channel(0);
|
||||
|
||||
let mut pl = req.take_payload();
|
||||
req.set_payload(Payload::Stream(Box::pin(rx)));
|
||||
if self.0 && req.method() == Method::POST {
|
||||
let pl = req.take_payload();
|
||||
req.set_payload(Payload::Stream(Box::pin(once(
|
||||
pl.try_fold(BytesMut::new(), |mut acc, bytes| async {
|
||||
acc.extend(bytes);
|
||||
Ok(acc)
|
||||
})
|
||||
.map_ok(|bytes| {
|
||||
let bytes = bytes.freeze();
|
||||
info!("{}", String::from_utf8_lossy(&bytes));
|
||||
bytes
|
||||
}),
|
||||
))));
|
||||
|
||||
let fut = self.1.call(req);
|
||||
|
||||
let payload_fut = async move {
|
||||
let mut bytes = BytesMut::new();
|
||||
|
||||
while let Some(res) = pl.next().await {
|
||||
let b = res.map_err(|e| {
|
||||
error!("Payload error, {}", e);
|
||||
DebugError
|
||||
})?;
|
||||
bytes.extend(b);
|
||||
}
|
||||
|
||||
info!("{}", String::from_utf8_lossy(bytes.as_ref()));
|
||||
|
||||
tx.send(Ok(bytes.freeze())).await.map_err(|e| {
|
||||
error!("Error sending bytes, {}", e);
|
||||
DebugError
|
||||
})?;
|
||||
|
||||
Ok(()) as Result<(), actix_web::Error>
|
||||
};
|
||||
|
||||
Box::pin(async move {
|
||||
let (res, _) = try_join(fut, payload_fut).await?;
|
||||
|
||||
Ok(res)
|
||||
})
|
||||
Box::pin(async move { fut.await })
|
||||
} else {
|
||||
let fut = self.1.call(req);
|
||||
|
||||
|
|
|
@ -63,7 +63,7 @@ impl MyVerify {
|
|||
actor_id
|
||||
} else {
|
||||
self.0
|
||||
.fetch_json::<PublicKeyResponse>(public_key_id.as_str())
|
||||
.fetch::<PublicKeyResponse>(public_key_id.as_str())
|
||||
.await?
|
||||
.actor_id()
|
||||
.ok_or_else(|| MyError::MissingId)?
|
||||
|
|
|
@ -39,11 +39,20 @@ impl Breakers {
|
|||
|
||||
async fn fail(&self, url: &Url) {
|
||||
if let Some(domain) = url.domain() {
|
||||
if let Some(breaker) = self.inner.read().await.get(domain) {
|
||||
let owned_breaker = Arc::clone(&breaker);
|
||||
drop(breaker);
|
||||
owned_breaker.lock().await.fail();
|
||||
} else {
|
||||
let should_write = {
|
||||
let read = self.inner.read().await;
|
||||
|
||||
if let Some(breaker) = read.get(domain) {
|
||||
let owned_breaker = Arc::clone(&breaker);
|
||||
drop(breaker);
|
||||
owned_breaker.lock().await.fail();
|
||||
false
|
||||
} else {
|
||||
true
|
||||
}
|
||||
};
|
||||
|
||||
if should_write {
|
||||
let mut hm = self.inner.write().await;
|
||||
let breaker = hm
|
||||
.entry(domain.to_owned())
|
||||
|
@ -55,11 +64,20 @@ impl Breakers {
|
|||
|
||||
async fn succeed(&self, url: &Url) {
|
||||
if let Some(domain) = url.domain() {
|
||||
if let Some(breaker) = self.inner.read().await.get(domain) {
|
||||
let owned_breaker = Arc::clone(&breaker);
|
||||
drop(breaker);
|
||||
owned_breaker.lock().await.succeed();
|
||||
} else {
|
||||
let should_write = {
|
||||
let read = self.inner.read().await;
|
||||
|
||||
if let Some(breaker) = read.get(domain) {
|
||||
let owned_breaker = Arc::clone(&breaker);
|
||||
drop(breaker);
|
||||
owned_breaker.lock().await.succeed();
|
||||
false
|
||||
} else {
|
||||
true
|
||||
}
|
||||
};
|
||||
|
||||
if should_write {
|
||||
let mut hm = self.inner.write().await;
|
||||
let breaker = hm
|
||||
.entry(domain.to_owned())
|
||||
|
|
Loading…
Reference in a new issue