@@ -34,6 +34,7 @@ import (
3434 "net/http"
3535 "reflect"
3636 "sync"
37+ "sync/atomic"
3738 "testing"
3839 "time"
3940
@@ -43,11 +44,12 @@ import (
4344type serverType int64
4445
4546const (
46- sendToBackChannel serverType = 0
47- readAndDiscard serverType = 1
48- returning500 serverType = 2
49- returning403 serverType = 3
50- returning404 serverType = 4
47+ sendToBackChannel serverType = 0
48+ readAndDiscard serverType = 1
49+ returning500 serverType = 2
50+ returning403 serverType = 3
51+ returning404 serverType = 4
52+ failFirstThenSendToBackChannel serverType = 5
5153)
5254
5355type testServer struct {
@@ -186,21 +188,21 @@ func (s *testServer) serveHttp() {
186188 }
187189 }()
188190
191+ var reqs int64
189192 http .Serve (s .tcpListener , http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
190193 var (
191194 err error
192195 )
193196
194197 switch s .serverType {
195- case sendToBackChannel :
196- r := bufio .NewReader (r .Body )
197- var l string
198- for err == nil {
199- l , err = r .ReadString ('\n' )
200- if err == nil && len (l ) > 0 {
201- lineFeed <- l [0 : len (l )- 1 ]
202- }
198+ case failFirstThenSendToBackChannel :
199+ if atomic .AddInt64 (& reqs , 1 ) == 1 {
200+ w .WriteHeader (http .StatusInternalServerError )
201+ } else {
202+ err = readAndSendToBackChannel (r , lineFeed )
203203 }
204+ case sendToBackChannel :
205+ err = readAndSendToBackChannel (r , lineFeed )
204206 case readAndDiscard :
205207 _ , err = io .Copy (io .Discard , r .Body )
206208 case returning500 :
@@ -232,6 +234,21 @@ func (s *testServer) serveHttp() {
232234 }))
233235}
234236
237+ func readAndSendToBackChannel (r * http.Request , lineFeed chan string ) error {
238+ read := bufio .NewReader (r .Body )
239+ var (
240+ l string
241+ err error
242+ )
243+ for err == nil {
244+ l , err = read .ReadString ('\n' )
245+ if err == nil && len (l ) > 0 {
246+ lineFeed <- l [0 : len (l )- 1 ]
247+ }
248+ }
249+ return err
250+ }
251+ 235252func (s * testServer ) Close () {
236253 close (s .closeCh )
237254 s .tcpListener .Close ()
0 commit comments