@@ -23,13 +23,11 @@ package proxy
23
23
import (
24
24
"bufio"
25
25
"bytes"
26
- "fmt"
27
26
"github.com/stretchr/testify/require"
28
27
fh "github.com/valyala/fasthttp"
29
28
"net"
30
29
h "net/http"
31
30
ht "net/http/httptest"
32
- "sync"
33
31
"testing"
34
32
"time"
35
33
)
@@ -41,7 +39,7 @@ func TestFastProxyRoundTrip(t *testing.T) {
41
39
resp .SetBodyString (blabla )
42
40
buff := new (bytes.Buffer )
43
41
resp .WriteTo (buff )
44
- server := newMockConn (buff .String ())
42
+ server := newMockConn (buff .String (), false )
45
43
dial := func (iface string ) func (string ,
46
44
string ) (net.Conn , error ) {
47
45
return func (network , addr string ) (n net.Conn , e error ) {
@@ -55,7 +53,7 @@ func TestFastProxyRoundTrip(t *testing.T) {
55
53
req .SetBodyString (bla )
56
54
buff0 := new (bytes.Buffer )
57
55
req .WriteTo (buff0 )
58
- client := newMockConn (buff0 .String ())
56
+ client := newMockConn (buff0 .String (), false )
59
57
60
58
ctl := func (o * Operation ) * Result { return new (Result ) }
61
59
p := NewFastProxy (ctl , dial , time .Now )
@@ -77,7 +75,7 @@ func TestFastProxyRoundTrip(t *testing.T) {
77
75
78
76
func TestFastProxyConnect (t * testing.T ) {
79
77
bla , blabla := "bla" , "blabla"
80
- server := newMockConn (blabla )
78
+ server := newMockConn (blabla , false )
81
79
dial := func (iface string ) func (string , string ) (net.Conn ,
82
80
error ) {
83
81
return func (network , addr string ) (n net.Conn , e error ) {
@@ -97,7 +95,7 @@ func TestFastProxyConnect(t *testing.T) {
97
95
_ , e := r .WriteTo (buff )
98
96
require .NoError (t , e )
99
97
s := buff .String ()
100
- client := newMockConn (s + bla )
98
+ client := newMockConn (s + bla , false )
101
99
// client connection has the content of a valid request followed
102
100
// by raw data
103
101
e0 := srv .ServeConn (client )
@@ -124,7 +122,7 @@ func TestStdProxyRoundTrip(t *testing.T) {
124
122
r := ht .NewRequest (h .MethodGet , "http://example.com" , nil )
125
123
resp .Request = r
126
124
s := buff .String ()
127
- server := newMockConn (s )
125
+ server := newMockConn (s , true )
128
126
dial := func (iface string ) func (string , string ) (net.Conn ,
129
127
error ) {
130
128
return func (network , addr string ) (n net.Conn , e error ) {
@@ -141,7 +139,9 @@ func TestStdProxyRoundTrip(t *testing.T) {
141
139
func TestStdProxyConnect (t * testing.T ) {
142
140
ctl := func (o * Operation ) * Result { return new (Result ) }
143
141
bla , blabla := "bla" , "blabla"
144
- client , server := newMockConn (bla ), newMockConn (blabla )
142
+ client , server :=
143
+ newMockConn (bla , false ),
144
+ newMockConn (blabla , false )
145
145
dial := func (iface string ) func (string , string ) (net.Conn ,
146
146
error ) {
147
147
return func (network , addr string ) (n net.Conn , e error ) {
@@ -177,7 +177,9 @@ func (j *hijacker) Hijack() (c net.Conn,
177
177
178
178
func TestCopyConns (t * testing.T ) {
179
179
bla , blabla := "bla" , "blabla"
180
- client , server := newMockConn (bla ), newMockConn (blabla )
180
+ client , server :=
181
+ newMockConn (bla , false ),
182
+ newMockConn (blabla , false )
181
183
copyConns (server , client )
182
184
<- client .clöse
183
185
<- server .clöse
@@ -186,53 +188,44 @@ func TestCopyConns(t *testing.T) {
186
188
}
187
189
188
190
type mockConn struct {
189
- name string
190
- read * bytes.Buffer
191
- write * bytes.Buffer
192
- clöse chan bool
193
- closed bool
194
- closedAcc * sync.Mutex
191
+ name string
192
+ read * bytes.Buffer
193
+ write * bytes.Buffer
194
+ clöse chan bool
195
+ closed bool
196
+ writeFirst bool
197
+ writeOk chan bool
195
198
}
196
199
197
- func newMockConn (content string ) (m * mockConn ) {
200
+ func newMockConn (content string , writeFirst bool ) (m * mockConn ) {
198
201
m = & mockConn {
199
- read : bytes .NewBufferString (content ),
200
- write : new (bytes.Buffer ),
201
- clöse : make (chan bool , 1 ),
202
- closedAcc : new (sync.Mutex ),
202
+ read : bytes .NewBufferString (content ),
203
+ write : new (bytes.Buffer ),
204
+ clöse : make (chan bool , 1 ),
205
+ writeOk : make (chan bool , 1 ),
206
+ writeFirst : writeFirst ,
203
207
}
204
208
return
205
209
}
206
210
207
211
func (m * mockConn ) Read (p []byte ) (n int , e error ) {
208
- m .closedAcc .Lock ()
209
- closed := m .closed
210
- m .closedAcc .Unlock ()
211
- if closed {
212
- e = fmt .Errorf ("closed" )
213
- } else {
214
- n , e = m .read .Read (p )
212
+ if m .writeFirst && m .read .Len () != 0 {
213
+ <- m .writeOk
215
214
}
215
+ n , e = m .read .Read (p )
216
216
return
217
217
}
218
218
219
219
func (m * mockConn ) Write (p []byte ) (n int , e error ) {
220
- m .closedAcc .Lock ()
221
- closed := m .closed
222
- m .closedAcc .Unlock ()
223
- if closed {
224
- e = fmt .Errorf ("closed" )
225
- } else {
226
- n , e = m .write .Write (p )
220
+ n , e = m .write .Write (p )
221
+ if m .writeFirst {
222
+ m .writeOk <- true
227
223
}
228
224
return
229
225
}
230
226
231
227
func (m * mockConn ) Close () (e error ) {
232
- m .closedAcc .Lock ()
233
- m .closed = true
234
- m .closedAcc .Unlock ()
235
- m .clöse <- m .closed
228
+ m .clöse <- true
236
229
return
237
230
}
238
231
0 commit comments