From f63a95046bed7d5cf2af808939010972f491c7bd Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Tue, 25 Jun 2024 17:43:43 -0700 Subject: [PATCH 1/3] Bump go-libp2p dep --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index efea9aa..d4adc7f 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.21.4 require ( github.com/caddyserver/caddy/v2 v2.8.4 - github.com/libp2p/go-libp2p v0.35.0 + github.com/libp2p/go-libp2p v0.35.1 github.com/libp2p/go-libp2p-kad-dht v0.25.2 github.com/multiformats/go-multiaddr v0.12.4 go.uber.org/zap v1.27.0 @@ -129,7 +129,7 @@ require ( github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/pion/datachannel v1.5.6 // indirect github.com/pion/dtls/v2 v2.2.11 // indirect - github.com/pion/ice/v2 v2.3.24 // indirect + github.com/pion/ice/v2 v2.3.25 // indirect github.com/pion/interceptor v0.1.29 // indirect github.com/pion/logging v0.2.2 // indirect github.com/pion/mdns v0.0.12 // indirect diff --git a/go.sum b/go.sum index 27cc88c..a67ffc0 100644 --- a/go.sum +++ b/go.sum @@ -417,8 +417,8 @@ github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38y github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= -github.com/libp2p/go-libp2p v0.35.0 h1:1xS1Bkr9X7GtdvV6ntLnDV9xB1kNjHK1lZ0eaO6gnhc= -github.com/libp2p/go-libp2p v0.35.0/go.mod h1:snyJQix4ET6Tj+LeI0VPjjxTtdWpeOhYt5lEY0KirkQ= +github.com/libp2p/go-libp2p v0.35.1 h1:Hm7Ub2BF+GCb14ojcsEK6WAy5it5smPDK02iXSZLl50= +github.com/libp2p/go-libp2p v0.35.1/go.mod h1:Dnkgba5hsfSv5dvvXC8nfqk44hH0gIKKno+HOMU0fdc= github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= github.com/libp2p/go-libp2p-kad-dht v0.25.2 h1:FOIk9gHoe4YRWXTu8SY9Z1d0RILol0TrtApsMDPjAVQ= @@ -539,8 +539,8 @@ github.com/pion/datachannel v1.5.6/go.mod h1:1eKT6Q85pRnr2mHiWHxJwO50SfZRtWHTsNI github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= github.com/pion/dtls/v2 v2.2.11 h1:9U/dpCYl1ySttROPWJgqWKEylUdT0fXp/xst6JwY5Ks= github.com/pion/dtls/v2 v2.2.11/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= -github.com/pion/ice/v2 v2.3.24 h1:RYgzhH/u5lH0XO+ABatVKCtRd+4U1GEaCXSMjNr13tI= -github.com/pion/ice/v2 v2.3.24/go.mod h1:KXJJcZK7E8WzrBEYnV4UtqEZsGeWfHxsNqhVcVvgjxw= +github.com/pion/ice/v2 v2.3.25 h1:M5rJA07dqhi3nobJIg+uPtcVjFECTrhcR3n0ns8kDZs= +github.com/pion/ice/v2 v2.3.25/go.mod h1:KXJJcZK7E8WzrBEYnV4UtqEZsGeWfHxsNqhVcVvgjxw= github.com/pion/interceptor v0.1.29 h1:39fsnlP1U8gw2JzOFWdfCU82vHvhW9o0rZnZF56wF+M= github.com/pion/interceptor v0.1.29/go.mod h1:ri+LGNjRUc5xUNtDEPzfdkmSqISixVTBF/z/Zms/6T4= github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= From 8ecd8b7a4e20e60b627e0465071a8d9242172f45 Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Tue, 25 Jun 2024 17:44:12 -0700 Subject: [PATCH 2/3] Add well-known libp2p protos handler --- app.go | 3 +- example/Caddyfile | 31 +++++++++++++++++ module.go | 84 +++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 111 insertions(+), 7 deletions(-) create mode 100644 example/Caddyfile diff --git a/app.go b/app.go index 4b64e62..4b3176f 100644 --- a/app.go +++ b/app.go @@ -1,12 +1,13 @@ package caddy_libp2p_listener import ( + "strconv" + "github.com/caddyserver/caddy/v2" "github.com/caddyserver/caddy/v2/caddyconfig" "github.com/caddyserver/caddy/v2/caddyconfig/caddyfile" "github.com/caddyserver/caddy/v2/caddyconfig/httpcaddyfile" "go.uber.org/zap" - "strconv" ) func init() { diff --git a/example/Caddyfile b/example/Caddyfile new file mode 100644 index 0000000..7a58a9e --- /dev/null +++ b/example/Caddyfile @@ -0,0 +1,31 @@ +{ + auto_https off + servers { + protocols h1 h2 + } + libp2p { + # private_key ed25519key.pem + advertise_amino true + } +} + +:4002 { + # Site-specific options + bind multiaddr:/ip4/0.0.0.0/udp/4002/quic-v1/webtransport + bind 127.0.0.1 + bind ::1 + + handle / { + respond "Hello World" + } + + route /.well-known/libp2p/* { + well_known-libp2p { + # Tell peers where our protocols are mounted + /hello/0.0.1 => / + } + } + + + respond "I am 4002" +} diff --git a/module.go b/module.go index dc58b28..f2f8734 100644 --- a/module.go +++ b/module.go @@ -6,27 +6,99 @@ import ( "crypto/x509" "encoding/pem" "fmt" + "net" + "net/http" + "os" + "strconv" + "strings" + "github.com/caddyserver/caddy/v2" + "github.com/caddyserver/caddy/v2/caddyconfig/caddyfile" + "github.com/caddyserver/caddy/v2/caddyconfig/httpcaddyfile" + "github.com/caddyserver/caddy/v2/modules/caddyhttp" "github.com/libp2p/go-libp2p" dht "github.com/libp2p/go-libp2p-kad-dht" "github.com/libp2p/go-libp2p/core/crypto" "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/protocol" "github.com/libp2p/go-libp2p/core/routing" libp2phttp "github.com/libp2p/go-libp2p/p2p/http" "github.com/libp2p/go-libp2p/p2p/net/gostream" libp2pwebrtc "github.com/libp2p/go-libp2p/p2p/transport/webrtc" "github.com/multiformats/go-multiaddr" - "net" - "os" - "strconv" - "strings" ) func init() { - //caddy.RegisterModule(new(LL)) caddy.RegisterNetwork("multiaddr:", registerMultiaddrURI) + caddy.RegisterModule(&Libp2pHandler{}) + httpcaddyfile.RegisterHandlerDirective("well_known-libp2p", parseCaddyfile) +} + +type Libp2pHandler struct { + h libp2phttp.Host + ParsedProtosMap map[protocol.ID]libp2phttp.ProtocolMeta +} + +// Provision implements caddy.Provisioner. +func (l *Libp2pHandler) Provision(caddy.Context) error { + for k, v := range l.ParsedProtosMap { + l.h.WellKnownHandler.AddProtocolMeta(k, v) + } + return nil } +// UnmarshalCaddyfile implements caddyfile.Unmarshaler. +func (l *Libp2pHandler) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { + l.ParsedProtosMap = make(map[protocol.ID]libp2phttp.ProtocolMeta) + d.Next() // Enter the block in well_known-libp2p + for d.NextBlock(0) { + key := d.Val() + if !d.NextArg() { + return d.ArgErr() + } + t := d.Val() + if t != "=>" { + return d.Err("expected =>") + } + if !d.NextArg() { + return d.ArgErr() + } + value := d.Val() + l.ParsedProtosMap[protocol.ID(key)] = libp2phttp.ProtocolMeta{Path: value} + } + return nil +} + +// ServeHTTP implements caddyhttp.MiddlewareHandler. +func (l *Libp2pHandler) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyhttp.Handler) error { + if r.URL.Path == libp2phttp.WellKnownProtocols { + l.h.WellKnownHandler.ServeHTTP(w, r) + return nil + } + return next.ServeHTTP(w, r) +} + +// CaddyModule implements caddy.Module. +func (l *Libp2pHandler) CaddyModule() caddy.ModuleInfo { + return caddy.ModuleInfo{ + ID: "http.handlers.well_known-libp2p", + New: func() caddy.Module { return new(Libp2pHandler) }, + } +} + +// parseCaddyfile unmarshals a caddyfile helper to a Middleware. +func parseCaddyfile(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error) { + var m Libp2pHandler + err := m.UnmarshalCaddyfile(h.Dispenser) + return &m, err +} + +var _ caddy.Module = (*Libp2pHandler)(nil) + +var _ caddyhttp.MiddlewareHandler = (*Libp2pHandler)(nil) +var _ caddyfile.Unmarshaler = (*Libp2pHandler)(nil) +var _ caddy.Provisioner = (*Libp2pHandler)(nil) + func registerMultiaddrURI(ctx context.Context, network, addr string, cfg net.ListenConfig) (any, error) { cctx, ok := ctx.(caddy.Context) if !ok { @@ -124,7 +196,7 @@ func registerMultiaddrURI(ctx context.Context, network, addr string, cfg net.Lis fmt.Println(h.ID()) fmt.Println(h.Addrs()) - return gostream.Listen(h, libp2phttp.ProtocolIDForMultistreamSelect) + return gostream.Listen(h, libp2phttp.ProtocolIDForMultistreamSelect, gostream.IgnoreEOF()) } /* From 3ac0ca0084b177ac05c690fcda01073f80ba6a30 Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Tue, 25 Jun 2024 17:45:43 -0700 Subject: [PATCH 3/3] nit --- module.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/module.go b/module.go index f2f8734..2488f19 100644 --- a/module.go +++ b/module.go @@ -93,11 +93,12 @@ func parseCaddyfile(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error) return &m, err } -var _ caddy.Module = (*Libp2pHandler)(nil) - -var _ caddyhttp.MiddlewareHandler = (*Libp2pHandler)(nil) -var _ caddyfile.Unmarshaler = (*Libp2pHandler)(nil) -var _ caddy.Provisioner = (*Libp2pHandler)(nil) +var ( + _ caddy.Module = (*Libp2pHandler)(nil) + _ caddyhttp.MiddlewareHandler = (*Libp2pHandler)(nil) + _ caddyfile.Unmarshaler = (*Libp2pHandler)(nil) + _ caddy.Provisioner = (*Libp2pHandler)(nil) +) func registerMultiaddrURI(ctx context.Context, network, addr string, cfg net.ListenConfig) (any, error) { cctx, ok := ctx.(caddy.Context)