Chore: use utc

This commit is contained in:
zijiren233 2024-04-14 17:34:33 +08:00
parent 14ef58818b
commit 43fba64816
8 changed files with 15 additions and 207 deletions

5
go.mod
View File

@ -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
View File

@ -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=

View File

@ -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)
}

View File

@ -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)
}

View File

@ -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
}

View File

@ -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)
}

View File

@ -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)
}

View File

@ -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,
},
}
}