@@ -10,6 +10,7 @@ use std::task::{self, Poll};
10
10
use anyhow:: { format_err, Context , Error } ;
11
11
use futures:: FutureExt ;
12
12
use futures_util:: stream:: StreamExt ;
13
+ use hickory_resolver:: error:: ResolveErrorKind ;
13
14
use http:: header:: { HOST , LOCATION } ;
14
15
use http:: { Request , Uri } ;
15
16
use hyper:: client:: connect:: Connect ;
@@ -20,7 +21,6 @@ use log::{debug, trace, warn};
20
21
use serde:: { Deserialize , Serialize } ;
21
22
use tokio:: net:: TcpStream ;
22
23
use tokio_rustls:: rustls:: ClientConfig ;
23
- use hickory_resolver:: error:: ResolveErrorKind ;
24
24
use url:: Url ;
25
25
26
26
/// A resolved host for a Matrix server.
@@ -53,7 +53,7 @@ pub struct MatrixResolver {
53
53
54
54
impl MatrixResolver {
55
55
/// Create a new [`MatrixResolver`]
56
- pub async fn new ( ) -> Result < MatrixResolver , Error > {
56
+ pub fn new ( ) -> Result < MatrixResolver , Error > {
57
57
let resolver = hickory_resolver:: TokioAsyncResolver :: tokio_from_system_conf ( ) ?;
58
58
59
59
Ok ( MatrixResolver { resolver } )
@@ -120,17 +120,6 @@ impl MatrixResolver {
120
120
host. to_string ( )
121
121
} ;
122
122
123
- // If a literal IP or includes port then we shortcircuit.
124
- if host. parse :: < IpAddr > ( ) . is_ok ( ) || port. is_some ( ) {
125
- return Ok ( vec ! [ Endpoint {
126
- host: host. to_string( ) ,
127
- port: port. unwrap_or( 8448 ) ,
128
-
129
- host_header: authority. to_string( ) ,
130
- tls_name: host. to_string( ) ,
131
- } ] ) ;
132
- }
133
-
134
123
// If a literal IP or includes port then we short circuit.
135
124
if host. parse :: < IpAddr > ( ) . is_ok ( ) || port. is_some ( ) {
136
125
debug ! ( "Host is IP or port is set" ) ;
@@ -262,10 +251,13 @@ where
262
251
C : Connect + Clone + Sync + Send + ' static ,
263
252
{
264
253
debug ! ( "URI: {:?}" , req. uri( ) ) ;
265
- if req. uri ( ) . scheme_str ( ) != Some ( "matrix" ) {
266
- debug ! ( "Got scheme: {:?}" , req. uri( ) . scheme_str( ) ) ;
267
- return Ok ( req) ;
268
- }
254
+ let matrix_url_scheme: & str = match req. uri ( ) . scheme_str ( ) {
255
+ Some ( scheme @ ( "matrix" | "matrix-federation" ) ) => scheme,
256
+ _ => {
257
+ debug ! ( "Got scheme: {:?}" , req. uri( ) . scheme_str( ) ) ;
258
+ return Ok ( req) ;
259
+ }
260
+ } ;
269
261
270
262
let host = req. uri ( ) . host ( ) . context ( "missing host" ) ?;
271
263
let port = req. uri ( ) . port ( ) ;
@@ -280,7 +272,9 @@ where
280
272
debug ! ( "Found well-known: {}" , & w. server) ;
281
273
282
274
let a = http:: uri:: Authority :: from_str ( & w. server ) ?;
283
- let mut builder = Uri :: builder ( ) . scheme ( "matrix" ) . authority ( a) ;
275
+ // When building the new URL, use whatever scheme that was used in the
276
+ // original request.
277
+ let mut builder = Uri :: builder ( ) . scheme ( matrix_url_scheme) . authority ( a) ;
284
278
if let Some ( p) = req. uri ( ) . path_and_query ( ) {
285
279
builder = builder. path_and_query ( p. clone ( ) ) ;
286
280
}
@@ -309,7 +303,7 @@ pub struct WellKnownServer {
309
303
}
310
304
311
305
/// A connector that can be used with a [`hyper::Client`] that correctly
312
- /// resolves and connects to `matrix://` URIs.
306
+ /// resolves and connects to `matrix://` and `matrix-federation://` URIs.
313
307
#[ derive( Debug , Clone ) ]
314
308
pub struct MatrixConnector {
315
309
resolver : MatrixResolver ,
@@ -331,8 +325,8 @@ impl MatrixConnector {
331
325
}
332
326
333
327
/// Create new [`MatrixConnector`] with a default [`MatrixResolver`].
334
- pub async fn with_default_resolver ( ) -> Result < MatrixConnector , Error > {
335
- let resolver = MatrixResolver :: new ( ) . await ?;
328
+ pub fn with_default_resolver ( ) -> Result < MatrixConnector , Error > {
329
+ let resolver = MatrixResolver :: new ( ) ?;
336
330
337
331
Ok ( MatrixConnector :: with_resolver ( resolver) )
338
332
}
@@ -356,19 +350,24 @@ impl Service<Uri> for MatrixConnector {
356
350
let client_config = self . client_config . clone ( ) ;
357
351
358
352
async move {
359
- if dst. scheme_str ( ) != Some ( "matrix" ) {
360
- let mut https = hyper_rustls:: HttpsConnectorBuilder :: new ( )
361
- . with_tls_config ( client_config)
362
- . https_only ( )
363
- . enable_http1 ( )
364
- . build ( ) ;
365
-
366
- let r = https. call ( dst) . await ;
367
-
368
- return match r {
369
- Ok ( r) => Ok ( r) ,
370
- Err ( e) => Err ( format_err ! ( "{}" , e) ) ,
371
- } ;
353
+ // Return-early and make a normal request if the URI scheme is not
354
+ // `matrix://` or `matrix-federation://`.
355
+ match dst. scheme_str ( ) {
356
+ Some ( "matrix" | "matrix-federation" ) => { }
357
+ _ => {
358
+ let mut https = hyper_rustls:: HttpsConnectorBuilder :: new ( )
359
+ . with_tls_config ( client_config)
360
+ . https_only ( )
361
+ . enable_http1 ( )
362
+ . build ( ) ;
363
+
364
+ let r = https. call ( dst) . await ;
365
+
366
+ return match r {
367
+ Ok ( r) => Ok ( r) ,
368
+ Err ( e) => Err ( format_err ! ( "{}" , e) ) ,
369
+ } ;
370
+ }
372
371
}
373
372
374
373
let endpoints = resolver
0 commit comments