mirror of
https://github.com/openziti/zrok.git
synced 2025-06-21 18:21:34 +02:00
early progress on embedded Caddy for --backend-mode web (#392)
This commit is contained in:
parent
1c1d20700e
commit
08bdc63d77
@ -5,6 +5,7 @@ import (
|
|||||||
"github.com/openziti/transport/v2"
|
"github.com/openziti/transport/v2"
|
||||||
"github.com/openziti/transport/v2/tcp"
|
"github.com/openziti/transport/v2/tcp"
|
||||||
"github.com/openziti/transport/v2/udp"
|
"github.com/openziti/transport/v2/udp"
|
||||||
|
_ "github.com/openziti/zrok/endpoints"
|
||||||
"github.com/openziti/zrok/tui"
|
"github.com/openziti/zrok/tui"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
@ -157,11 +157,11 @@ func (cmd *sharePublicCommand) run(_ *cobra.Command, args []string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case "web":
|
case "web":
|
||||||
cfg := &proxy.WebBackendConfig{
|
cfg := &proxy.CaddyWebBackendConfig{
|
||||||
IdentityPath: zif,
|
IdentityPath: zif,
|
||||||
WebRoot: target,
|
WebRoot: target,
|
||||||
ShrToken: resp.Payload.ShrToken,
|
ShrToken: resp.Payload.ShrToken,
|
||||||
RequestsChan: requestsChan,
|
Requests: requestsChan,
|
||||||
}
|
}
|
||||||
_, err = cmd.webBackendMode(cfg)
|
_, err = cmd.webBackendMode(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -223,8 +223,8 @@ func (cmd *sharePublicCommand) proxyBackendMode(cfg *proxy.BackendConfig) (endpo
|
|||||||
return be, nil
|
return be, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cmd *sharePublicCommand) webBackendMode(cfg *proxy.WebBackendConfig) (endpoints.RequestHandler, error) {
|
func (cmd *sharePublicCommand) webBackendMode(cfg *proxy.CaddyWebBackendConfig) (endpoints.RequestHandler, error) {
|
||||||
be, err := proxy.NewWebBackend(cfg)
|
be, err := proxy.NewCaddyWebBackend(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "error creating http web backend")
|
return nil, errors.Wrap(err, "error creating http web backend")
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package main
|
package endpoints
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -14,38 +14,38 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
caddy.RegisterNetwork("zrok", newZrokListener)
|
caddy.RegisterNetwork("zrok", NewZrokListener)
|
||||||
}
|
}
|
||||||
|
|
||||||
type zrokListener struct {
|
type ZrokListener struct {
|
||||||
zctx ziti.Context
|
zctx ziti.Context
|
||||||
share string
|
share string
|
||||||
l edge.Listener
|
l edge.Listener
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *zrokListener) String() string {
|
func (l *ZrokListener) String() string {
|
||||||
return fmt.Sprintf("zrok/%s", l.share)
|
return fmt.Sprintf("zrok/%s", l.share)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *zrokListener) Network() string {
|
func (l *ZrokListener) Network() string {
|
||||||
return "zrok"
|
return "zrok"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *zrokListener) Accept() (net.Conn, error) {
|
func (l *ZrokListener) Accept() (net.Conn, error) {
|
||||||
return l.l.Accept()
|
return l.l.Accept()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *zrokListener) Close() error {
|
func (l *ZrokListener) Close() error {
|
||||||
_ = l.l.Close()
|
_ = l.l.Close()
|
||||||
l.zctx.Close()
|
l.zctx.Close()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *zrokListener) Addr() net.Addr {
|
func (l *ZrokListener) Addr() net.Addr {
|
||||||
return l
|
return l
|
||||||
}
|
}
|
||||||
|
|
||||||
func newZrokListener(ctx context.Context, _ string, addr string, cfg net.ListenConfig) (any, error) {
|
func NewZrokListener(_ context.Context, _ string, addr string, _ net.ListenConfig) (any, error) {
|
||||||
shrToken := strings.Split(addr, ":")[0]
|
shrToken := strings.Split(addr, ":")[0]
|
||||||
env, err := environment.LoadRoot()
|
env, err := environment.LoadRoot()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -66,7 +66,7 @@ func newZrokListener(ctx context.Context, _ string, addr string, cfg net.ListenC
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
l := &zrokListener{
|
l := &ZrokListener{
|
||||||
zctx: zctx,
|
zctx: zctx,
|
||||||
share: shrToken,
|
share: shrToken,
|
||||||
l: conn,
|
l: conn,
|
||||||
@ -75,6 +75,6 @@ func newZrokListener(ctx context.Context, _ string, addr string, cfg net.ListenC
|
|||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
_ net.Addr = (*zrokListener)(nil)
|
_ net.Addr = (*ZrokListener)(nil)
|
||||||
_ net.Listener = (*zrokListener)(nil)
|
_ net.Listener = (*ZrokListener)(nil)
|
||||||
)
|
)
|
69
endpoints/proxy/caddyWebBackend.go
Normal file
69
endpoints/proxy/caddyWebBackend.go
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
package proxy
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"github.com/caddyserver/caddy/v2"
|
||||||
|
"github.com/caddyserver/caddy/v2/caddyconfig"
|
||||||
|
"github.com/caddyserver/caddy/v2/modules/caddyhttp"
|
||||||
|
"github.com/caddyserver/caddy/v2/modules/caddyhttp/fileserver"
|
||||||
|
"github.com/openziti/zrok/endpoints"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type CaddyWebBackendConfig struct {
|
||||||
|
IdentityPath string
|
||||||
|
WebRoot string
|
||||||
|
ShrToken string
|
||||||
|
Requests chan *endpoints.Request
|
||||||
|
}
|
||||||
|
|
||||||
|
type CaddyWebBackend struct {
|
||||||
|
cfg *CaddyWebBackendConfig
|
||||||
|
caddyCfg *caddy.Config
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewCaddyWebBackend(cfg *CaddyWebBackendConfig) (*CaddyWebBackend, error) {
|
||||||
|
handler := fileserver.FileServer{Root: cfg.WebRoot}
|
||||||
|
handler.Browse = new(fileserver.Browse)
|
||||||
|
|
||||||
|
var handlers []json.RawMessage
|
||||||
|
handlers = append(handlers, caddyconfig.JSONModuleObject(handler, "handler", "file_server", nil))
|
||||||
|
|
||||||
|
route := caddyhttp.Route{HandlersRaw: handlers}
|
||||||
|
|
||||||
|
server := &caddyhttp.Server{
|
||||||
|
ReadHeaderTimeout: caddy.Duration(10 * time.Second),
|
||||||
|
IdleTimeout: caddy.Duration(30 * time.Second),
|
||||||
|
MaxHeaderBytes: 1024 * 10,
|
||||||
|
Routes: caddyhttp.RouteList{route},
|
||||||
|
}
|
||||||
|
server.Listen = []string{fmt.Sprintf("zrok/%s", cfg.ShrToken)}
|
||||||
|
|
||||||
|
httpApp := caddyhttp.App{
|
||||||
|
Servers: map[string]*caddyhttp.Server{"static": server},
|
||||||
|
}
|
||||||
|
|
||||||
|
var false bool
|
||||||
|
caddyCfg := &caddy.Config{
|
||||||
|
Admin: &caddy.AdminConfig{
|
||||||
|
Disabled: true,
|
||||||
|
Config: &caddy.ConfigSettings{
|
||||||
|
Persist: &false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
AppsRaw: caddy.ModuleMap{
|
||||||
|
"http": caddyconfig.JSON(httpApp, nil),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
return &CaddyWebBackend{cfg: cfg, caddyCfg: caddyCfg}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CaddyWebBackend) Run() error {
|
||||||
|
return caddy.Run(c.caddyCfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CaddyWebBackend) Requests() func() int32 {
|
||||||
|
return func() int32 { return 0 }
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user