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 ruma::api::client::{error::ErrorKind, r0::uiaa::UiaaInfo}; | ||||
| use ruma::{ | ||||
|     api::client::{ | ||||
|         error::{Error as RumaError, ErrorKind}, | ||||
|         r0::uiaa::UiaaInfo, | ||||
|     }, | ||||
|     ServerName, | ||||
| }; | ||||
| use thiserror::Error; | ||||
| 
 | ||||
| #[cfg(feature = "conduit_bin")] | ||||
|  | @ -10,7 +16,7 @@ use { | |||
|         response::{self, Responder}, | ||||
|         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>; | ||||
|  | @ -33,6 +39,8 @@ pub enum Error { | |||
|         source: reqwest::Error, | ||||
|     }, | ||||
|     #[error("{0}")] | ||||
|     FederationError(Box<ServerName>, RumaError), | ||||
|     #[error("{0}")] | ||||
|     BadServerResponse(&'static str), | ||||
|     #[error("{0}")] | ||||
|     BadConfig(&'static str), | ||||
|  | @ -66,8 +74,13 @@ where | |||
|     'o: 'r, | ||||
| { | ||||
|     fn respond_to(self, r: &'r Request<'_>) -> response::Result<'o> { | ||||
|         if let Self::Uiaa(uiaainfo) = &self { | ||||
|             return RumaResponse::from(UiaaResponse::AuthResponse(uiaainfo.clone())).respond_to(r); | ||||
|         if let Self::Uiaa(uiaainfo) = self { | ||||
|             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); | ||||
|  |  | |||
|  | @ -9,7 +9,7 @@ use regex::Regex; | |||
| use rocket::{response::content::Json, State}; | ||||
| use ruma::{ | ||||
|     api::{ | ||||
|         client::error::ErrorKind, | ||||
|         client::error::{Error as RumaError, ErrorKind}, | ||||
|         federation::{ | ||||
|             device::get_devices::{self, v1::UserDevice}, | ||||
|             directory::{get_public_rooms, get_public_rooms_filtered}, | ||||
|  | @ -27,7 +27,7 @@ use ruma::{ | |||
|             query::{get_profile_information, get_room_information}, | ||||
|             transactions::{edu::Edu, send_transaction_message}, | ||||
|         }, | ||||
|         IncomingResponse, OutgoingRequest, OutgoingResponse, SendAccessToken, | ||||
|         EndpointError, IncomingResponse, OutgoingRequest, OutgoingResponse, SendAccessToken, | ||||
|     }, | ||||
|     directory::{IncomingFilter, IncomingRoomNetwork}, | ||||
|     events::{ | ||||
|  | @ -261,12 +261,21 @@ where | |||
|                 ); | ||||
|             } | ||||
| 
 | ||||
|             let response = T::IncomingResponse::try_from_http_response( | ||||
|                 http_response_builder | ||||
|                     .body(body) | ||||
|                     .expect("reqwest body is valid http body"), | ||||
|             ); | ||||
|             response.map_err(|_| Error::BadServerResponse("Server returned bad response.")) | ||||
|             let http_response = http_response_builder | ||||
|                 .body(body) | ||||
|                 .expect("reqwest body is valid http body"); | ||||
| 
 | ||||
|             if status == 200 { | ||||
|                 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()), | ||||
|     } | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue