refactor(http): call on_error for more error cases
This commit is contained in:
		| @@ -159,14 +159,14 @@ impl<K: Key, T: Transport, H: MessageHandler<T>> ConnInner<K, T, H> { | ||||
|                         return State::Closed; | ||||
|                     } | ||||
|                 }; | ||||
|                 match <<H as MessageHandler<T>>::Message as Http1Message>::decoder(&head) { | ||||
|                     Ok(decoder) => { | ||||
|                         trace!("decoder = {:?}", decoder); | ||||
|                         let keep_alive = self.keep_alive_enabled && head.should_keep_alive(); | ||||
|                 let mut handler = match scope.create(Seed(&self.key, &self.ctrl.0)) { | ||||
|                     Some(handler) => handler, | ||||
|                     None => unreachable!() | ||||
|                 }; | ||||
|                 match H::Message::decoder(&head) { | ||||
|                     Ok(decoder) => { | ||||
|                         trace!("decoder = {:?}", decoder); | ||||
|                         let keep_alive = self.keep_alive_enabled && head.should_keep_alive(); | ||||
|                         let next = handler.on_incoming(head, &self.transport); | ||||
|                         trace!("handler.on_incoming() -> {:?}", next); | ||||
|  | ||||
| @@ -217,7 +217,10 @@ impl<K: Key, T: Transport, H: MessageHandler<T>> ConnInner<K, T, H> { | ||||
|                     }, | ||||
|                     Err(e) => { | ||||
|                         debug!("error creating decoder: {:?}", e); | ||||
|                         //TODO: respond with 400 | ||||
|                         //TODO: update state from returned Next | ||||
|                         //this would allow a Server to respond with a proper | ||||
|                         //4xx code | ||||
|                         let _ = handler.on_error(e); | ||||
|                         State::Closed | ||||
|                     } | ||||
|                 } | ||||
| @@ -230,7 +233,7 @@ impl<K: Key, T: Transport, H: MessageHandler<T>> ConnInner<K, T, H> { | ||||
|                 let next = match http1.reading { | ||||
|                     Reading::Init => None, | ||||
|                     Reading::Parse => match self.parse() { | ||||
|                         Ok(head) => match <<H as MessageHandler<T>>::Message as Http1Message>::decoder(&head) { | ||||
|                         Ok(head) => match H::Message::decoder(&head) { | ||||
|                             Ok(decoder) => { | ||||
|                                 trace!("decoder = {:?}", decoder); | ||||
|                                 // if client request asked for keep alive, | ||||
| @@ -258,8 +261,8 @@ impl<K: Key, T: Transport, H: MessageHandler<T>> ConnInner<K, T, H> { | ||||
|                             } | ||||
|                         }, | ||||
|                         Err(e) => { | ||||
|                             //TODO: send proper error codes depending on error | ||||
|                             trace!("parse error: {:?}", e); | ||||
|                             let _ = http1.handler.on_error(e); | ||||
|                             return State::Closed; | ||||
|                         } | ||||
|                     }, | ||||
| @@ -304,7 +307,7 @@ impl<K: Key, T: Transport, H: MessageHandler<T>> ConnInner<K, T, H> { | ||||
|     fn write<F: MessageHandlerFactory<K, T, Output=H>>(&mut self, scope: &mut Scope<F>, mut state: State<H, T>) -> State<H, T> { | ||||
|         let next = match state { | ||||
|             State::Init { interest: Next_::Write, .. } => { | ||||
|                 // this could be a Client request, which writes first, so pay | ||||
|                 // this is a Client request, which writes first, so pay | ||||
|                 // attention to the version written here, which will adjust | ||||
|                 // our internal state to Http1 or Http2 | ||||
|                 let mut handler = match scope.create(Seed(&self.key, &self.ctrl.0)) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user