package main
import (
- "database/sql"
"encoding/json"
"io"
"net/http"
"sync/atomic"
"time"
+ "git.curoverse.com/arvados.git/sdk/go/ctxlog"
"github.com/Sirupsen/logrus"
"golang.org/x/net/websocket"
)
}
type router struct {
- Config *Config
+ Config *wsConfig
eventSource eventSource
newPermChecker func() permChecker
ReqsActive int64
}
-type DebugStatuser interface {
+type debugStatuser interface {
DebugStatus() interface{}
}
-type sessionFactory func(wsConn, chan<- interface{}, *sql.DB, permChecker) (session, error)
-
func (rtr *router) setup() {
rtr.handler = &handler{
PingTimeout: rtr.Config.PingTimeout.Duration(),
QueueSize: rtr.Config.ClientEventQueue,
}
rtr.mux = http.NewServeMux()
- rtr.mux.Handle("/websocket", rtr.makeServer(NewSessionV0))
- rtr.mux.Handle("/arvados/v1/events.ws", rtr.makeServer(NewSessionV1))
+ rtr.mux.Handle("/websocket", rtr.makeServer(newSessionV0))
+ rtr.mux.Handle("/arvados/v1/events.ws", rtr.makeServer(newSessionV1))
rtr.mux.HandleFunc("/debug.json", jsonHandler(rtr.DebugStatus))
rtr.mux.HandleFunc("/status.json", jsonHandler(rtr.Status))
}
stats := rtr.handler.Handle(ws, rtr.eventSource,
func(ws wsConn, sendq chan<- interface{}) (session, error) {
- return newSession(ws, sendq, rtr.eventSource.DB(), rtr.newPermChecker())
+ return newSession(ws, sendq, rtr.eventSource.DB(), rtr.newPermChecker(), &rtr.Config.Client)
})
log.WithFields(logrus.Fields{
- "Elapsed": time.Now().Sub(t0).Seconds(),
- "Stats": stats,
+ "elapsed": time.Now().Sub(t0).Seconds(),
+ "stats": stats,
}).Info("disconnect")
ws.Close()
}),
"HTTP": rtr.status,
"Outgoing": rtr.handler.DebugStatus(),
}
- if es, ok := rtr.eventSource.(DebugStatuser); ok {
+ if es, ok := rtr.eventSource.(debugStatuser); ok {
s["EventSource"] = es.DebugStatus()
}
return s
logger := logger(req.Context()).
WithField("RequestID", rtr.newReqID())
- ctx := contextWithLogger(req.Context(), logger)
+ ctx := ctxlog.Context(req.Context(), logger)
req = req.WithContext(ctx)
logger.WithFields(logrus.Fields{
- "RemoteAddr": req.RemoteAddr,
- "X-Forwarded-For": req.Header.Get("X-Forwarded-For"),
+ "remoteAddr": req.RemoteAddr,
+ "reqForwardedFor": req.Header.Get("X-Forwarded-For"),
}).Info("accept request")
rtr.mux.ServeHTTP(resp, req)
}
func jsonHandler(fn func() interface{}) http.HandlerFunc {
return func(resp http.ResponseWriter, req *http.Request) {
logger := logger(req.Context())
+ resp.Header().Set("Content-Type", "application/json")
enc := json.NewEncoder(resp)
err := enc.Encode(fn())
if err != nil {