6464//! # .await?;
6565//!
6666//! use ruma::{
67- //! api::{MatrixVersion, client::alias::get_alias},
67+ //! api::{client::alias::get_alias, MatrixVersion },
6868//! owned_room_alias_id, room_id,
6969//! };
7070//!
@@ -101,13 +101,10 @@ use std::{any::type_name, future::Future};
101101
102102#[ doc( no_inline) ]
103103pub use ruma;
104- use ruma:: {
105- UserId ,
106- api:: {
107- OutgoingRequest ,
108- auth_scheme:: { AuthScheme , SendAccessToken } ,
109- path_builder:: PathBuilder ,
110- } ,
104+ use ruma:: api:: {
105+ AppserviceUserIdentity , OutgoingRequest , OutgoingRequestAppserviceExt ,
106+ auth_scheme:: { AuthScheme , SendAccessToken } ,
107+ path_builder:: PathBuilder ,
111108} ;
112109use tracing:: { Instrument , info_span} ;
113110
@@ -117,7 +114,7 @@ mod error;
117114pub mod http_client;
118115
119116#[ cfg( feature = "client-api" ) ]
120- pub use self :: client:: { Client , ClientBuilder , SupportedPathBuilder , TokenMode } ;
117+ pub use self :: client:: { Client , ClientBuilder , TokenMode } ;
121118pub use self :: {
122119 error:: Error ,
123120 http_client:: { DefaultConstructibleHttpClient , HttpClient , HttpClientExt } ,
@@ -131,31 +128,15 @@ pub type ResponseError<C, R> =
131128pub type ResponseResult < C , R > =
132129 Result < <R as OutgoingRequest >:: IncomingResponse , ResponseError < C , R > > ;
133130
134- fn send_customized_request < ' a , C , R , F > (
131+ fn send_prepared_request < ' a , C , R > (
135132 http_client : & ' a C ,
136133 homeserver_url : & str ,
137- send_access_token : SendAccessToken < ' a > ,
138- path_builder_input : <R :: PathBuilder as PathBuilder >:: Input < ' _ > ,
139- request : R ,
140- customize : F ,
141- ) -> impl Future < Output = ResponseResult < C , R > > + Send + ' a + use < ' a , C , R , F >
134+ http_req : Result < http:: Request < C :: RequestBody > , ResponseError < C , R > > ,
135+ ) -> impl Future < Output = ResponseResult < C , R > > + Send + ' a + use < ' a , C , R >
142136where
143137 C : HttpClient + ?Sized ,
144138 R : OutgoingRequest ,
145- R :: Authentication : AuthScheme < Input < ' a > = SendAccessToken < ' a > > ,
146- F : FnOnce ( & mut http:: Request < C :: RequestBody > ) -> Result < ( ) , ResponseError < C , R > > ,
147139{
148- let http_req =
149- info_span ! ( "serialize_request" , request_type = type_name:: <R >( ) ) . in_scope ( move || {
150- request
151- . try_into_http_request ( homeserver_url, send_access_token, path_builder_input)
152- . map_err ( ResponseError :: < C , R > :: from)
153- . and_then ( |mut req| {
154- customize ( & mut req) ?;
155- Ok ( req)
156- } )
157- } ) ;
158-
159140 let send_span = info_span ! (
160141 "send_request" ,
161142 request_type = type_name:: <R >( ) ,
@@ -178,23 +159,78 @@ where
178159 }
179160}
180161
181- fn add_user_id_to_query < C : HttpClient + ?Sized , R : OutgoingRequest > (
182- user_id : & UserId ,
183- ) -> impl FnOnce ( & mut http:: Request < C :: RequestBody > ) -> Result < ( ) , ResponseError < C , R > > + ' _ {
184- use assign:: assign;
185- use http:: uri:: Uri ;
186-
187- move |http_request| {
188- let extra_params = serde_html_form:: to_string ( [ ( "user_id" , user_id) ] ) . unwrap ( ) ;
189- let uri = http_request. uri_mut ( ) ;
190- let new_path_and_query = match uri. query ( ) {
191- Some ( params) => format ! ( "{}?{params}&{extra_params}" , uri. path( ) ) ,
192- None => format ! ( "{}?{extra_params}" , uri. path( ) ) ,
193- } ;
194- * uri = Uri :: from_parts ( assign ! ( uri. clone( ) . into_parts( ) , {
195- path_and_query: Some ( new_path_and_query. parse( ) ?) ,
196- } ) ) ?;
197-
198- Ok ( ( ) )
199- }
162+ fn send_request < ' a , C , R > (
163+ http_client : & ' a C ,
164+ homeserver_url : & str ,
165+ authentication_input : <R :: Authentication as AuthScheme >:: Input < ' _ > ,
166+ path_builder_input : <R :: PathBuilder as PathBuilder >:: Input < ' _ > ,
167+ request : R ,
168+ ) -> impl Future < Output = ResponseResult < C , R > > + Send + ' a + use < ' a , C , R >
169+ where
170+ C : HttpClient + ?Sized ,
171+ R : OutgoingRequest ,
172+ {
173+ let http_req =
174+ info_span ! ( "serialize_request" , request_type = type_name:: <R >( ) ) . in_scope ( move || {
175+ request
176+ . try_into_http_request ( homeserver_url, authentication_input, path_builder_input)
177+ . map_err ( ResponseError :: < C , R > :: from)
178+ } ) ;
179+
180+ send_prepared_request :: < C , R > ( http_client, homeserver_url, http_req)
181+ }
182+
183+ fn send_request_as < ' a , C , R > (
184+ http_client : & ' a C ,
185+ homeserver_url : & str ,
186+ authentication_input : <R :: Authentication as AuthScheme >:: Input < ' _ > ,
187+ identity : AppserviceUserIdentity < ' _ > ,
188+ path_builder_input : <R :: PathBuilder as PathBuilder >:: Input < ' _ > ,
189+ request : R ,
190+ ) -> impl Future < Output = ResponseResult < C , R > > + Send + ' a + use < ' a , C , R >
191+ where
192+ C : HttpClient + ?Sized ,
193+ R : OutgoingRequestAppserviceExt ,
194+ for < ' b > R :: Authentication : AuthScheme < Input < ' b > = SendAccessToken < ' b > > ,
195+ {
196+ let http_req =
197+ info_span ! ( "serialize_request" , request_type = type_name:: <R >( ) ) . in_scope ( move || {
198+ request
199+ . try_into_http_request_with_identity (
200+ homeserver_url,
201+ authentication_input,
202+ identity,
203+ path_builder_input,
204+ )
205+ . map_err ( ResponseError :: < C , R > :: from)
206+ } ) ;
207+
208+ send_prepared_request :: < C , R > ( http_client, homeserver_url, http_req)
209+ }
210+
211+ fn send_customized_request < ' a , C , R , F > (
212+ http_client : & ' a C ,
213+ homeserver_url : & str ,
214+ authentication_input : <R :: Authentication as AuthScheme >:: Input < ' _ > ,
215+ path_builder_input : <R :: PathBuilder as PathBuilder >:: Input < ' _ > ,
216+ request : R ,
217+ customize : F ,
218+ ) -> impl Future < Output = ResponseResult < C , R > > + Send + ' a + use < ' a , C , R , F >
219+ where
220+ C : HttpClient + ?Sized ,
221+ R : OutgoingRequest ,
222+ F : FnOnce ( & mut http:: Request < C :: RequestBody > ) -> Result < ( ) , ResponseError < C , R > > ,
223+ {
224+ let http_req =
225+ info_span ! ( "serialize_request" , request_type = type_name:: <R >( ) ) . in_scope ( move || {
226+ request
227+ . try_into_http_request ( homeserver_url, authentication_input, path_builder_input)
228+ . map_err ( ResponseError :: < C , R > :: from)
229+ . and_then ( |mut req| {
230+ customize ( & mut req) ?;
231+ Ok ( req)
232+ } )
233+ } ) ;
234+
235+ send_prepared_request :: < C , R > ( http_client, homeserver_url, http_req)
200236}
0 commit comments