Compare commits

..

1 Commits

Author SHA1 Message Date
9816426780 feat: adding header support for client 2025-11-21 20:01:49 +07:00
3 changed files with 55 additions and 69 deletions

View File

@@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"log" "log"
"net/http"
"net/url" "net/url"
"strings" "strings"
"time" "time"
@@ -36,6 +37,7 @@ type Message struct {
type SafeWebsocketClientBuilder struct { type SafeWebsocketClientBuilder struct {
baseHost *string `nil_checker:"required"` baseHost *string `nil_checker:"required"`
basePort *uint16 `nil_checker:"required"` basePort *uint16 `nil_checker:"required"`
headers *map[string]string
path *string path *string
rawQuery *string rawQuery *string
isDrop *bool isDrop *bool
@@ -58,6 +60,11 @@ func (b *SafeWebsocketClientBuilder) BasePort(port uint16) *SafeWebsocketClientB
return b return b
} }
func (b *SafeWebsocketClientBuilder) Headers(headers map[string]string) *SafeWebsocketClientBuilder {
b.headers = &headers
return b
}
func (b *SafeWebsocketClientBuilder) UseTLS(useTLS bool) *SafeWebsocketClientBuilder { func (b *SafeWebsocketClientBuilder) UseTLS(useTLS bool) *SafeWebsocketClientBuilder {
b.useTLS = &useTLS b.useTLS = &useTLS
return b return b
@@ -117,6 +124,7 @@ func (b *SafeWebsocketClientBuilder) Build(ctx context.Context) (*SafeWebsocketC
wsClient := SafeWebsocketClient{ wsClient := SafeWebsocketClient{
baseHost: *b.baseHost, baseHost: *b.baseHost,
basePort: *b.basePort, basePort: *b.basePort,
headers: b.headers,
useTLS: *b.useTLS, useTLS: *b.useTLS,
isDrop: *b.isDrop, isDrop: *b.isDrop,
path: b.path, path: b.path,
@@ -142,6 +150,8 @@ func (b *SafeWebsocketClientBuilder) Build(ctx context.Context) (*SafeWebsocketC
type SafeWebsocketClient struct { type SafeWebsocketClient struct {
baseHost string baseHost string
basePort uint16 basePort uint16
headers *map[string]string
isDrop bool isDrop bool
useTLS bool useTLS bool
path *string path *string
@@ -182,7 +192,16 @@ func (wsClient *SafeWebsocketClient) connect() error {
newURL.RawQuery = *wsClient.rawQuery newURL.RawQuery = *wsClient.rawQuery
} }
conn, _, err := websocket.DefaultDialer.Dial(newURL.String(), nil) header := make(http.Header)
if wsClient.headers != nil {
for k, v := range *wsClient.headers {
fmt.Println(k, v)
header.Set(k, v)
}
}
conn, _, err := websocket.DefaultDialer.Dial(newURL.String(), header)
if err != nil { if err != nil {
return fmt.Errorf("failed to connect to %s: %w", wsClient.baseHost, err) return fmt.Errorf("failed to connect to %s: %w", wsClient.baseHost, err)
} }
@@ -268,7 +287,6 @@ func (wsClient *SafeWebsocketClient) readPump() {
return nil return nil
}) })
if wsClient.isDrop {
for { for {
select { select {
case <-ctx.Done(): case <-ctx.Done():
@@ -300,46 +318,12 @@ func (wsClient *SafeWebsocketClient) readPump() {
case <-ctx.Done(): case <-ctx.Done():
return return
default: default:
if wsClient.isDrop {
log.Println("Data channel full, dropping message") log.Println("Data channel full, dropping message")
} }
} }
} }
} else {
for {
select {
case <-ctx.Done():
log.Println("Reader canceled by context")
return
default:
if c == nil {
return
} }
if err := c.SetReadDeadline(time.Now().Add(readDeadline)); err != nil {
log.Printf("error on read deadline: %v\n", err)
return
}
messageType, data, err := c.ReadMessage()
if err != nil {
log.Printf("error on read message: %v\n", err)
wsClient.triggerReconnect()
return
}
if messageType != websocket.TextMessage {
continue
}
select {
case wsClient.dataChannel <- data:
case <-ctx.Done():
return
}
}
}
}
} }
func (wsClient *SafeWebsocketClient) startPingTicker(ctx context.Context) { func (wsClient *SafeWebsocketClient) startPingTicker(ctx context.Context) {
@@ -466,7 +450,7 @@ func (wsClient *SafeWebsocketClient) Close() error {
wsClient.conn.Close() wsClient.conn.Close()
} }
wsClient.isConnected = false wsClient.isConnected = false
close(wsClient.dataChannel) // close(wsClient.dataChannel)
return nil return nil
} }

View File

@@ -27,7 +27,9 @@ func main() {
wsClient, err := client.NewSafeWebsocketClientBuilder(). wsClient, err := client.NewSafeWebsocketClientBuilder().
BaseHost("localhost"). BaseHost("localhost").
BasePort(8080). BasePort(8080).
Path("/ws/test/data_1"). Headers(map[string]string{
"X-MBX-APIKEY": "abcd",
}).Path("/ws/test/data_1").
UseTLS(false). UseTLS(false).
ChannelSize(1). ChannelSize(1).
Build(ctx) Build(ctx)
@@ -44,7 +46,7 @@ func main() {
dataChannel := wsClient.DataChannel() dataChannel := wsClient.DataChannel()
for data := range dataChannel { for data := range dataChannel {
// _ = data _ = data
fmt.Println(string(data)) // fmt.Println(string(data))
} }
} }

View File

@@ -17,7 +17,7 @@ func main() {
s, err := server.NewSafeWebsocketServerBuilder(). s, err := server.NewSafeWebsocketServerBuilder().
BaseHost("localhost"). BaseHost("localhost").
BasePort(8080). BasePort(8080).
ApiKey(""). ApiKey("abcd").
HandleFuncWebsocket("/ws/test/", "data_1", func(c chan []byte) { HandleFuncWebsocket("/ws/test/", "data_1", func(c chan []byte) {
ticker := time.NewTicker(10 * time.Millisecond) ticker := time.NewTicker(10 * time.Millisecond)
for range ticker.C { for range ticker.C {