gci is configured with the sections standard, default and localmodule, and goimports with the module path as its local prefix, so both formatters agree.
46 lines
1.2 KiB
Go
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)
|
|
}
|