moved websocket utils to separate package to allow use by the agent.

This commit is contained in:
Erik Brakkee 2024-07-20 19:37:17 +02:00
parent 6857eb6ff9
commit 3e6ec05877
4 changed files with 45 additions and 36 deletions

View File

@ -171,7 +171,7 @@ func main() {
wsConn := iowrappers.NewWebSocketConn(conn) wsConn := iowrappers.NewWebSocketConn(conn)
defer wsConn.Close() defer wsConn.Close()
listener, err := yamux.Client(wsConn, nil) listener, err := yamux.Server(wsConn, nil)
if err != nil { if err != nil {
panic(err) panic(err)
} }

View File

@ -3,39 +3,13 @@ package main
import ( import (
"cidebug/pkg/converge" "cidebug/pkg/converge"
"cidebug/pkg/iowrappers" "cidebug/pkg/iowrappers"
"cidebug/pkg/websocketutil"
"fmt" "fmt"
"github.com/gorilla/websocket"
"log" "log"
"net/http" "net/http"
"regexp" "regexp"
) )
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
func handleWebSocket(w http.ResponseWriter, r *http.Request,
handler func(w http.ResponseWriter, r *http.Request, websockerConnection iowrappers.ReadWriteAddrCloser)) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("Error upgrading to WebSocket:", err)
return
}
wsConn := iowrappers.NewWebSocketConn(conn)
defer wsConn.Close()
handler(w, r, wsConn)
}
type WebSocketService struct {
handler func(w http.ResponseWriter, r *http.Request, conn iowrappers.ReadWriteAddrCloser)
}
func (endpoint *WebSocketService) handle(w http.ResponseWriter, r *http.Request) {
handleWebSocket(w, r, endpoint.handler)
}
func parsePublicId(path string) (publicId string, _ error) { func parsePublicId(path string) (publicId string, _ error) {
pattern := regexp.MustCompile("^/[^/]+/([^/]+)$") pattern := regexp.MustCompile("^/[^/]+/([^/]+)$")
matches := pattern.FindStringSubmatch(path) matches := pattern.FindStringSubmatch(path)
@ -48,8 +22,8 @@ func parsePublicId(path string) (publicId string, _ error) {
func main() { func main() {
admin := converge.NewAdmin() admin := converge.NewAdmin()
registrationService := WebSocketService{ registrationService := websocketutil.WebSocketService{
handler: func(w http.ResponseWriter, r *http.Request, conn iowrappers.ReadWriteAddrCloser) { Handler: func(w http.ResponseWriter, r *http.Request, conn iowrappers.ReadWriteAddrCloser) {
publicId, err := parsePublicId(r.URL.Path) publicId, err := parsePublicId(r.URL.Path)
if err != nil { if err != nil {
log.Printf("Cannot parse public id from url: '%v'\n", err) log.Printf("Cannot parse public id from url: '%v'\n", err)
@ -62,8 +36,8 @@ func main() {
} }
}, },
} }
clientService := WebSocketService{ clientService := websocketutil.WebSocketService{
handler: func(w http.ResponseWriter, r *http.Request, conn iowrappers.ReadWriteAddrCloser) { Handler: func(w http.ResponseWriter, r *http.Request, conn iowrappers.ReadWriteAddrCloser) {
publicId, err := parsePublicId(r.URL.Path) publicId, err := parsePublicId(r.URL.Path)
if err != nil { if err != nil {
log.Printf("Cannot parse public id from url: '%v'\n", err) log.Printf("Cannot parse public id from url: '%v'\n", err)
@ -77,8 +51,8 @@ func main() {
}, },
} }
http.HandleFunc("/agent/", registrationService.handle) http.HandleFunc("/agent/", registrationService.Handle)
http.HandleFunc("/client/", clientService.handle) http.HandleFunc("/client/", clientService.Handle)
// Start HTTP server // Start HTTP server
fmt.Println("Rendez-vous server listening on :8000") fmt.Println("Rendez-vous server listening on :8000")

View File

@ -85,11 +85,12 @@ func (admin *Admin) addAgent(publicId string, conn io.ReadWriteCloser) (*Agent,
if agent != nil { if agent != nil {
return nil, fmt.Errorf("A different agent with same publicId '%s' already registered", publicId) return nil, fmt.Errorf("A different agent with same publicId '%s' already registered", publicId)
} }
session, err := yamux.Client(conn, nil)
clientSession, err := yamux.Client(conn, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
agent = NewAgent(publicId, session) agent = NewAgent(publicId, clientSession)
admin.agents[publicId] = agent admin.agents[publicId] = agent
admin.logStatus() admin.logStatus()
return agent, nil return agent, nil

View File

@ -0,0 +1,34 @@
package websocketutil
import (
"cidebug/pkg/iowrappers"
"github.com/gorilla/websocket"
"log"
"net/http"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
func handleWebSocket(w http.ResponseWriter, r *http.Request,
handler func(w http.ResponseWriter, r *http.Request, websockerConnection iowrappers.ReadWriteAddrCloser)) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("Error upgrading to WebSocket:", err)
return
}
wsConn := iowrappers.NewWebSocketConn(conn)
defer wsConn.Close()
handler(w, r, wsConn)
}
type WebSocketService struct {
Handler func(w http.ResponseWriter, r *http.Request, conn iowrappers.ReadWriteAddrCloser)
}
func (endpoint *WebSocketService) Handle(w http.ResponseWriter, r *http.Request) {
handleWebSocket(w, r, endpoint.Handler)
}