diff --git a/src/http/conn.rs b/src/http/conn.rs index c50cad81..187d7c6c 100644 --- a/src/http/conn.rs +++ b/src/http/conn.rs @@ -159,14 +159,14 @@ impl> ConnInner { return State::Closed; } }; - match <>::Message as Http1Message>::decoder(&head) { + 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 mut handler = match scope.create(Seed(&self.key, &self.ctrl.0)) { - Some(handler) => handler, - None => unreachable!() - }; let next = handler.on_incoming(head, &self.transport); trace!("handler.on_incoming() -> {:?}", next); @@ -217,7 +217,10 @@ impl> ConnInner { }, 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> ConnInner { let next = match http1.reading { Reading::Init => None, Reading::Parse => match self.parse() { - Ok(head) => match <>::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> ConnInner { } }, 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> ConnInner { fn write>(&mut self, scope: &mut Scope, mut state: State) -> State { 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)) {