@@ -28,6 +28,7 @@ import (
28
28
"github.com/xtls/xray-core/transport"
29
29
"github.com/xtls/xray-core/transport/internet"
30
30
"github.com/xtls/xray-core/transport/internet/stat"
31
+ "github.com/xtls/xray-core/transport/internet/tls"
31
32
)
32
33
33
34
var useSplice bool
@@ -225,9 +226,16 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
225
226
writeConn = inbound .Conn
226
227
inTimer = inbound .Timer
227
228
}
228
- return proxy .CopyRawConnIfExist (ctx , conn , writeConn , link .Writer , timer , inTimer )
229
+ if ! isTLSConn (conn ) { // it would be tls conn in special use case of MITM, we need to let link handle traffic
230
+ return proxy .CopyRawConnIfExist (ctx , conn , writeConn , link .Writer , timer , inTimer )
231
+ }
232
+ }
233
+ var reader buf.Reader
234
+ if destination .Network == net .Network_TCP {
235
+ reader = buf .NewReader (conn )
236
+ } else {
237
+ reader = NewPacketReader (conn , UDPOverride )
229
238
}
230
- reader := NewPacketReader (conn , UDPOverride )
231
239
if err := buf .Copy (reader , output , buf .UpdateActivity (timer )); err != nil {
232
240
return errors .New ("failed to process response" ).Base (err )
233
241
}
@@ -245,6 +253,19 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
245
253
return nil
246
254
}
247
255
256
+ func isTLSConn (conn stat.Connection ) bool {
257
+ if conn != nil {
258
+ statConn , ok := conn .(* stat.CounterConnection )
259
+ if ok {
260
+ conn = statConn .Connection
261
+ }
262
+ if _ , ok := conn .(* tls.Conn ); ok {
263
+ return true
264
+ }
265
+ }
266
+ return false
267
+ }
268
+
248
269
func NewPacketReader (conn net.Conn , UDPOverride net.Destination ) buf.Reader {
249
270
iConn := conn
250
271
statConn , ok := iConn .(* stat.CounterConnection )
0 commit comments