@@ -19,6 +19,8 @@ import (
19
19
const (
20
20
CLOB_PAIR_IDS_QUERY_PARAM = "clobPairIds"
21
21
MARKET_IDS_QUERY_PARAM = "marketIds"
22
+
23
+ CLOSE_DEADLINE = 5 * time .Second
22
24
)
23
25
24
26
var upgrader = websocket.Upgrader {
@@ -68,33 +70,30 @@ func (ws *WebsocketServer) Handler(w http.ResponseWriter, r *http.Request) {
68
70
// Parse clobPairIds from query parameters
69
71
clobPairIds , err := parseUint32 (r , CLOB_PAIR_IDS_QUERY_PARAM )
70
72
if err != nil {
71
- ws .logger .Error (
72
- "Error parsing clobPairIds" ,
73
- "err" , err ,
74
- )
75
- http .Error (w , err .Error (), http .StatusBadRequest )
73
+ ws .logger .Error ("Error parsing clobPairIds" , "err" , err )
74
+ if err := sendCloseWithReason (conn , websocket .CloseUnsupportedData , err .Error ()); err != nil {
75
+ ws .logger .Error ("Error sending close message" , "err" , err )
76
+ }
76
77
return
77
78
}
78
79
79
80
// Parse marketIds from query parameters
80
81
marketIds , err := parseUint32 (r , MARKET_IDS_QUERY_PARAM )
81
82
if err != nil {
82
- ws .logger .Error (
83
- "Error parsing marketIds" ,
84
- "err" , err ,
85
- )
86
- http .Error (w , err .Error (), http .StatusBadRequest )
83
+ ws .logger .Error ("Error parsing marketIds" , "err" , err )
84
+ if err := sendCloseWithReason (conn , websocket .CloseUnsupportedData , err .Error ()); err != nil {
85
+ ws .logger .Error ("Error sending close message" , "err" , err )
86
+ }
87
87
return
88
88
}
89
89
90
90
// Parse subaccountIds from query parameters
91
91
subaccountIds , err := parseSubaccountIds (r )
92
92
if err != nil {
93
- ws .logger .Error (
94
- "Error parsing subaccountIds" ,
95
- "err" , err ,
96
- )
97
- http .Error (w , err .Error (), http .StatusBadRequest )
93
+ ws .logger .Error ("Error parsing subaccountIds" , "err" , err )
94
+ if err := sendCloseWithReason (conn , websocket .CloseUnsupportedData , err .Error ()); err != nil {
95
+ ws .logger .Error ("Error sending close message" , "err" , err )
96
+ }
98
97
return
99
98
}
100
99
@@ -118,10 +117,26 @@ func (ws *WebsocketServer) Handler(w http.ResponseWriter, r *http.Request) {
118
117
"Ending handler for websocket connection" ,
119
118
"err" , err ,
120
119
)
120
+ if err := sendCloseWithReason (conn , websocket .CloseInternalServerErr , err .Error ()); err != nil {
121
+ ws .logger .Error ("Error sending close message" , "err" , err )
122
+ }
121
123
return
122
124
}
123
125
}
124
126
127
+ func sendCloseWithReason (conn * websocket.Conn , closeCode int , reason string ) error {
128
+ closeMessage := websocket .FormatCloseMessage (closeCode , reason )
129
+ // Set a write deadline to avoid blocking indefinitely
130
+ if err := conn .SetWriteDeadline (time .Now ().Add (CLOSE_DEADLINE )); err != nil {
131
+ return err
132
+ }
133
+ return conn .WriteControl (
134
+ websocket .CloseMessage ,
135
+ closeMessage ,
136
+ time .Now ().Add (CLOSE_DEADLINE ),
137
+ )
138
+ }
139
+
125
140
// parseSubaccountIds is a helper function to parse the subaccountIds from the query parameters.
126
141
func parseSubaccountIds (r * http.Request ) ([]* satypes.SubaccountId , error ) {
127
142
subaccountIdsParam := r .URL .Query ().Get ("subaccountIds" )
0 commit comments