You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.3 KiB
83 lines
2.3 KiB
package handlers
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"codefirst.iut.uca.fr/git/thomas.bellembois/codefirst-dockerrunner-common/v2/actions"
|
|
"codefirst.iut.uca.fr/git/thomas.bellembois/codefirst-dockerrunner-common/v2/messages"
|
|
"codefirst.iut.uca.fr/git/thomas.bellembois/codefirst-dockerrunner/v2/api"
|
|
"codefirst.iut.uca.fr/git/thomas.bellembois/codefirst-dockerrunner/v2/errors"
|
|
"codefirst.iut.uca.fr/git/thomas.bellembois/codefirst-dockerrunner/v2/globals"
|
|
|
|
"nhooyr.io/websocket"
|
|
"nhooyr.io/websocket/wsjson"
|
|
)
|
|
|
|
func WebSockerHandler(w http.ResponseWriter, r *http.Request) {
|
|
var (
|
|
err error
|
|
wsConnection *websocket.Conn
|
|
authUser string
|
|
)
|
|
|
|
xForwardedUser := r.Header["X-Forwarded-User"]
|
|
if globals.Test {
|
|
xForwardedUser = []string{"thomas.bellembois@uca.fr"}
|
|
}
|
|
|
|
if len(xForwardedUser) == 0 || xForwardedUser[0] == "" {
|
|
w.WriteHeader(http.StatusUnauthorized)
|
|
return
|
|
}
|
|
|
|
authUser = strings.Split(xForwardedUser[0], "@")[0]
|
|
authUser = strings.ReplaceAll(authUser, ".", "")
|
|
|
|
if wsConnection, err = websocket.Accept(w, r, nil); err != nil {
|
|
errors.InternalServerError(w, r, err)
|
|
return
|
|
}
|
|
defer wsConnection.Close(websocket.StatusInternalError, "")
|
|
|
|
ctx := context.Background()
|
|
|
|
for {
|
|
fmt.Println("waiting for web socket message")
|
|
|
|
var (
|
|
message messages.WSMessage
|
|
)
|
|
|
|
if err = wsjson.Read(ctx, wsConnection, &message); err != nil {
|
|
errors.InternalServerError(w, r, err)
|
|
return
|
|
}
|
|
|
|
fmt.Printf("received: %+v\n", message)
|
|
|
|
switch message.Action {
|
|
case actions.GetContainerLog:
|
|
api.GetContainerLog(ctx, wsConnection, message.Container)
|
|
case actions.RemoveContainer:
|
|
api.RemoveContainer(ctx, wsConnection, message.Container, authUser)
|
|
case actions.StartContainer:
|
|
api.StartContainer(ctx, wsConnection, message.Container, authUser)
|
|
case actions.ExecContainer:
|
|
api.ExecContainer(ctx, wsConnection, message.Container, message.Exec, authUser)
|
|
case actions.GetContainers:
|
|
api.GetContainers(ctx, wsConnection, message.Container, authUser)
|
|
case actions.GetConfig:
|
|
api.GetConfig(ctx, wsConnection)
|
|
case actions.Ping:
|
|
api.Pong(ctx, wsConnection)
|
|
case actions.Test:
|
|
api.Test(ctx, wsConnection, message.Container)
|
|
case actions.TestError:
|
|
api.TestError(ctx, wsConnection, message.Container)
|
|
}
|
|
}
|
|
}
|