@@ -36,12 +36,12 @@ var defaultHeader = http.Header{
36
36
"user-agent" : []string {"grpc-go/1.36.0" },
37
37
}
38
38
39
- type DialFn = func (network , addr string ) (net.Conn , error )
39
+ type DialFn = func (ctx context. Context , network , addr string ) (net.Conn , error )
40
40
41
41
type Conn struct {
42
- initFn func () (io.ReadCloser , netAddr , error )
43
- writer io.Writer
44
- flusher http. Flusher
42
+ initFn func () (io.ReadCloser , netAddr , error )
43
+ writer io.Writer
44
+ closer io. Closer
45
45
netAddr
46
46
47
47
reader io.ReadCloser
@@ -149,8 +149,8 @@ func (g *Conn) Write(b []byte) (n int, err error) {
149
149
err = g .err
150
150
}
151
151
152
- if g . flusher != nil {
153
- g . flusher .Flush ()
152
+ if flusher , ok := g . writer .(http. Flusher ); ok {
153
+ flusher .Flush ()
154
154
}
155
155
156
156
return len (b ), err
@@ -172,8 +172,8 @@ func (g *Conn) WriteBuffer(buffer *buf.Buffer) error {
172
172
err = g .err
173
173
}
174
174
175
- if g . flusher != nil {
176
- g . flusher .Flush ()
175
+ if flusher , ok := g . writer .(http. Flusher ); ok {
176
+ flusher .Flush ()
177
177
}
178
178
179
179
return err
@@ -185,14 +185,27 @@ func (g *Conn) FrontHeadroom() int {
185
185
186
186
func (g * Conn ) Close () error {
187
187
g .close .Store (true )
188
+ var errorArr []error
189
+
188
190
if reader := g .reader ; reader != nil {
189
- reader .Close ()
191
+ if err := reader .Close (); err != nil {
192
+ errorArr = append (errorArr , err )
193
+ }
190
194
}
191
195
192
196
if closer , ok := g .writer .(io.Closer ); ok {
193
- return closer .Close ()
197
+ if err := closer .Close (); err != nil {
198
+ errorArr = append (errorArr , err )
199
+ }
194
200
}
195
- return nil
201
+
202
+ if closer := g .closer ; closer != nil {
203
+ if err := closer .Close (); err != nil {
204
+ errorArr = append (errorArr , err )
205
+ }
206
+ }
207
+
208
+ return errors .Join (errorArr ... )
196
209
}
197
210
198
211
func (g * Conn ) SetReadDeadline (t time.Time ) error { return g .SetDeadline (t ) }
@@ -212,7 +225,7 @@ func (g *Conn) SetDeadline(t time.Time) error {
212
225
213
226
func NewHTTP2Client (dialFn DialFn , tlsConfig * tls.Config , Fingerprint string , realityConfig * tlsC.RealityConfig ) * TransportWrap {
214
227
dialFunc := func (ctx context.Context , network , addr string , cfg * tls.Config ) (net.Conn , error ) {
215
- pconn , err := dialFn (network , addr )
228
+ pconn , err := dialFn (ctx , network , addr )
216
229
if err != nil {
217
230
return nil , err
218
231
}
@@ -327,10 +340,17 @@ func StreamGunWithTransport(transport *TransportWrap, cfg *Config) (net.Conn, er
327
340
}
328
341
329
342
func StreamGunWithConn (conn net.Conn , tlsConfig * tls.Config , cfg * Config , realityConfig * tlsC.RealityConfig ) (net.Conn , error ) {
330
- dialFn := func (network , addr string ) (net.Conn , error ) {
343
+ dialFn := func (ctx context. Context , network , addr string ) (net.Conn , error ) {
331
344
return conn , nil
332
345
}
333
346
334
347
transport := NewHTTP2Client (dialFn , tlsConfig , cfg .ClientFingerprint , realityConfig )
335
- return StreamGunWithTransport (transport , cfg )
348
+ c , err := StreamGunWithTransport (transport , cfg )
349
+ if err != nil {
350
+ return nil , err
351
+ }
352
+ if c , ok := c .(* Conn ); ok { // The incoming net.Conn should be closed synchronously with the generated gun.Conn
353
+ c .closer = conn
354
+ }
355
+ return c , nil
336
356
}
0 commit comments