Skip to content

Commit

Permalink
add websocket http2 support
Browse files Browse the repository at this point in the history
  • Loading branch information
IrineSistiana committed May 25, 2020
1 parent 2cddaa2 commit d22dfa9
Show file tree
Hide file tree
Showing 5 changed files with 161 additions and 118 deletions.
47 changes: 31 additions & 16 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,16 @@
package main

import (
"context"
"crypto/tls"
"fmt"
"log"
"net"
"net/http"
"strings"
"sync"
"time"

"github.com/gorilla/websocket"
"golang.org/x/net/http2"
)

func doClient(l net.Listener, server string, tlsConfig *tls.Config, wss bool, path string, timeout time.Duration, vpnMode, tfo bool) error {
Expand All @@ -35,21 +36,35 @@ func doClient(l net.Listener, server string, tlsConfig *tls.Config, wss bool, pa
Control: getControlFunc(&tcpConfig{vpnMode: vpnMode, tfo: tfo}),
}

wsDialer := &websocket.Dialer{
TLSClientConfig: tlsConfig,
NetDial: func(network, _ string) (net.Conn, error) {
// overwrite url host addr
return dialer.Dial(network, server)
},
WriteBufferPool: &sync.Pool{},
HandshakeTimeout: time.Second * 8,
}
var httpClient *http.Client
var url string
if wss {
transport := &http.Transport{
DialContext: func(ctx context.Context, network, _ string) (net.Conn, error) {
return dialer.DialContext(ctx, network, server)
},
TLSClientConfig: tlsConfig,

if !strings.HasPrefix(path, "/") {
path = "/" + path
}
IdleConnTimeout: time.Minute,
ResponseHeaderTimeout: time.Second * 10,
ForceAttemptHTTP2: true,
}

err := http2.ConfigureTransport(transport) // enable http2
if err != nil {
return err
}

url := "wss://" + tlsConfig.ServerName + path
httpClient = &http.Client{
Transport: transport,
}

if !strings.HasPrefix(path, "/") {
path = "/" + path
}

url = "wss://" + tlsConfig.ServerName + path
}

for {
localConn, err := l.Accept()
Expand All @@ -62,7 +77,7 @@ func doClient(l net.Listener, server string, tlsConfig *tls.Config, wss bool, pa
var serverConn net.Conn

if wss {
serverWSSConn, err := dialWebsocketConn(wsDialer, url)
serverWSSConn, err := dialWebsocketConn(httpClient, url)
if err != nil {
log.Printf("ERROR: doClient: dialWebsocketConn: %v", err)
return
Expand Down
10 changes: 8 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@ module github.com/IrineSistiana/simple-tls
go 1.14

require (
github.com/gorilla/websocket v1.4.2
golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f
github.com/golang/protobuf v1.4.2 // indirect
github.com/gorilla/websocket v1.4.2 // indirect
github.com/klauspost/compress v1.10.6 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2
golang.org/x/sys v0.0.0-20200523222454-059865788121
nhooyr.io/websocket v1.8.6
)
93 changes: 91 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,6 +1,95 @@
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14=
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY=
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0=
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8=
github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo=
github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls=
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/klauspost/compress v1.10.3 h1:OP96hzwJVBIHYU52pVTI6CczrxPvrGfgqF9N5eTO0Q8=
github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/klauspost/compress v1.10.6 h1:SP6zavvTG3YjOosWePXFDlExpKIWMTO4SE/Y8MZB2vI=
github.com/klauspost/compress v1.10.6/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 h1:eDrdRpKgkcCqKZQwyZRyeFZgfqt37SL7Kv3tok06cKE=
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f h1:gWF768j/LaZugp8dyS4UwsslYCYz9XgFxvlgsn0n9H8=
golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200523222454-059865788121 h1:rITEj+UZHYC927n8GT97eC3zrpzXdb/voyeOuVKS46o=
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k=
nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
27 changes: 14 additions & 13 deletions server.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package main

import (
"context"
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
Expand All @@ -34,23 +35,22 @@ import (

mathRand "math/rand"

"github.com/gorilla/websocket"
"nhooyr.io/websocket"
)

func doServer(l net.Listener, tlsConfig *tls.Config, dst string, wss bool, path string, timeout time.Duration) error {
if wss {
httpMux := http.NewServeMux()
wsss := &wssServer{
upgrader: websocket.Upgrader{
HandshakeTimeout: time.Second * 8,
ReadBufferSize: 0,
WriteBufferSize: 0,
},
opt: &websocket.AcceptOptions{CompressionMode: websocket.CompressionDisabled},
dst: dst,
timeout: timeout,
}
httpMux.Handle(path, wsss)
err := http.Serve(tls.NewListener(l, tlsConfig), httpMux)

tc := tlsConfig.Clone()
tc.NextProtos = []string{"h2"}
err := http.Serve(tls.NewListener(l, tc), httpMux)
if err != nil {
return fmt.Errorf("http.Serve: %v", err)
}
Expand Down Expand Up @@ -90,20 +90,21 @@ func doServer(l net.Listener, tlsConfig *tls.Config, dst string, wss bool, path
}

type wssServer struct {
upgrader websocket.Upgrader
dst string
timeout time.Duration
opt *websocket.AcceptOptions
dst string
timeout time.Duration
}

// ServeHTTP implements http.Handler interface
func (s *wssServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
leftWSConn, err := s.upgrader.Upgrade(w, r, nil)

leftWSConn, err := websocket.Accept(w, r, s.opt)
if err != nil {
log.Printf("ERROR: ServeHTTP: %s, Upgrade: %v", r.RemoteAddr, err)
return
}

leftConn := wrapWebSocketConn(leftWSConn)
leftConn := websocket.NetConn(context.Background(), leftWSConn, websocket.MessageBinary)

dstConn, err := net.Dial("tcp", s.dst)
if err != nil {
Expand All @@ -113,7 +114,7 @@ func (s *wssServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
defer dstConn.Close()

if err := openTunnel(dstConn, leftConn, s.timeout); err != nil {
log.Printf(": ServeHTTP: %s: openTunnel: %v", r.RemoteAddr, err)
log.Printf("ServeHTTP: %s: openTunnel: %v", r.RemoteAddr, err)
}
}

Expand Down
102 changes: 17 additions & 85 deletions websocket.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,99 +18,31 @@
package main

import (
"crypto/tls"
"fmt"
"io"
"context"
"net"
"net/http"
"time"

"github.com/gorilla/websocket"
"nhooyr.io/websocket"
)

// webSocketConnWrapper is a wrapper for net.Conn over WebSocket connection.
type webSocketConnWrapper struct {
ws *websocket.Conn
reader io.Reader
}

func wrapWebSocketConn(c *websocket.Conn) net.Conn {
return &webSocketConnWrapper{ws: c}
}

func dialWebsocketConn(d *websocket.Dialer, url string) (net.Conn, error) {
c, _, err := d.Dial(url, nil)
if err != nil {
return nil, err
}

uc := c.UnderlyingConn()
if tlsConn, ok := uc.(*tls.Conn); ok {
if err := tlsHandshakeTimeout(tlsConn, time.Second*5); err != nil {
c.Close()
return nil, fmt.Errorf("tlsHandshakeTimeout: %v", err)
}
}
return wrapWebSocketConn(c), err
}

// Read implements io.Reader.
func (c *webSocketConnWrapper) Read(b []byte) (int, error) {
n, err := c.read(b)
if websocket.IsCloseError(err, websocket.CloseAbnormalClosure) {
err = io.EOF
}
return n, err
}
const (
dialTimeout = time.Second * 3
)

func (c *webSocketConnWrapper) read(b []byte) (int, error) {
var err error
for {
//previous reader reach the EOF, get next reader
if c.reader == nil {
//always BinaryMessage
_, c.reader, err = c.ws.NextReader()
if err != nil {
return 0, err
}
}
func dialWebsocketConn(client *http.Client, url string) (net.Conn, error) {
ctx, cancel := context.WithTimeout(context.Background(), dialTimeout)
defer cancel()

n, err := c.reader.Read(b)
if n == 0 && err == io.EOF {
c.reader = nil
continue //nothing left in this reader
}
return n, err
opt := &websocket.DialOptions{
HTTPClient: client,
CompressionMode: websocket.CompressionDisabled,
HTTPHeader: nil,
}
}

// Write implements io.Writer.
func (c *webSocketConnWrapper) Write(b []byte) (int, error) {
if err := c.ws.WriteMessage(websocket.BinaryMessage, b); err != nil {
return 0, err
c, _, err := websocket.Dial(ctx, url, opt)
if err != nil {
return nil, err
}
return len(b), nil
}

func (c *webSocketConnWrapper) Close() error {
return c.ws.Close()
}

func (c *webSocketConnWrapper) LocalAddr() net.Addr {
return c.ws.LocalAddr()
}

func (c *webSocketConnWrapper) RemoteAddr() net.Addr {
return c.ws.RemoteAddr()
}

func (c *webSocketConnWrapper) SetDeadline(t time.Time) error {
return c.ws.UnderlyingConn().SetDeadline(t)
}

func (c *webSocketConnWrapper) SetReadDeadline(t time.Time) error {
return c.ws.SetReadDeadline(t)
}

func (c *webSocketConnWrapper) SetWriteDeadline(t time.Time) error {
return c.ws.SetWriteDeadline(t)
return websocket.NetConn(context.Background(), c, websocket.MessageBinary), nil
}

0 comments on commit d22dfa9

Please sign in to comment.