11//! HTTP Server
2- use std:: old_io:: { Listener , EndOfFile , BufferedReader , BufferedWriter } ;
2+ use std:: old_io:: { Listener , BufferedReader , BufferedWriter } ;
33use std:: old_io:: net:: ip:: { IpAddr , Port , SocketAddr } ;
44use std:: os;
5- use std:: sync:: { Arc , TaskPool } ;
6- use std:: thread:: { Builder , JoinGuard } ;
7-
5+ use std:: thread:: JoinGuard ;
86
97pub use self :: request:: Request ;
108pub use self :: response:: Response ;
@@ -19,9 +17,13 @@ use net::{NetworkListener, NetworkStream, NetworkAcceptor,
1917 HttpAcceptor , HttpListener } ;
2018use version:: HttpVersion :: { Http10 , Http11 } ;
2119
20+ use self :: acceptor:: AcceptorPool ;
21+
2222pub mod request;
2323pub mod response;
2424
25+ mod acceptor;
26+
2527/// A server can listen on a TCP socket.
2628///
2729/// Once listening, it will create a `Request`/`Response` pair for each
@@ -71,71 +73,14 @@ S: NetworkStream + Clone + Send> Server<L> {
7173 let acceptor = try!( self . listener . listen ( ( self . ip , self . port ) ) ) ;
7274 let socket = try!( acceptor. socket_name ( ) ) ;
7375
74- let mut captured = acceptor. clone ( ) ;
75- let guard = Builder :: new ( ) . name ( "hyper acceptor" . to_string ( ) ) . scoped ( move || {
76- let handler = Arc :: new ( handler) ;
77- debug ! ( "threads = {:?}" , threads) ;
78- let pool = TaskPool :: new ( threads) ;
79- for conn in captured. incoming ( ) {
80- match conn {
81- Ok ( mut stream) => {
82- debug ! ( "Incoming stream" ) ;
83- let handler = handler. clone ( ) ;
84- pool. execute ( move || {
85- let addr = match stream. peer_name ( ) {
86- Ok ( addr) => addr,
87- Err ( e) => {
88- error ! ( "Peer Name error: {:?}" , e) ;
89- return ;
90- }
91- } ;
92- let mut rdr = BufferedReader :: new ( stream. clone ( ) ) ;
93- let mut wrt = BufferedWriter :: new ( stream) ;
94-
95- let mut keep_alive = true ;
96- while keep_alive {
97- let mut res = Response :: new ( & mut wrt) ;
98- let req = match Request :: new ( & mut rdr, addr) {
99- Ok ( req) => req,
100- Err ( e@HttpIoError ( _) ) => {
101- debug ! ( "ioerror in keepalive loop = {:?}" , e) ;
102- return ;
103- }
104- Err ( e) => {
105- //TODO: send a 400 response
106- error ! ( "request error = {:?}" , e) ;
107- return ;
108- }
109- } ;
110-
111- keep_alive = match ( req. version , req. headers . get :: < Connection > ( ) ) {
112- ( Http10 , Some ( conn) ) if !conn. contains ( & KeepAlive ) => false ,
113- ( Http11 , Some ( conn) ) if conn. contains ( & Close ) => false ,
114- _ => true
115- } ;
116- res. version = req. version ;
117- handler. handle ( req, res) ;
118- debug ! ( "keep_alive = {:?}" , keep_alive) ;
119- }
120-
121- } ) ;
122- } ,
123- Err ( ref e) if e. kind == EndOfFile => {
124- debug ! ( "server closed" ) ;
125- break ;
126- } ,
127- Err ( e) => {
128- error ! ( "Connection failed: {}" , e) ;
129- continue ;
130- }
131- }
132- }
133- } ) ;
76+ debug ! ( "threads = {:?}" , threads) ;
77+ let pool = AcceptorPool :: new ( acceptor. clone ( ) ) ;
78+ let work = move |stream| handle_connection ( stream, & handler) ;
13479
13580 Ok ( Listening {
136- acceptor : acceptor,
137- guard : Some ( guard) ,
81+ _guard : pool. accept ( work, threads) ,
13882 socket : socket,
83+ acceptor : acceptor
13984 } )
14085 }
14186
@@ -146,22 +91,56 @@ S: NetworkStream + Clone + Send> Server<L> {
14691
14792}
14893
94+ fn handle_connection < S , H > ( mut stream : S , handler : & H )
95+ where S : NetworkStream + Clone , H : Handler {
96+ debug ! ( "Incoming stream" ) ;
97+ let addr = match stream. peer_name ( ) {
98+ Ok ( addr) => addr,
99+ Err ( e) => {
100+ error ! ( "Peer Name error: {:?}" , e) ;
101+ return ;
102+ }
103+ } ;
104+
105+ let mut rdr = BufferedReader :: new ( stream. clone ( ) ) ;
106+ let mut wrt = BufferedWriter :: new ( stream) ;
107+
108+ let mut keep_alive = true ;
109+ while keep_alive {
110+ let mut res = Response :: new ( & mut wrt) ;
111+ let req = match Request :: new ( & mut rdr, addr) {
112+ Ok ( req) => req,
113+ Err ( e@HttpIoError ( _) ) => {
114+ debug ! ( "ioerror in keepalive loop = {:?}" , e) ;
115+ return ;
116+ }
117+ Err ( e) => {
118+ //TODO: send a 400 response
119+ error ! ( "request error = {:?}" , e) ;
120+ return ;
121+ }
122+ } ;
123+
124+ keep_alive = match ( req. version , req. headers . get :: < Connection > ( ) ) {
125+ ( Http10 , Some ( conn) ) if !conn. contains ( & KeepAlive ) => false ,
126+ ( Http11 , Some ( conn) ) if conn. contains ( & Close ) => false ,
127+ _ => true
128+ } ;
129+ res. version = req. version ;
130+ handler. handle ( req, res) ;
131+ debug ! ( "keep_alive = {:?}" , keep_alive) ;
132+ }
133+ }
134+
149135/// A listening server, which can later be closed.
150136pub struct Listening < A = HttpAcceptor > {
151137 acceptor : A ,
152- guard : Option < JoinGuard < ' static , ( ) > > ,
138+ _guard : JoinGuard < ' static , ( ) > ,
153139 /// The socket addresses that the server is bound to.
154140 pub socket : SocketAddr ,
155141}
156142
157143impl < A : NetworkAcceptor > Listening < A > {
158- /// Causes the current thread to wait for this listening to complete.
159- pub fn await ( & mut self ) {
160- if let Some ( guard) = self . guard . take ( ) {
161- let _ = guard. join ( ) ;
162- }
163- }
164-
165144 /// Stop the server from listening to its socket address.
166145 pub fn close ( & mut self ) -> HttpResult < ( ) > {
167146 debug ! ( "closing server" ) ;
0 commit comments