aboutsummaryrefslogtreecommitdiff
path: root/libgo/go/net/http/fcgi/fcgi_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/net/http/fcgi/fcgi_test.go')
-rw-r--r--libgo/go/net/http/fcgi/fcgi_test.go53
1 files changed, 53 insertions, 0 deletions
diff --git a/libgo/go/net/http/fcgi/fcgi_test.go b/libgo/go/net/http/fcgi/fcgi_test.go
index b58111d..5888783 100644
--- a/libgo/go/net/http/fcgi/fcgi_test.go
+++ b/libgo/go/net/http/fcgi/fcgi_test.go
@@ -11,6 +11,7 @@ import (
"net/http"
"strings"
"testing"
+ "time"
)
var sizeTests = []struct {
@@ -399,3 +400,55 @@ func TestResponseWriterSniffsContentType(t *testing.T) {
})
}
}
+
+type signallingNopCloser struct {
+ io.Reader
+ closed chan bool
+}
+
+func (*signallingNopCloser) Write(buf []byte) (int, error) {
+ return len(buf), nil
+}
+
+func (rc *signallingNopCloser) Close() error {
+ close(rc.closed)
+ return nil
+}
+
+// Test whether server properly closes connection when processing slow
+// requests
+func TestSlowRequest(t *testing.T) {
+ pr, pw := io.Pipe()
+ go func(w io.Writer) {
+ for _, buf := range [][]byte{
+ streamBeginTypeStdin,
+ makeRecord(typeStdin, 1, nil),
+ } {
+ pw.Write(buf)
+ time.Sleep(100 * time.Millisecond)
+ }
+ }(pw)
+
+ rc := &signallingNopCloser{pr, make(chan bool)}
+ handlerDone := make(chan bool)
+
+ c := newChild(rc, http.HandlerFunc(func(
+ w http.ResponseWriter,
+ r *http.Request,
+ ) {
+ w.WriteHeader(200)
+ close(handlerDone)
+ }))
+ go c.serve()
+ defer c.cleanUp()
+
+ timeout := time.After(2 * time.Second)
+
+ <-handlerDone
+ select {
+ case <-rc.closed:
+ t.Log("FastCGI child closed connection")
+ case <-timeout:
+ t.Error("FastCGI child did not close socket after handling request")
+ }
+}