1
0
mirror of https://github.com/golang/go synced 2024-11-22 03:34:40 -07:00

http: consume request body before next request

Fixes #1306.

R=rsc
CC=golang-dev
https://golang.org/cl/3332043
This commit is contained in:
Brad Fitzpatrick 2010-12-01 20:00:19 -08:00 committed by Russ Cox
parent 5e4882a325
commit 042a7a81d3
2 changed files with 136 additions and 0 deletions

135
src/pkg/http/serve_test.go Normal file
View File

@ -0,0 +1,135 @@
// Copyright 2010 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.
// End-to-end serving tests
package http
import (
"bytes"
"os"
"net"
"testing"
)
type dummyAddr string
type oneConnListener struct {
conn net.Conn
}
func (l *oneConnListener) Accept() (c net.Conn, err os.Error) {
c = l.conn
if c == nil {
err = os.EOF
return
}
err = nil
l.conn = nil
return
}
func (l *oneConnListener) Close() os.Error {
return nil
}
func (l *oneConnListener) Addr() net.Addr {
return dummyAddr("test-address")
}
func (a dummyAddr) Network() string {
return string(a)
}
func (a dummyAddr) String() string {
return string(a)
}
type testConn struct {
readBuf bytes.Buffer
writeBuf bytes.Buffer
}
func (c *testConn) Read(b []byte) (int, os.Error) {
return c.readBuf.Read(b)
}
func (c *testConn) Write(b []byte) (int, os.Error) {
return c.writeBuf.Write(b)
}
func (c *testConn) Close() os.Error {
return nil
}
func (c *testConn) LocalAddr() net.Addr {
return dummyAddr("local-addr")
}
func (c *testConn) RemoteAddr() net.Addr {
return dummyAddr("remote-addr")
}
func (c *testConn) SetTimeout(nsec int64) os.Error {
return nil
}
func (c *testConn) SetReadTimeout(nsec int64) os.Error {
return nil
}
func (c *testConn) SetWriteTimeout(nsec int64) os.Error {
return nil
}
func TestConsumingBodyOnNextConn(t *testing.T) {
conn := new(testConn)
for i := 0; i < 2; i++ {
conn.readBuf.Write([]byte(
"POST / HTTP/1.1\r\n" +
"Host: test\r\n" +
"Content-Length: 11\r\n" +
"\r\n" +
"foo=1&bar=1"))
}
reqNum := 0
ch := make(chan *Request)
servech := make(chan os.Error)
listener := &oneConnListener{conn}
handler := func(res ResponseWriter, req *Request) {
reqNum++
t.Logf("Got request #%d: %v", reqNum, req)
ch <- req
}
go func() {
servech <- Serve(listener, HandlerFunc(handler))
}()
var req *Request
t.Log("Waiting for first request.")
req = <-ch
if req == nil {
t.Fatal("Got nil first request.")
}
if req.Method != "POST" {
t.Errorf("For request #1's method, got %q; expected %q",
req.Method, "POST")
}
t.Log("Waiting for second request.")
req = <-ch
if req == nil {
t.Fatal("Got nil first request.")
}
if req.Method != "POST" {
t.Errorf("For request #2's method, got %q; expected %q",
req.Method, "POST")
}
t.Log("Waiting for EOF.")
if serveerr := <-servech; serveerr != os.EOF {
t.Errorf("Serve returned %q; expected EOF", serveerr)
}
}

View File

@ -362,6 +362,7 @@ func (w *response) finishRequest() {
io.WriteString(w.conn.buf, "\r\n") io.WriteString(w.conn.buf, "\r\n")
} }
w.conn.buf.Flush() w.conn.buf.Flush()
w.req.Body.Close()
} }
// Flush implements the ResponseWriter.Flush method. // Flush implements the ResponseWriter.Flush method.