mirror of
https://github.com/golang/go
synced 2024-10-05 10:31:22 -06:00
66 lines
1.2 KiB
Go
66 lines
1.2 KiB
Go
|
// 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";
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// 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 := strings.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
|
||
|
}
|