33package main
44
55import (
6- "errors"
76 "fmt"
87 "log"
9- "net"
108 "net/http"
9+ "net/http/httptest"
1110 "os"
12- "os/exec"
11+ "runtime"
12+ "strings"
1313
1414 "nhooyr.io/websocket"
1515 "nhooyr.io/websocket/internal/wsecho"
1616)
1717
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-
5418func 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 ) {
6320 c , err := websocket .Accept (w , r , & websocket.AcceptOptions {
6421 Subprotocols : []string {"echo" },
6522 InsecureSkipVerify : true ,
@@ -70,11 +27,14 @@ func serve(l net.Listener) error {
7027 defer c .Close (websocket .StatusInternalError , "" )
7128
7229 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 )
7732 }
33+
34+ os .Exit (0 )
7835 }))
7936
37+ wsURL := strings .Replace (s .URL , "http" , "ws" , 1 )
38+ fmt .Printf ("%v\n " , wsURL )
39+ runtime .Goexit ()
8040}
0 commit comments