3
3
package main
4
4
5
5
import (
6
- "errors"
7
6
"fmt"
8
7
"log"
9
- "net"
10
8
"net/http"
9
+ "net/http/httptest"
11
10
"os"
12
- "os/exec"
11
+ "runtime"
12
+ "strings"
13
13
14
14
"nhooyr.io/websocket"
15
15
"nhooyr.io/websocket/internal/wsecho"
16
16
)
17
17
18
- func fork () net.Listener {
19
- if os .Getenv ("FORKED" ) != "" {
20
- f := os .NewFile (3 , "listener" )
21
- l , err := net .FileListener (f )
22
- if err != nil {
23
- log .Fatalf ("failed to create listener from fd: %+v" , err )
24
- }
25
- return l
26
- }
27
-
28
- l , err := net .Listen ("tcp" , "localhost:0" )
29
- if err != nil {
30
- log .Fatalf ("failed to listen: %+v" , err )
31
- }
32
- f , err := l .(* net.TCPListener ).File ()
33
- if err != nil {
34
- log .Fatalf ("failed to get file from tcp listener: %+v" , err )
35
- }
36
-
37
- cmd := exec .Command (os .Args [0 ])
38
- cmd .Stderr = os .Stderr
39
- cmd .Env = append (os .Environ (),
40
- fmt .Sprintf ("FORKED=true" ),
41
- )
42
- cmd .ExtraFiles = append (cmd .ExtraFiles , f )
43
- err = cmd .Start ()
44
- if err != nil {
45
- log .Fatalf ("failed to start command: %+v" , err )
46
- }
47
-
48
- fmt .Printf ("ws://%v\n " , l .Addr ().String ())
49
- os .Exit (0 )
50
-
51
- panic ("unreachable" )
52
- }
53
-
54
18
func main () {
55
- l := fork ()
56
-
57
- err := serve (l )
58
- log .Fatalf ("failed to serve: %+v" , err )
59
- }
60
-
61
- func serve (l net.Listener ) error {
62
- return http .Serve (l , http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
19
+ s := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
63
20
c , err := websocket .Accept (w , r , & websocket.AcceptOptions {
64
21
Subprotocols : []string {"echo" },
65
22
InsecureSkipVerify : true ,
@@ -70,11 +27,14 @@ func serve(l net.Listener) error {
70
27
defer c .Close (websocket .StatusInternalError , "" )
71
28
72
29
err = wsecho .Loop (r .Context (), c )
73
-
74
- var ce websocket.CloseError
75
- if ! errors .As (err , & ce ) || ce .Code != websocket .StatusNormalClosure {
76
- log .Fatalf ("unexpected loop error: %+v" , err )
30
+ if websocket .CloseStatus (err ) != websocket .StatusNormalClosure {
31
+ log .Fatalf ("unexpected echo loop error: %+v" , err )
77
32
}
33
+
34
+ os .Exit (0 )
78
35
}))
79
36
37
+ wsURL := strings .Replace (s .URL , "http" , "ws" , 1 )
38
+ fmt .Printf ("%v\n " , wsURL )
39
+ runtime .Goexit ()
80
40
}
0 commit comments