feat: forward federation errors to the client
This commit is contained in:
		
							parent
							
								
									1939e62814
								
							
						
					
					
						commit
						e5c7119516
					
				
					 2 changed files with 34 additions and 12 deletions
				
			
		
							
								
								
									
										21
									
								
								src/error.rs
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								src/error.rs
									
									
									
									
									
								
							|  | @ -1,5 +1,11 @@ | ||||||
| use log::{error, warn}; | use log::{error, warn}; | ||||||
| use ruma::api::client::{error::ErrorKind, r0::uiaa::UiaaInfo}; | use ruma::{ | ||||||
|  |     api::client::{ | ||||||
|  |         error::{Error as RumaError, ErrorKind}, | ||||||
|  |         r0::uiaa::UiaaInfo, | ||||||
|  |     }, | ||||||
|  |     ServerName, | ||||||
|  | }; | ||||||
| use thiserror::Error; | use thiserror::Error; | ||||||
| 
 | 
 | ||||||
| #[cfg(feature = "conduit_bin")] | #[cfg(feature = "conduit_bin")] | ||||||
|  | @ -10,7 +16,7 @@ use { | ||||||
|         response::{self, Responder}, |         response::{self, Responder}, | ||||||
|         Request, |         Request, | ||||||
|     }, |     }, | ||||||
|     ruma::api::client::{error::Error as RumaError, r0::uiaa::UiaaResponse}, |     ruma::api::client::r0::uiaa::UiaaResponse, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| pub type Result<T> = std::result::Result<T, Error>; | pub type Result<T> = std::result::Result<T, Error>; | ||||||
|  | @ -33,6 +39,8 @@ pub enum Error { | ||||||
|         source: reqwest::Error, |         source: reqwest::Error, | ||||||
|     }, |     }, | ||||||
|     #[error("{0}")] |     #[error("{0}")] | ||||||
|  |     FederationError(Box<ServerName>, RumaError), | ||||||
|  |     #[error("{0}")] | ||||||
|     BadServerResponse(&'static str), |     BadServerResponse(&'static str), | ||||||
|     #[error("{0}")] |     #[error("{0}")] | ||||||
|     BadConfig(&'static str), |     BadConfig(&'static str), | ||||||
|  | @ -66,8 +74,13 @@ where | ||||||
|     'o: 'r, |     'o: 'r, | ||||||
| { | { | ||||||
|     fn respond_to(self, r: &'r Request<'_>) -> response::Result<'o> { |     fn respond_to(self, r: &'r Request<'_>) -> response::Result<'o> { | ||||||
|         if let Self::Uiaa(uiaainfo) = &self { |         if let Self::Uiaa(uiaainfo) = self { | ||||||
|             return RumaResponse::from(UiaaResponse::AuthResponse(uiaainfo.clone())).respond_to(r); |             return RumaResponse::from(UiaaResponse::AuthResponse(uiaainfo)).respond_to(r); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if let Self::FederationError(origin, mut error) = self { | ||||||
|  |             error.message = format!("Answer from {}: {}", origin, error.message); | ||||||
|  |             return RumaResponse::from(error).respond_to(r); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         let message = format!("{}", self); |         let message = format!("{}", self); | ||||||
|  |  | ||||||
|  | @ -9,7 +9,7 @@ use regex::Regex; | ||||||
| use rocket::{response::content::Json, State}; | use rocket::{response::content::Json, State}; | ||||||
| use ruma::{ | use ruma::{ | ||||||
|     api::{ |     api::{ | ||||||
|         client::error::ErrorKind, |         client::error::{Error as RumaError, ErrorKind}, | ||||||
|         federation::{ |         federation::{ | ||||||
|             device::get_devices::{self, v1::UserDevice}, |             device::get_devices::{self, v1::UserDevice}, | ||||||
|             directory::{get_public_rooms, get_public_rooms_filtered}, |             directory::{get_public_rooms, get_public_rooms_filtered}, | ||||||
|  | @ -27,7 +27,7 @@ use ruma::{ | ||||||
|             query::{get_profile_information, get_room_information}, |             query::{get_profile_information, get_room_information}, | ||||||
|             transactions::{edu::Edu, send_transaction_message}, |             transactions::{edu::Edu, send_transaction_message}, | ||||||
|         }, |         }, | ||||||
|         IncomingResponse, OutgoingRequest, OutgoingResponse, SendAccessToken, |         EndpointError, IncomingResponse, OutgoingRequest, OutgoingResponse, SendAccessToken, | ||||||
|     }, |     }, | ||||||
|     directory::{IncomingFilter, IncomingRoomNetwork}, |     directory::{IncomingFilter, IncomingRoomNetwork}, | ||||||
|     events::{ |     events::{ | ||||||
|  | @ -261,12 +261,21 @@ where | ||||||
|                 ); |                 ); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             let response = T::IncomingResponse::try_from_http_response( |             let http_response = http_response_builder | ||||||
|                 http_response_builder |                 .body(body) | ||||||
|                     .body(body) |                 .expect("reqwest body is valid http body"); | ||||||
|                     .expect("reqwest body is valid http body"), | 
 | ||||||
|             ); |             if status == 200 { | ||||||
|             response.map_err(|_| Error::BadServerResponse("Server returned bad response.")) |                 let response = T::IncomingResponse::try_from_http_response(http_response); | ||||||
|  |                 response.map_err(|_| Error::BadServerResponse("Server returned bad 200 response.")) | ||||||
|  |             } else { | ||||||
|  |                 Err(Error::FederationError( | ||||||
|  |                     destination.to_owned(), | ||||||
|  |                     RumaError::try_from_http_response(http_response).map_err(|_| { | ||||||
|  |                         Error::BadServerResponse("Server returned bad error response.") | ||||||
|  |                     })?, | ||||||
|  |                 )) | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|         Err(e) => Err(e.into()), |         Err(e) => Err(e.into()), | ||||||
|     } |     } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue