feat: WebSocket upgrader, hub, send, broadcast, handler con tests (issue 0011 fase 3-4)
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
package infra
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"nhooyr.io/websocket"
|
||||
)
|
||||
|
||||
// WSUpgrader hace el upgrade de una conexion HTTP a WebSocket usando nhooyr.io/websocket.
|
||||
// Si origins contiene "*" se acepta cualquier origen (InsecureSkipVerify=true).
|
||||
// En caso contrario, OriginPatterns valida el header Origin del cliente con filepath.Match.
|
||||
// Retorna el *websocket.Conn listo para Read/Write o un error si el handshake falla.
|
||||
func WSUpgrader(w http.ResponseWriter, r *http.Request, origins []string) (*websocket.Conn, error) {
|
||||
opts := &websocket.AcceptOptions{}
|
||||
|
||||
allowAny := false
|
||||
for _, o := range origins {
|
||||
if o == "*" {
|
||||
allowAny = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if allowAny {
|
||||
opts.InsecureSkipVerify = true
|
||||
} else {
|
||||
opts.OriginPatterns = origins
|
||||
}
|
||||
|
||||
conn, err := websocket.Accept(w, r, opts)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("ws upgrade: %w", err)
|
||||
}
|
||||
return conn, nil
|
||||
}
|
||||
Reference in New Issue
Block a user