Chore: use utc
This commit is contained in:
parent
14ef58818b
commit
43fba64816
5
go.mod
5
go.mod
|
@ -1,6 +1,6 @@
|
|||
module github.com/synctv-org/vendors
|
||||
|
||||
go 1.21
|
||||
go 1.22.2
|
||||
|
||||
require (
|
||||
github.com/caarlos0/env/v9 v9.0.0
|
||||
|
@ -13,12 +13,12 @@ require (
|
|||
github.com/hashicorp/consul/api v1.28.2
|
||||
github.com/joho/godotenv v1.5.1
|
||||
github.com/json-iterator/go v1.1.12
|
||||
github.com/refraction-networking/utls v1.6.4
|
||||
github.com/sirupsen/logrus v1.9.3
|
||||
github.com/spf13/cobra v1.8.0
|
||||
github.com/zencoder/go-dash/v3 v3.0.3
|
||||
github.com/zijiren233/gencontainer v0.0.0-20240331174346-b5e420773df7
|
||||
github.com/zijiren233/go-colorable v0.0.0-20230930131441-997304c961cb
|
||||
github.com/zijiren233/go-uhc v0.0.0-20240414093223-d2e3c16933cf
|
||||
go.etcd.io/etcd/client/v3 v3.5.13
|
||||
go.uber.org/automaxprocs v1.5.3
|
||||
golang.org/x/net v0.24.0
|
||||
|
@ -61,6 +61,7 @@ require (
|
|||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/refraction-networking/utls v1.6.4 // indirect
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
go.etcd.io/etcd/api/v3 v3.5.13 // indirect
|
||||
go.etcd.io/etcd/client/pkg/v3 v3.5.13 // indirect
|
||||
|
|
2
go.sum
2
go.sum
|
@ -262,6 +262,8 @@ github.com/zijiren233/gencontainer v0.0.0-20240331174346-b5e420773df7 h1:ymsEhM4
|
|||
github.com/zijiren233/gencontainer v0.0.0-20240331174346-b5e420773df7/go.mod h1:V5oL7PrZxgisuLCblFWd89Jg99O8vM1n58llcxZ2hDY=
|
||||
github.com/zijiren233/go-colorable v0.0.0-20230930131441-997304c961cb h1:0DyOxf/TbbGodHhOVHNoPk+7v/YBJACs22gKpKlatWw=
|
||||
github.com/zijiren233/go-colorable v0.0.0-20230930131441-997304c961cb/go.mod h1:6TCzjDiQ8+5gWZiwsC3pnA5M0vUy2jV2Y7ciHJh729g=
|
||||
github.com/zijiren233/go-uhc v0.0.0-20240414093223-d2e3c16933cf h1:s5lm3GdOCujmiqPtrypGTW8EVBnw6S9WkkWjOFGXhG8=
|
||||
github.com/zijiren233/go-uhc v0.0.0-20240414093223-d2e3c16933cf/go.mod h1:bOwLWM4v3PL9DsqKOq5pc5XyLDAqxJFxHECZFeI00fM=
|
||||
go.etcd.io/etcd/api/v3 v3.5.13 h1:8WXU2/NBge6AUF1K1gOexB6e07NgsN1hXK0rSTtgSp4=
|
||||
go.etcd.io/etcd/api/v3 v3.5.13/go.mod h1:gBqlqkcMMZMVTMm4NDZloEVJzxQOQIls8splbqBDa0c=
|
||||
go.etcd.io/etcd/client/pkg/v3 v3.5.13 h1:RVZSAnWWWiI5IrYAXjQorajncORbS0zI48LQlE2kQWg=
|
||||
|
|
196
utils/utls.go
196
utils/utls.go
|
@ -1,196 +0,0 @@
|
|||
package utils
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
utls "github.com/refraction-networking/utls"
|
||||
"golang.org/x/net/http2"
|
||||
)
|
||||
|
||||
var _ io.ReadCloser = (*utlsHttpBody)(nil)
|
||||
|
||||
type utlsHttpBody struct {
|
||||
*utls.UConn
|
||||
rawBody io.ReadCloser
|
||||
}
|
||||
|
||||
func (u *utlsHttpBody) Read(p []byte) (n int, err error) {
|
||||
return u.rawBody.Read(p)
|
||||
}
|
||||
|
||||
func (u *utlsHttpBody) Close() error {
|
||||
defer u.UConn.Close()
|
||||
return u.rawBody.Close()
|
||||
}
|
||||
|
||||
type UtlsHttpOption func(*UtlsHttpRoundTripper)
|
||||
|
||||
func WithHttpClient(client *http.Client) UtlsHttpOption {
|
||||
return func(options *UtlsHttpRoundTripper) {
|
||||
if client != nil {
|
||||
options.Timeout = client.Timeout
|
||||
options.Base = client.Transport
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func WithContext(ctx context.Context) UtlsHttpOption {
|
||||
return func(options *UtlsHttpRoundTripper) {
|
||||
options.Ctx = ctx
|
||||
}
|
||||
}
|
||||
|
||||
func WithBaseTransport(base http.RoundTripper) UtlsHttpOption {
|
||||
return func(options *UtlsHttpRoundTripper) {
|
||||
options.Base = base
|
||||
}
|
||||
}
|
||||
|
||||
var DefaultUtlsHttpRoundTripper = NewUtlsHttpRoundTripper()
|
||||
|
||||
func NewUtlsHttpRoundTripper(opts ...UtlsHttpOption) *UtlsHttpRoundTripper {
|
||||
rt := &UtlsHttpRoundTripper{}
|
||||
for _, opt := range opts {
|
||||
opt(rt)
|
||||
}
|
||||
return rt
|
||||
}
|
||||
|
||||
func UtlsDo(req *http.Request) (*http.Response, error) {
|
||||
return DefaultUtlsHttpRoundTripper.RoundTrip(req)
|
||||
}
|
||||
|
||||
func UtlsDoWithOptions(req *http.Request, opts ...UtlsHttpOption) (*http.Response, error) {
|
||||
return NewUtlsHttpRoundTripper(opts...).RoundTrip(req)
|
||||
}
|
||||
|
||||
type UtlsHttpRoundTripper struct {
|
||||
Base http.RoundTripper
|
||||
Ctx context.Context
|
||||
Timeout time.Duration
|
||||
}
|
||||
|
||||
func (u *UtlsHttpRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
|
||||
if u.Ctx == nil {
|
||||
u.Ctx = context.Background()
|
||||
}
|
||||
|
||||
config := utls.Config{ServerName: req.URL.Hostname()}
|
||||
port := req.URL.Port()
|
||||
if port == "" {
|
||||
switch req.URL.Scheme {
|
||||
case "https":
|
||||
port = "443"
|
||||
case "http":
|
||||
port = "80"
|
||||
}
|
||||
}
|
||||
dialConn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%s", req.URL.Hostname(), port), u.Timeout)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
uTlsConn := utls.UClient(dialConn, &config, utls.HelloChrome_Auto)
|
||||
err = uTlsConn.HandshakeContext(u.Ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
resp, err := httpGetOverConn(u.Base, req, uTlsConn, uTlsConn.ConnectionState().NegotiatedProtocol)
|
||||
if err != nil {
|
||||
_ = uTlsConn.Close()
|
||||
return nil, err
|
||||
}
|
||||
resp.Body = &utlsHttpBody{uTlsConn, resp.Body}
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func getH2RoundTripper(rt http.RoundTripper, conn net.Conn) (http.RoundTripper, error) {
|
||||
if rt != nil {
|
||||
tr, ok := rt.(*http.Transport)
|
||||
if !ok {
|
||||
tr = tr.Clone()
|
||||
tr.MaxResponseHeaderBytes = 262144
|
||||
tr.DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
|
||||
return conn, nil
|
||||
}
|
||||
h2transport, err := http2.ConfigureTransports(tr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
c, err := h2transport.NewClientConn(conn)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
rt = c
|
||||
} else if h2tr, ok := rt.(*http2.Transport); ok {
|
||||
h2tr.MaxHeaderListSize = 262144
|
||||
c, err := h2tr.NewClientConn(conn)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
rt = c
|
||||
} else {
|
||||
return nil, fmt.Errorf("unsupported RoundTripper: %T", rt)
|
||||
}
|
||||
} else {
|
||||
tr := http2.Transport{MaxHeaderListSize: 262144}
|
||||
c, err := tr.NewClientConn(conn)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
rt = c
|
||||
}
|
||||
return rt, nil
|
||||
}
|
||||
|
||||
func getH1_1RoundTripper(rt http.RoundTripper, conn net.Conn) (http.RoundTripper, error) {
|
||||
if rt != nil {
|
||||
tr, ok := rt.(*http.Transport)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("unsupported RoundTripper: %T", rt)
|
||||
}
|
||||
tr = tr.Clone()
|
||||
tr.MaxResponseHeaderBytes = 262144
|
||||
tr.DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
|
||||
return conn, nil
|
||||
}
|
||||
rt = tr
|
||||
} else {
|
||||
tr := (http.DefaultTransport).(*http.Transport).Clone()
|
||||
tr.MaxResponseHeaderBytes = 262144
|
||||
tr.DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
|
||||
return conn, nil
|
||||
}
|
||||
rt = tr
|
||||
}
|
||||
return rt, nil
|
||||
}
|
||||
|
||||
func httpGetOverConn(rt http.RoundTripper, req *http.Request, conn net.Conn, alpn string) (*http.Response, error) {
|
||||
var err error
|
||||
switch alpn {
|
||||
case "h2":
|
||||
req.Proto = "HTTP/2.0"
|
||||
req.ProtoMajor = 2
|
||||
req.ProtoMinor = 0
|
||||
rt, err = getH2RoundTripper(rt, conn)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
case "http/1.1", "":
|
||||
req.Proto = "HTTP/1.1"
|
||||
req.ProtoMajor = 1
|
||||
req.ProtoMinor = 1
|
||||
rt, err = getH1_1RoundTripper(rt, conn)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
default:
|
||||
return nil, fmt.Errorf("unsupported ALPN: %v", alpn)
|
||||
}
|
||||
return rt.RoundTrip(req)
|
||||
}
|
|
@ -7,7 +7,7 @@ import (
|
|||
"net/url"
|
||||
|
||||
json "github.com/json-iterator/go"
|
||||
"github.com/synctv-org/vendors/utils"
|
||||
utc "github.com/zijiren233/go-uhc"
|
||||
)
|
||||
|
||||
type Client struct {
|
||||
|
@ -75,5 +75,5 @@ func (c *Client) NewRequest(method, relative string, data any) (req *http.Reques
|
|||
}
|
||||
|
||||
func (c *Client) Do(req *http.Request) (*http.Response, error) {
|
||||
return utils.UtlsDo(req)
|
||||
return utc.UtlsDo(req)
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@ import (
|
|||
"net/http"
|
||||
|
||||
json "github.com/json-iterator/go"
|
||||
"github.com/synctv-org/vendors/utils"
|
||||
utc "github.com/zijiren233/go-uhc"
|
||||
)
|
||||
|
||||
type LoginOptions struct {
|
||||
|
@ -40,7 +40,7 @@ func Login(ctx context.Context, host string, data LoginReq, opts ...LoginOpt) (s
|
|||
return "", err
|
||||
}
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
resp, err := utils.UtlsDo(req)
|
||||
resp, err := utc.UtlsDo(req)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ import (
|
|||
"net/http"
|
||||
|
||||
"github.com/synctv-org/vendors/utils"
|
||||
utc "github.com/zijiren233/go-uhc"
|
||||
)
|
||||
|
||||
type Client struct {
|
||||
|
@ -87,5 +88,5 @@ func (c *Client) NewRequest(method, url string, body io.Reader, conf ...RequestO
|
|||
}
|
||||
|
||||
func (c *Client) Do(req *http.Request) (*http.Response, error) {
|
||||
return utils.UtlsDo(req)
|
||||
return utc.UtlsDo(req)
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@ import (
|
|||
"net/url"
|
||||
|
||||
json "github.com/json-iterator/go"
|
||||
"github.com/synctv-org/vendors/utils"
|
||||
utc "github.com/zijiren233/go-uhc"
|
||||
)
|
||||
|
||||
type Client struct {
|
||||
|
@ -91,5 +91,5 @@ func (c *Client) NewRequest(method, relative string, data any, querys ...map[str
|
|||
}
|
||||
|
||||
func (c *Client) Do(req *http.Request) (*http.Response, error) {
|
||||
return utils.UtlsDo(req)
|
||||
return utc.UtlsDo(req)
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@ import (
|
|||
"net/http"
|
||||
"net/url"
|
||||
|
||||
"github.com/synctv-org/vendors/utils"
|
||||
utc "github.com/zijiren233/go-uhc"
|
||||
"golang.org/x/oauth2"
|
||||
"golang.org/x/oauth2/microsoft"
|
||||
)
|
||||
|
@ -71,7 +71,7 @@ func (c *Client) httpClient() *http.Client {
|
|||
return &http.Client{
|
||||
Transport: &oauth2.Transport{
|
||||
Source: c.tks,
|
||||
Base: utils.DefaultUtlsHttpRoundTripper,
|
||||
Base: utc.DefaultUtlsHttpRoundTripper,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue