diff options
| author | Ondřej Surý <ondrej@sury.org> | 2011-02-18 09:50:58 +0100 | 
|---|---|---|
| committer | Ondřej Surý <ondrej@sury.org> | 2011-02-18 09:50:58 +0100 | 
| commit | c072558b90f1bbedc2022b0f30c8b1ac4712538e (patch) | |
| tree | 67767591619e4bd8111fb05fac185cde94fb7378 /src/pkg/http/server.go | |
| parent | 5859517b767c99749a45651c15d4bae5520ebae8 (diff) | |
| download | golang-c072558b90f1bbedc2022b0f30c8b1ac4712538e.tar.gz | |
Imported Upstream version 2011.02.15upstream/2011.02.15
Diffstat (limited to 'src/pkg/http/server.go')
| -rw-r--r-- | src/pkg/http/server.go | 48 | 
1 files changed, 41 insertions, 7 deletions
| diff --git a/src/pkg/http/server.go b/src/pkg/http/server.go index 6672c494b..0be270ad3 100644 --- a/src/pkg/http/server.go +++ b/src/pkg/http/server.go @@ -670,6 +670,39 @@ func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {  // read requests and then call handler to reply to them.  // Handler is typically nil, in which case the DefaultServeMux is used.  func Serve(l net.Listener, handler Handler) os.Error { +	srv := &Server{Handler: handler} +	return srv.Serve(l) +} + +// A Server defines parameters for running an HTTP server. +type Server struct { +	Addr         string  // TCP address to listen on, ":http" if empty +	Handler      Handler // handler to invoke, http.DefaultServeMux if nil +	ReadTimeout  int64   // the net.Conn.SetReadTimeout value for new connections +	WriteTimeout int64   // the net.Conn.SetWriteTimeout value for new connections +} + +// ListenAndServe listens on the TCP network address srv.Addr and then +// calls Serve to handle requests on incoming connections.  If +// srv.Addr is blank, ":http" is used. +func (srv *Server) ListenAndServe() os.Error { +	addr := srv.Addr +	if addr == "" { +		addr = ":http" +	} +	l, e := net.Listen("tcp", addr) +	if e != nil { +		return e +	} +	return srv.Serve(l) +} + +// Serve accepts incoming connections on the Listener l, creating a +// new service thread for each.  The service threads read requests and +// then call srv.Handler to reply to them. +func (srv *Server) Serve(l net.Listener) os.Error { +	defer l.Close() +	handler := srv.Handler  	if handler == nil {  		handler = DefaultServeMux  	} @@ -678,6 +711,12 @@ func Serve(l net.Listener, handler Handler) os.Error {  		if e != nil {  			return e  		} +		if srv.ReadTimeout != 0 { +			rw.SetReadTimeout(srv.ReadTimeout) +		} +		if srv.WriteTimeout != 0 { +			rw.SetWriteTimeout(srv.WriteTimeout) +		}  		c, err := newConn(rw, handler)  		if err != nil {  			continue @@ -715,13 +754,8 @@ func Serve(l net.Listener, handler Handler) os.Error {  //		}  //	}  func ListenAndServe(addr string, handler Handler) os.Error { -	l, e := net.Listen("tcp", addr) -	if e != nil { -		return e -	} -	e = Serve(l, handler) -	l.Close() -	return e +	server := &Server{Addr: addr, Handler: handler} +	return server.ListenAndServe()  }  // ListenAndServeTLS acts identically to ListenAndServe, except that it | 
