123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- package app
- import (
- "net/http"
- "context"
- "github.com/gorilla/mux"
- opentracing "github.com/opentracing/opentracing-go"
- log "github.com/sirupsen/logrus"
- "github.com/weaveworks/scope/common/xfer"
- )
- // RegisterPipeRoutes registers the pipe routes
- func RegisterPipeRoutes(router *mux.Router, pr PipeRouter) {
- router.Methods("GET").
- Name("api_pipe_pipeid_check").
- Path("/api/pipe/{pipeID}/check").
- HandlerFunc(requestContextDecorator(checkPipe(pr)))
- router.Methods("GET").
- Name("api_pipe_pipeid").
- Path("/api/pipe/{pipeID}").
- HandlerFunc(requestContextDecorator(handlePipeWs(pr, UIEnd)))
- router.Methods("GET").
- Name("api_pipe_pipeid_probe").
- Path("/api/pipe/{pipeID}/probe").
- HandlerFunc(requestContextDecorator(handlePipeWs(pr, ProbeEnd)))
- router.Methods("DELETE", "POST").
- Name("api_pipe_pipeid").
- Path("/api/pipe/{pipeID}").
- HandlerFunc(requestContextDecorator(deletePipe(pr)))
- }
- func checkPipe(pr PipeRouter) CtxHandlerFunc {
- return func(ctx context.Context, w http.ResponseWriter, r *http.Request) {
- id := mux.Vars(r)["pipeID"]
- exists, err := pr.Exists(ctx, id)
- if err != nil {
- respondWith(ctx, w, http.StatusInternalServerError, err)
- } else if exists {
- w.WriteHeader(http.StatusNoContent)
- } else {
- http.NotFound(w, r)
- }
- }
- }
- func handlePipeWs(pr PipeRouter, end End) CtxHandlerFunc {
- return func(ctx context.Context, w http.ResponseWriter, r *http.Request) {
- id := mux.Vars(r)["pipeID"]
- pipe, endIO, err := pr.Get(ctx, id, end)
- if err != nil {
- // this usually means the pipe has been closed
- log.Debugf("Error getting pipe %s: %v", id, err)
- http.NotFound(w, r)
- return
- }
- defer pr.Release(ctx, id, end)
- conn, err := xfer.Upgrade(w, r, nil)
- if err != nil {
- log.Errorf("Error upgrading pipe %s (%d) websocket: %v", id, end, err)
- return
- }
- defer conn.Close()
- if _, err := pipe.CopyToWebsocket(endIO, conn); err != nil {
- if span := opentracing.SpanFromContext(ctx); span != nil {
- span.LogKV("error", err.Error())
- }
- log.Errorf("Error copying to pipe %s (%d) websocket: %v", id, end, err)
- }
- }
- }
- func deletePipe(pr PipeRouter) CtxHandlerFunc {
- return func(ctx context.Context, w http.ResponseWriter, r *http.Request) {
- pipeID := mux.Vars(r)["pipeID"]
- log.Debugf("Deleting pipe %s", pipeID)
- if err := pr.Delete(ctx, pipeID); err != nil {
- respondWith(ctx, w, http.StatusInternalServerError, err)
- }
- }
- }
|