Skip to content

Commit

Permalink
- support websocket decompress
Browse files Browse the repository at this point in the history
  • Loading branch information
lesismal committed Jul 4, 2021
1 parent c09bea2 commit 9e4b46f
Show file tree
Hide file tree
Showing 13 changed files with 336 additions and 40 deletions.
2 changes: 1 addition & 1 deletion examples/websocket/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ func main() {

u := url.URL{Scheme: "ws", Host: *addr, Path: *path}
log.Printf("connecting to %s", u.String())

websocket.DefaultDialer.EnableCompression = true
c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
if err != nil {
log.Fatal("dial:", err)
Expand Down
3 changes: 1 addition & 2 deletions examples/websocket/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@ var (
)

func onWebsocket(w http.ResponseWriter, r *http.Request) {
isTLS := false
upgrader := websocket.NewUpgrader(isTLS)
upgrader := &websocket.Upgrader{EnableCompression: true}
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
panic(err)
Expand Down
6 changes: 2 additions & 4 deletions examples/websocket/server_autobahn/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@ import (
)

func onWebsocketFrame(w http.ResponseWriter, r *http.Request) {
isTLS := true
upgrader := websocket.NewUpgrader(isTLS)
upgrader := &websocket.Upgrader{}
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
panic(err)
Expand All @@ -40,8 +39,7 @@ func onWebsocketFrame(w http.ResponseWriter, r *http.Request) {
}

func onWebsocketMessage(w http.ResponseWriter, r *http.Request) {
isTLS := true
upgrader := websocket.NewUpgrader(isTLS)
upgrader := &websocket.Upgrader{}
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
panic(err)
Expand Down
3 changes: 1 addition & 2 deletions examples/websocket/test_websocket/websocket_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@ var (
)

func onWebsocket(cancelFunc context.CancelFunc, maxCount int, w http.ResponseWriter, r *http.Request) {
isTLS := false
upgrader := websocket.NewUpgrader(isTLS)
upgrader := &websocket.Upgrader{}
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
panic(err)
Expand Down
3 changes: 1 addition & 2 deletions examples/websocket_1m/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,7 @@ var (
)

func onWebsocket(w http.ResponseWriter, r *http.Request) {
isTLS := false
upgrader := websocket.NewUpgrader(isTLS)
upgrader := &websocket.Upgrader{}
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
panic(err)
Expand Down
3 changes: 1 addition & 2 deletions examples/websocket_1m_tls/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,7 @@ var (
)

func onWebsocket(w http.ResponseWriter, r *http.Request) {
isTLS := true
upgrader := websocket.NewUpgrader(isTLS)
upgrader := &websocket.Upgrader{}
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
panic(err)
Expand Down
3 changes: 1 addition & 2 deletions examples/websocket_tls/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@ var (

func onWebsocket(w http.ResponseWriter, r *http.Request) {
flag.Parse()
isTLS := true
upgrader := websocket.NewUpgrader(isTLS)
upgrader := &websocket.Upgrader{}
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
panic(err)
Expand Down
3 changes: 1 addition & 2 deletions examples/websocket_tls/sticky/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,7 @@ var (
)

func onWebsocket(w http.ResponseWriter, r *http.Request) {
isTLS := true
upgrader := websocket.NewUpgrader(isTLS)
upgrader := &websocket.Upgrader{}
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
panic(err)
Expand Down
3 changes: 1 addition & 2 deletions examples/websocket_tls/test_tls_websocket/websocket_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,7 @@ BpA7MNLxiqss+rCbwf3NbWxEMiDQ2zRwVoafVFys7tjmv6t2Xck=
`)

func onWebsocket(cancelFunc context.CancelFunc, maxCount int, w http.ResponseWriter, r *http.Request) {
isTLS := false
upgrader := websocket.NewUpgrader(isTLS)
upgrader := &websocket.Upgrader{}
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
panic(err)
Expand Down
3 changes: 1 addition & 2 deletions nbhttp/tests/poller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ var (
)

func onWebsocket(w http.ResponseWriter, r *http.Request) {
isTLS := true
upgrader := websocket.NewUpgrader(isTLS)
upgrader := &websocket.Upgrader{}
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
panic(err)
Expand Down
59 changes: 59 additions & 0 deletions nbhttp/websocket/compression.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package websocket

import (
"compress/flate"
"io"
"sync"
)

const (
minCompressionLevel = -2
maxCompressionLevel = flate.BestCompression
defaultCompressionLevel = 1
)

var (
flateReaderPool = sync.Pool{New: func() interface{} {
return flate.NewReader(nil)
}}
)

const flateReaderTail = "\x00\x00\xff\xff" + "\x01\x00\x00\xff\xff"

func decompressReader(r io.Reader) io.ReadCloser {
fr, _ := flateReaderPool.Get().(io.ReadCloser)
fr.(flate.Resetter).Reset(r, nil)
return &flateReadWrapper{fr}
}

func isValidCompressionLevel(level int) bool {
return minCompressionLevel <= level && level <= maxCompressionLevel
}

type flateReadWrapper struct {
fr io.ReadCloser
}

func (r *flateReadWrapper) Read(p []byte) (int, error) {
if r.fr == nil {
return 0, io.ErrClosedPipe
}
n, err := r.fr.Read(p)
if err == io.EOF {
// Preemptively place the reader back in the pool. This helps with
// scenarios where the application does not call NextReader() soon after
// this final read.
r.Close()
}
return n, err
}

func (r *flateReadWrapper) Close() error {
if r.fr == nil {
return io.ErrClosedPipe
}
err := r.fr.Close()
flateReaderPool.Put(r.fr)
r.fr = nil
return err
}

0 comments on commit 9e4b46f

Please sign in to comment.