client: Add send_request_as for application services
This commit is contained in:
parent
20dfd7c328
commit
cee6e2e365
@ -6,8 +6,9 @@ use std::{future::Future, pin::Pin};
|
||||
use async_trait::async_trait;
|
||||
use bytes::BufMut;
|
||||
use ruma_api::{OutgoingRequest, SendAccessToken};
|
||||
use ruma_identifiers::UserId;
|
||||
|
||||
use crate::{ResponseError, ResponseResult};
|
||||
use crate::{add_user_id_to_query, ResponseError, ResponseResult};
|
||||
|
||||
#[cfg(feature = "hyper")]
|
||||
mod hyper;
|
||||
@ -90,6 +91,29 @@ pub trait HttpClientExt: HttpClient {
|
||||
customize,
|
||||
))
|
||||
}
|
||||
|
||||
/// Turn a strongly-typed matrix request into an `http::Request`, add a `user_id` query
|
||||
/// parameter to it and send it to get back a strongly-typed response.
|
||||
///
|
||||
/// This method is meant to be used by application services when interacting with the
|
||||
/// client-server API.
|
||||
fn send_request_as<'a, R: OutgoingRequest + 'a>(
|
||||
&'a self,
|
||||
homeserver_url: &str,
|
||||
access_token: SendAccessToken<'_>,
|
||||
user_id: &'a UserId,
|
||||
request: R,
|
||||
) -> Pin<Box<dyn Future<Output = ResponseResult<Self, R>> + 'a>>
|
||||
where
|
||||
<R as OutgoingRequest>::EndpointError: Send,
|
||||
{
|
||||
self.send_customized_request(
|
||||
homeserver_url,
|
||||
access_token,
|
||||
request,
|
||||
add_user_id_to_query::<Self, R>(user_id),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
|
@ -79,6 +79,7 @@ use std::{
|
||||
};
|
||||
|
||||
use ruma_api::{OutgoingRequest, SendAccessToken};
|
||||
use ruma_identifiers::UserId;
|
||||
|
||||
// "Undo" rename from `Cargo.toml` that only serves to make `hyper-rustls` available as a Cargo
|
||||
// feature name.
|
||||
@ -190,6 +191,21 @@ impl<C: HttpClient> Client<C> {
|
||||
)
|
||||
.await
|
||||
}
|
||||
|
||||
/// Makes a request to a Matrix API endpoint as a virtual user.
|
||||
///
|
||||
/// This method is meant to be used by application services when interacting with the
|
||||
/// client-server API.
|
||||
pub async fn send_request_as<R: OutgoingRequest>(
|
||||
&self,
|
||||
user_id: &UserId,
|
||||
request: R,
|
||||
) -> ResponseResult<C, R>
|
||||
where
|
||||
<R as OutgoingRequest>::EndpointError: Send,
|
||||
{
|
||||
self.send_customized_request(request, add_user_id_to_query::<C, R>(user_id)).await
|
||||
}
|
||||
}
|
||||
|
||||
fn send_customized_request<'a, C, R, F>(
|
||||
@ -218,3 +234,25 @@ where
|
||||
Ok(ruma_api::IncomingResponse::try_from_http_response(http_res)?)
|
||||
}
|
||||
}
|
||||
|
||||
fn add_user_id_to_query<C: HttpClient + ?Sized, R: OutgoingRequest>(
|
||||
user_id: &UserId,
|
||||
) -> impl FnOnce(&mut http::Request<C::RequestBody>) -> Result<(), ResponseError<C, R>> + '_ {
|
||||
use assign::assign;
|
||||
use http::uri::Uri;
|
||||
use ruma_serde::urlencoded;
|
||||
|
||||
move |http_request| {
|
||||
let extra_params = urlencoded::to_string(&[("user_id", user_id)]).unwrap();
|
||||
let uri = http_request.uri_mut();
|
||||
let new_path_and_query = match uri.query() {
|
||||
Some(params) => format!("{}?{}&{}", uri.path(), params, extra_params),
|
||||
None => format!("{}?{}", uri.path(), extra_params),
|
||||
};
|
||||
*uri = Uri::from_parts(assign!(uri.clone().into_parts(), {
|
||||
path_and_query: Some(new_path_and_query.parse()?),
|
||||
}))?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user