@@ -34,6 +34,7 @@ import (
34
34
"net/http"
35
35
"reflect"
36
36
"sync"
37
+ "sync/atomic"
37
38
"testing"
38
39
"time"
39
40
@@ -43,11 +44,12 @@ import (
43
44
type serverType int64
44
45
45
46
const (
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
51
53
)
52
54
53
55
type testServer struct {
@@ -186,21 +188,21 @@ func (s *testServer) serveHttp() {
186
188
}
187
189
}()
188
190
191
+ var reqs int64
189
192
http .Serve (s .tcpListener , http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
190
193
var (
191
194
err error
192
195
)
193
196
194
197
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 )
203
203
}
204
+ case sendToBackChannel :
205
+ err = readAndSendToBackChannel (r , lineFeed )
204
206
case readAndDiscard :
205
207
_ , err = io .Copy (io .Discard , r .Body )
206
208
case returning500 :
@@ -232,6 +234,21 @@ func (s *testServer) serveHttp() {
232
234
}))
233
235
}
234
236
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
+
235
252
func (s * testServer ) Close () {
236
253
close (s .closeCh )
237
254
s .tcpListener .Close ()
0 commit comments