diff -r d5785050f61d src/pkg/http/request.go --- a/src/pkg/http/request.go Sun Jul 31 15:37:01 2011 -0700 +++ b/src/pkg/http/request.go Thu Aug 18 11:44:38 2011 -0700 @@ -523,6 +523,14 @@ r.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(s))) } +type badRequestError struct { + e os.Error +} + +func (e *badRequestError) String() string { + return "Bad request: " + e.String() +} + // ReadRequest reads and parses a request from b. func ReadRequest(b *bufio.Reader) (req *Request, err os.Error) { @@ -540,16 +548,16 @@ var f []string if f = strings.SplitN(s, " ", 3); len(f) < 3 { - return nil, &badStringError{"malformed HTTP request", s} + return nil, &badRequestError{&badStringError{"malformed HTTP request", s}} } req.Method, req.RawURL, req.Proto = f[0], f[1], f[2] var ok bool if req.ProtoMajor, req.ProtoMinor, ok = ParseHTTPVersion(req.Proto); !ok { - return nil, &badStringError{"malformed HTTP version", req.Proto} + return nil, &badRequestError{&badStringError{"malformed HTTP version", req.Proto}} } if req.URL, err = ParseRequestURL(req.RawURL); err != nil { - return nil, err + return nil, &badRequestError{err} } // Subsequent lines: Key: value. diff -r d5785050f61d src/pkg/http/server.go --- a/src/pkg/http/server.go Sun Jul 31 15:37:01 2011 -0700 +++ b/src/pkg/http/server.go Thu Aug 18 11:44:38 2011 -0700 @@ -191,6 +191,23 @@ // It is like time.RFC1123 but hard codes GMT as the time zone. const TimeFormat = "Mon, 02 Jan 2006 15:04:05 GMT" +type nopCloser struct{} + +func (_ nopCloser) Read(b []byte) (int, os.Error) { + return 0, os.NewError("Tried to read a noCloser") +} + +func (_ nopCloser) Close() os.Error { + return nil +} + +var badRequest = &Request{ + Proto: "HTTP/1.1", + ProtoMajor: 1, + ProtoMinor: 1, + Body: new(nopCloser), +} + // Read next request from connection. func (c *conn) readRequest() (w *response, err os.Error) { if c.hijacked { @@ -198,12 +215,15 @@ } var req *Request if req, err = ReadRequest(c.buf.Reader); err != nil { - return nil, err + if _, ok := err.(*badRequestError); !ok { + return nil, err + } + req = badRequest + } else { + req.RemoteAddr = c.remoteAddr + req.TLS = c.tlsState } - req.RemoteAddr = c.remoteAddr - req.TLS = c.tlsState - w = new(response) w.conn = c w.req = req @@ -509,6 +529,13 @@ // Expect 100 Continue support req := w.req + if req == badRequest { + w.Header().Set("Connection", "close") + w.WriteHeader(StatusBadRequest) + fmt.Fprintln(w, "Bad Request") + w.finishRequest() + break + } if req.expectsContinue() { if req.ProtoAtLeast(1, 1) { // Wrap the Body reader with one that replies on the connection