Files
job-search/internal/websocket/http.go
T
bwilliams e19c8c2b69 Imports split into three groups: standard library, third-party, then this project's own packages
gci is configured with the sections standard, default and localmodule, and
goimports with the module path as its local prefix, so both formatters
agree.
2026-10-14 17:40:06 +01:00

46 lines
1.2 KiB
Go

package websocket
import (
"context"
"net/http"
ws "github.com/coder/websocket"
"git.avsdev.uk/Go/job-search/internal/middleware"
)
// ServeHTTP upgrades an http connection and runs the client until it closes.
func (h *Hub) ServeHTTP(w http.ResponseWriter, r *http.Request) {
mode := ws.CompressionDisabled
if h.conf.EnableCompression {
mode = ws.CompressionContextTakeover
}
// Accept enforces the Origin check: same host, or one of OriginPatterns.
// That is the defence against cross-site WebSocket hijacking.
conn, err := ws.Accept(w, r, &ws.AcceptOptions{
CompressionMode: mode,
})
if err != nil {
h.log.Debug("upgrade failed", "error", err)
return // Accept has already written the HTTP error.
}
defer conn.CloseNow() //nolint:errcheck // finished with; it may already be closed
conn.SetReadLimit(int64(h.maxMessageSize()))
ip := middleware.ClientIP(r)
ctx, cancel := context.WithCancel(r.Context())
c := newClient(h, conn, ip, cancel)
if !h.register(c) {
cancel()
conn.Close(ws.StatusGoingAway, "server shutting down") //nolint:errcheck,gosec // turned away
return
}
defer h.unregister(c)
h.log.Info("client connected", "client", c.id, "ip", ip)
c.run(ctx)
h.log.Info("client disconnected", "client", c.id, "ip", ip)
}