Files
ionscale/internal/handlers/noise.go
T
2023-03-19 10:53:54 +01:00

44 lines
1.1 KiB
Go

package handlers
import (
stderrors "errors"
"github.com/labstack/echo/v4"
"golang.org/x/net/http2"
"golang.org/x/net/http2/h2c"
"io"
"net/http"
"tailscale.com/control/controlhttp"
"tailscale.com/net/netutil"
"tailscale.com/types/key"
)
type NoiseHandlers struct {
controlKey key.MachinePrivate
createPeerHandler CreatePeerHandler
}
type CreatePeerHandler func(p key.MachinePublic) http.Handler
func NewNoiseHandlers(controlKey key.MachinePrivate, createPeerHandler CreatePeerHandler) *NoiseHandlers {
return &NoiseHandlers{
controlKey: controlKey,
createPeerHandler: createPeerHandler,
}
}
func (h *NoiseHandlers) Upgrade(c echo.Context) error {
conn, err := controlhttp.AcceptHTTP(c.Request().Context(), c.Response(), c.Request(), h.controlKey, nil)
if err != nil {
return logError(err)
}
handler := h.createPeerHandler(conn.Peer())
server := http.Server{}
server.Handler = h2c.NewHandler(handler, &http2.Server{})
if err := server.Serve(netutil.NewOneConnListener(conn, nil)); err != nil && !stderrors.Is(err, io.EOF) {
return err
}
return nil
}