Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion app.go
Original file line number Diff line number Diff line change
@@ -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() {
Expand Down
31 changes: 31 additions & 0 deletions example/Caddyfile
Original file line number Diff line number Diff line change
@@ -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"
}
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
8 changes: 4 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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=
Expand Down Expand Up @@ -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=
Expand Down
85 changes: 79 additions & 6 deletions module.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,100 @@ 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)
_ 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)
if !ok {
Expand Down Expand Up @@ -124,7 +197,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())
}

/*
Expand Down