Files
job-search/internal/websocket/http.go
T
bwilliams 465358609a Naming, layout and comments: descriptive full-word names, one item per line in wrapped calls and literals, and doc comments on exported names
Short and single-letter names in application code become full words (tests
keep theirs). Wrapped calls, signatures and composite literals put one item
per line, and one-line function bodies are expanded. Exported names and
groups of constants get doc comments, and comments refer to the renamed
identifiers.
2026-10-15 16:12:56 +01:00

46 lines
1.3 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.logger().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())
client := newClient(h, conn, ip, cancel)
if !h.register(client) {
cancel()
conn.Close(ws.StatusGoingAway, "server shutting down") //nolint:errcheck,gosec // turned away
return
}
defer h.unregister(client)
h.logger().Info("client connected", "client", client.id, "ip", ip)
client.run(ctx)
h.logger().Info("client disconnected", "client", client.id, "ip", ip)
}