1
1
package tests
2
2
3
3
import (
4
+ "errors"
4
5
"fmt"
5
6
"io"
6
7
"net"
7
8
"net/http"
8
9
"strconv"
9
10
"sync/atomic"
10
11
11
- . "github.com/onsi/ginkgo/v2"
12
12
core "k8s.io/api/core/v1"
13
13
"k8s.io/apimachinery/pkg/util/httpstream"
14
14
"k8s.io/client-go/rest"
@@ -28,6 +28,15 @@ type portForwarderImpl struct {
28
28
29
29
var _ PortForwarder = & portForwarderImpl {}
30
30
31
+ type portForwardConn struct {
32
+ net.Conn
33
+ streamConnCloser io.Closer
34
+ }
35
+
36
+ func (p * portForwardConn ) Close () error {
37
+ return errors .Join (p .Conn .Close (), p .streamConnCloser .Close ())
38
+ }
39
+
31
40
func (p * portForwarderImpl ) Connect (pod * core.Pod , remotePort uint16 ) (net.Conn , error ) {
32
41
streamConnection , err := p .createStreamConnection (pod )
33
42
if err != nil {
@@ -56,29 +65,10 @@ func (p *portForwarderImpl) Connect(pod *core.Pod, remotePort uint16) (net.Conn,
56
65
return nil , err
57
66
}
58
67
59
- pipeIn , pipeOut := net .Pipe ()
60
- // Read data from pod
61
- go func () {
62
- defer pipeIn .Close ()
63
- _ , err := io .Copy (pipeIn , dataStream )
64
- if err != nil {
65
- fmt .Fprintf (GinkgoWriter , "Error reading from port-forwarding: %v" , err )
66
- return
67
- }
68
- }()
69
-
70
- // Send data to pod
71
- go func () {
72
- defer streamConnection .Close ()
73
- defer dataStream .Close ()
74
- _ , err := io .Copy (dataStream , pipeIn )
75
- if err != nil {
76
- fmt .Fprintf (GinkgoWriter , "Error writing to port-forwarding: %v" , err )
77
- return
78
- }
79
- }()
80
-
81
- return pipeOut , nil
68
+ return & portForwardConn {
69
+ Conn : dataStream .(net.Conn ),
70
+ streamConnCloser : streamConnection ,
71
+ }, nil
82
72
}
83
73
84
74
func (p * portForwarderImpl ) createStreamConnection (pod * core.Pod ) (httpstream.Connection , error ) {
0 commit comments