| 
									
										
										
										
											2008-09-24 15:26:55 -07:00
										 |  |  | // 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"; | 
					
						
							| 
									
										
										
										
											2008-11-17 12:34:03 -08:00
										 |  |  | 	"strconv"; | 
					
						
							| 
									
										
										
										
											2008-09-24 15:26:55 -07:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Serve a new connection. | 
					
						
							| 
									
										
										
										
											2009-01-16 11:06:42 -08:00
										 |  |  | func serveConnection(fd net.Conn, raddr string, f *(*Conn, *Request)) { | 
					
						
							| 
									
										
										
										
											2008-10-08 09:34:50 -07:00
										 |  |  | 	c, err := NewConn(fd); | 
					
						
							| 
									
										
										
										
											2008-09-24 15:26:55 -07:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	for { | 
					
						
							| 
									
										
										
										
											2008-10-08 09:34:50 -07:00
										 |  |  | 		req, err := c.ReadRequest(); | 
					
						
							| 
									
										
										
										
											2008-09-24 15:26:55 -07:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			break | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2008-10-08 09:34:50 -07:00
										 |  |  | 		f(c, req); | 
					
						
							| 
									
										
										
										
											2008-09-24 15:26:55 -07:00
										 |  |  | 		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"); | 
					
						
							| 
									
										
										
										
											2009-01-15 17:22:17 -08:00
										 |  |  | 	if n, ok := strconv.Atoi(s); n < 3 { | 
					
						
							| 
									
										
										
										
											2008-09-24 15:26:55 -07:00
										 |  |  | 		print("Warning: $GOMAXPROCS needs to be at least 3.\n"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for { | 
					
						
							| 
									
										
										
										
											2008-10-08 09:34:50 -07:00
										 |  |  | 		rw, raddr, e := l.Accept(); | 
					
						
							| 
									
										
										
										
											2008-09-24 15:26:55 -07:00
										 |  |  | 		if e != nil { | 
					
						
							|  |  |  | 			return e | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2009-01-16 11:06:42 -08:00
										 |  |  | 		go serveConnection(rw, raddr, f) | 
					
						
							| 
									
										
										
										
											2008-09-24 15:26:55 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	panic("not reached") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Web server: listen on address, call f for each request. | 
					
						
							|  |  |  | export func ListenAndServe(addr string, f *(*Conn, *Request)) *os.Error { | 
					
						
							| 
									
										
										
										
											2008-10-08 09:34:50 -07:00
										 |  |  | 	l, e := net.Listen("tcp", addr); | 
					
						
							| 
									
										
										
										
											2008-09-24 15:26:55 -07:00
										 |  |  | 	if e != nil { | 
					
						
							|  |  |  | 		return e | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	e = Serve(l, f); | 
					
						
							| 
									
										
										
										
											2008-10-08 09:34:50 -07:00
										 |  |  | 	l.Close(); | 
					
						
							| 
									
										
										
										
											2008-09-24 15:26:55 -07:00
										 |  |  | 	return e | 
					
						
							|  |  |  | } |