59 lines
1023 B
Go
59 lines
1023 B
Go
package wt
|
|
|
|
import (
|
|
"context"
|
|
"net"
|
|
"net/http"
|
|
"net/http/httputil"
|
|
"net/url"
|
|
|
|
"github.com/go-gost/core/logger"
|
|
wt_util "github.com/go-gost/x/internal/util/wt"
|
|
wt "github.com/quic-go/webtransport-go"
|
|
)
|
|
|
|
type Client struct {
|
|
host string
|
|
path string
|
|
header http.Header
|
|
dialer *wt.Dialer
|
|
session *wt.Session
|
|
log logger.Logger
|
|
}
|
|
|
|
func (c *Client) Dial(ctx context.Context, addr string) (net.Conn, error) {
|
|
ok := false
|
|
if c.session != nil {
|
|
select {
|
|
case <-c.session.Context().Done():
|
|
default:
|
|
ok = true
|
|
}
|
|
}
|
|
if !ok {
|
|
url := url.URL{
|
|
Scheme: "https",
|
|
Host: c.host,
|
|
Path: c.path,
|
|
}
|
|
resp, session, err := c.dialer.Dial(ctx, url.String(), c.header)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if c.log.IsLevelEnabled(logger.TraceLevel) {
|
|
dump, _ := httputil.DumpResponse(resp, false)
|
|
c.log.Trace(string(dump))
|
|
}
|
|
|
|
c.session = session
|
|
}
|
|
|
|
stream, err := c.session.OpenStream()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return wt_util.Conn(c.session, stream), nil
|
|
}
|