feat: adding apiKey for authentication
This commit is contained in:
@@ -29,17 +29,17 @@ func main() {
|
||||
BasePort(8080).
|
||||
Path("/ws/test/data_1").
|
||||
UseTLS(false).
|
||||
ChannelSize(30).
|
||||
ChannelSize(1).
|
||||
Build(ctx)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
// go func() {
|
||||
// for range wsClient.ReconnectChannel() {
|
||||
// fmt.Println("Reconnection Success")
|
||||
// }
|
||||
// }()
|
||||
go func() {
|
||||
for range wsClient.ReconnectChannel() {
|
||||
fmt.Println("Reconnection Success")
|
||||
}
|
||||
}()
|
||||
|
||||
dataChannel := wsClient.DataChannel()
|
||||
|
||||
|
||||
28
v1/examples/gobwas-server/main.go
Normal file
28
v1/examples/gobwas-server/main.go
Normal file
@@ -0,0 +1,28 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
)
|
||||
|
||||
func setMaxRLimit() {
|
||||
var rLimit syscall.Rlimit
|
||||
if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
rLimit.Cur = rLimit.Max
|
||||
if err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
setMaxRLimit()
|
||||
// pooler, err := netpool.New()
|
||||
|
||||
// http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
||||
// if _, _, _, err := ws.UpgradeHTTP(r, w); err != nil {
|
||||
// log.Fatal(err)
|
||||
// }
|
||||
// })
|
||||
// epoller, err := MkEp
|
||||
}
|
||||
@@ -17,6 +17,7 @@ func main() {
|
||||
s, err := server.NewSafeWebsocketServerBuilder().
|
||||
BaseHost("localhost").
|
||||
BasePort(8080).
|
||||
ApiKey("").
|
||||
HandleFuncWebsocket("/ws/test/", "data_1", func(c chan []byte) {
|
||||
ticker := time.NewTicker(10 * time.Millisecond)
|
||||
for range ticker.C {
|
||||
|
||||
@@ -5,14 +5,27 @@ import (
|
||||
"log"
|
||||
"net/http"
|
||||
"strings"
|
||||
"syscall"
|
||||
|
||||
"git.neurocipta.com/rogerferdinan/safe-web-socket/internal"
|
||||
"github.com/gorilla/websocket"
|
||||
)
|
||||
|
||||
func setMaxRLimit() {
|
||||
var rLimit syscall.Rlimit
|
||||
if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
rLimit.Cur = rLimit.Max
|
||||
if err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
type SafeWebsocketServerBuilder struct {
|
||||
baseHost *string `nil_checker:"required"`
|
||||
basePort *uint16 `nil_checker:"required"`
|
||||
apiKey *string `nil_checker:"required"`
|
||||
upgrader *websocket.Upgrader `nil_checker:"required"`
|
||||
mux *http.ServeMux `nil_checker:"required"`
|
||||
}
|
||||
@@ -40,16 +53,17 @@ func (b *SafeWebsocketServerBuilder) BasePort(basePort uint16) *SafeWebsocketSer
|
||||
return b
|
||||
}
|
||||
|
||||
func (b *SafeWebsocketServerBuilder) HandleFunc(
|
||||
pattern string, fn func(http.ResponseWriter, *http.Request),
|
||||
) *SafeWebsocketServerBuilder {
|
||||
func (b *SafeWebsocketServerBuilder) ApiKey(apiKey string) *SafeWebsocketServerBuilder {
|
||||
b.apiKey = &apiKey
|
||||
return b
|
||||
}
|
||||
|
||||
func (b *SafeWebsocketServerBuilder) HandleFunc(pattern string, fn func(http.ResponseWriter, *http.Request)) *SafeWebsocketServerBuilder {
|
||||
b.mux.HandleFunc(pattern, fn)
|
||||
return b
|
||||
}
|
||||
|
||||
func (b *SafeWebsocketServerBuilder) HandleFuncWebsocket(
|
||||
pattern string, subscribedPath string, writeFunc func(chan []byte),
|
||||
) *SafeWebsocketServerBuilder {
|
||||
func (b *SafeWebsocketServerBuilder) HandleFuncWebsocket(pattern string, subscribedPath string, writeFunc func(chan []byte)) *SafeWebsocketServerBuilder {
|
||||
h := internal.NewHub()
|
||||
h.Run()
|
||||
|
||||
@@ -79,22 +93,36 @@ func (b *SafeWebsocketServerBuilder) Build() (*SafeWebsocketServer, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
setMaxRLimit()
|
||||
safeServer := SafeWebsocketServer{
|
||||
url: fmt.Sprintf("%s:%d", *b.baseHost, *b.basePort),
|
||||
mux: b.mux,
|
||||
mux: b.mux,
|
||||
url: fmt.Sprintf("%s:%d", *b.baseHost, *b.basePort),
|
||||
apiKey: *b.apiKey,
|
||||
}
|
||||
return &safeServer, nil
|
||||
}
|
||||
|
||||
type SafeWebsocketServer struct {
|
||||
hub *internal.Hub
|
||||
mux *http.ServeMux
|
||||
url string
|
||||
mux *http.ServeMux
|
||||
url string
|
||||
apiKey string
|
||||
}
|
||||
|
||||
func (s *SafeWebsocketServer) AuthMiddleware(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Header.Get("X-MBX-APIKEY") != s.apiKey {
|
||||
internal.ErrorResponse(w, internal.NewStatusMessage().
|
||||
StatusCode(http.StatusForbidden).
|
||||
Message("X-MBX-APIKEY is missing").
|
||||
Build())
|
||||
}
|
||||
next.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
|
||||
func (s *SafeWebsocketServer) ListenAndServe() error {
|
||||
log.Printf("HTTP serve on %s\n", s.url)
|
||||
if err := http.ListenAndServe(s.url, s.mux); err != nil {
|
||||
if err := http.ListenAndServe(s.url, s.AuthMiddleware(s.mux)); err != nil {
|
||||
return fmt.Errorf("failed to serve websocket: %w", err)
|
||||
}
|
||||
return nil
|
||||
|
||||
Reference in New Issue
Block a user