| // Copyright 2009 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // Trivial HTTP server |
| |
| // TODO: Routines for writing responses. |
| |
| package http |
| |
| import ( |
| "io"; |
| "os"; |
| "net"; |
| "http"; |
| "strconv"; |
| ) |
| |
| // Serve a new connection. |
| func ServeConnection(fd net.Conn, raddr string, f *(*Conn, *Request)) { |
| c, err := NewConn(fd); |
| if err != nil { |
| return |
| } |
| for { |
| req, err := c.ReadRequest(); |
| if err != nil { |
| break |
| } |
| f(c, req); |
| if c.close { |
| break |
| } |
| } |
| c.Close(); |
| } |
| |
| // Web server: already listening on l, call f for each request. |
| export func Serve(l net.Listener, f *(*Conn, *Request)) *os.Error { |
| // TODO: Make this unnecessary |
| s, e := os.Getenv("GOMAXPROCS"); |
| if n, ok := strconv.atoi(s); n < 3 { |
| print("Warning: $GOMAXPROCS needs to be at least 3.\n"); |
| } |
| |
| for { |
| rw, raddr, e := l.Accept(); |
| if e != nil { |
| return e |
| } |
| go ServeConnection(rw, raddr, f) |
| } |
| panic("not reached") |
| } |
| |
| // Web server: listen on address, call f for each request. |
| export func ListenAndServe(addr string, f *(*Conn, *Request)) *os.Error { |
| l, e := net.Listen("tcp", addr); |
| if e != nil { |
| return e |
| } |
| e = Serve(l, f); |
| l.Close(); |
| return e |
| } |