1002e87b60
* Pinecone demo * Enable multicast, fix HTTP routing * Fix multicast import * Fix build * Update Pinecone demo * Fix the keys * Tweaks * Pinecone room directory support (early) * Fix gobind-pinecone * Add pinecone listener * Fix public key value * Use AuthenticatedConnect for dial * Fix gobind-pinecone * Stop panics * Give fsAPI to keyserver * Pinecone demo fixes * Update gobind build scripts * Account creation * Tweaks * Setup tweaks * API tweaks * API tweaks * API tweaks * Port mutex * Re-enable multicast * Add ReadCopy * Update quic-go, fixes * Shutdowns fixed for iOS * Update build script * Add WebSocket support * Bug fixes * Netconn context * Fix WebSocket connectivity * Fixes to gobind API * Strip frameworks * Configurability updates * Update go.mod * Update go.mod/go.sum * Update go.mod/go.sum * Update go.mod/go.sum * Try to stay connected tto static peer * Update gobind-pinecone * Update go.mod/go.sum * Test uTP+TLS * Use HTTP/2 * Don't use HTTP/2 * Update go.mod/go.sum * Attempt to reconnect to the static peer if it drops * Stay connected to static peers more stickily * Retry room directory lookups if they fail * NewQUIC -> NewSessions * Storage updates * Don't return immediately when there's nothing to sync * Updates * Try to reconnect to static peer more * Update go.mod/go.sum * Require Go 1.14 * Update go.mod/go.sum * Update go.mod/go.sum
92 lines
2.2 KiB
Go
92 lines
2.2 KiB
Go
package conn
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/gorilla/websocket"
|
|
"github.com/matrix-org/dendrite/setup"
|
|
"github.com/matrix-org/gomatrixserverlib"
|
|
|
|
pineconeRouter "github.com/matrix-org/pinecone/router"
|
|
pineconeSessions "github.com/matrix-org/pinecone/sessions"
|
|
)
|
|
|
|
func ConnectToPeer(pRouter *pineconeRouter.Router, peer string) error {
|
|
var parent net.Conn
|
|
if strings.HasPrefix(peer, "ws://") || strings.HasPrefix(peer, "wss://") {
|
|
c, _, err := websocket.DefaultDialer.Dial(peer, nil)
|
|
if err != nil {
|
|
return fmt.Errorf("websocket.DefaultDialer.Dial: %w", err)
|
|
}
|
|
parent = WrapWebSocketConn(c)
|
|
} else {
|
|
var err error
|
|
parent, err = net.Dial("tcp", peer)
|
|
if err != nil {
|
|
return fmt.Errorf("net.Dial: %w", err)
|
|
}
|
|
}
|
|
if parent == nil {
|
|
return fmt.Errorf("failed to wrap connection")
|
|
}
|
|
_, err := pRouter.AuthenticatedConnect(parent, "static", pineconeRouter.PeerTypeRemote)
|
|
return err
|
|
}
|
|
|
|
type RoundTripper struct {
|
|
inner *http.Transport
|
|
}
|
|
|
|
func (y *RoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
|
|
req.URL.Scheme = "http"
|
|
return y.inner.RoundTrip(req)
|
|
}
|
|
|
|
func CreateClient(
|
|
base *setup.BaseDendrite, s *pineconeSessions.Sessions,
|
|
) *gomatrixserverlib.Client {
|
|
tr := &http.Transport{}
|
|
tr.RegisterProtocol(
|
|
"matrix", &RoundTripper{
|
|
inner: &http.Transport{
|
|
MaxIdleConns: 100,
|
|
MaxIdleConnsPerHost: 5,
|
|
Dial: s.Dial,
|
|
DialContext: s.DialContext,
|
|
DialTLS: s.DialTLS,
|
|
DialTLSContext: s.DialTLSContext,
|
|
},
|
|
},
|
|
)
|
|
return gomatrixserverlib.NewClient(
|
|
gomatrixserverlib.WithTransport(tr),
|
|
)
|
|
}
|
|
|
|
func CreateFederationClient(
|
|
base *setup.BaseDendrite, s *pineconeSessions.Sessions,
|
|
) *gomatrixserverlib.FederationClient {
|
|
tr := &http.Transport{}
|
|
tr.RegisterProtocol(
|
|
"matrix", &RoundTripper{
|
|
inner: &http.Transport{
|
|
MaxIdleConns: 100,
|
|
MaxIdleConnsPerHost: 5,
|
|
Dial: s.Dial,
|
|
DialContext: s.DialContext,
|
|
DialTLS: s.DialTLS,
|
|
DialTLSContext: s.DialTLSContext,
|
|
},
|
|
},
|
|
)
|
|
return gomatrixserverlib.NewFederationClient(
|
|
base.Cfg.Global.ServerName,
|
|
base.Cfg.Global.KeyID,
|
|
base.Cfg.Global.PrivateKey,
|
|
gomatrixserverlib.WithTransport(tr),
|
|
)
|
|
}
|