github.com/angenalZZZ/gofunc@v0.0.0-20210507121333-48ff1be3917b/cmd/fastcache1e6/prod_ws.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/gobwas/ws"
     6  	"io"
     7  	"net"
     8  )
     9  
    10  func ProdWS() {
    11  	addr := fmt.Sprintf("127.0.0.1:%d", *flagPort)
    12  	l, err := net.Listen("tcp", addr)
    13  	if err != nil {
    14  		_ = fmt.Errorf("Io2WS failed to serve: %v\n", err)
    15  		return
    16  	}
    17  	fmt.Printf("Io2WS server is listening on %s\n", addr)
    18  	for {
    19  		conn, err := l.Accept()
    20  		if err != nil {
    21  			_ = fmt.Errorf("Io2WS failed to serve: %v\n", err)
    22  			continue
    23  		}
    24  		_, err = ws.Upgrade(conn)
    25  		if err != nil {
    26  			continue
    27  		}
    28  
    29  		go func(conn net.Conn) {
    30  			defer conn.Close()
    31  
    32  			for {
    33  				header, err := ws.ReadHeader(conn)
    34  				if err != nil {
    35  					_ = fmt.Errorf("Io2WS failed to ReadHeader: %v\n", err)
    36  					return
    37  				}
    38  				if header.OpCode == ws.OpClose {
    39  					_ = fmt.Errorf("Io2WS client to Close: %v\n", err)
    40  					return
    41  				}
    42  
    43  				payload := make([]byte, header.Length)
    44  				_, err = io.ReadFull(conn, payload)
    45  				if err != nil {
    46  					_ = fmt.Errorf("Io2WS failed to serve: %v\n", err)
    47  					continue
    48  				}
    49  
    50  				if header.Masked {
    51  					ws.Cipher(payload, header.Mask, 0)
    52  				}
    53  
    54  				// Reset the Masked flag, server frames must not be masked as RFC6455 says.
    55  				header.Masked = false
    56  				if err = ws.WriteHeader(conn, header); err != nil {
    57  					_ = fmt.Errorf("Io2WS failed to WriteHeader: %v\n", err)
    58  					return
    59  				}
    60  
    61  				result := defaultService.Handle(payload)
    62  				if _, err := conn.Write(result); err != nil {
    63  					_ = fmt.Errorf("Io2WS failed to Write: %v\n", err)
    64  				}
    65  			}
    66  		}(conn)
    67  	}
    68  }