|
package bogdanfinn |
|
|
|
import ( |
|
"aurora/httpclient" |
|
"io" |
|
"net/http" |
|
|
|
fhttp "github.com/bogdanfinn/fhttp" |
|
tls_client "github.com/bogdanfinn/tls-client" |
|
"github.com/bogdanfinn/tls-client/profiles" |
|
) |
|
|
|
type TlsClient struct { |
|
Client tls_client.HttpClient |
|
ReqBefore handler |
|
} |
|
|
|
type handler func(r *fhttp.Request) error |
|
|
|
func NewStdClient() *TlsClient { |
|
client, _ := tls_client.NewHttpClient(tls_client.NewNoopLogger(), []tls_client.HttpClientOption{ |
|
tls_client.WithCookieJar(tls_client.NewCookieJar()), |
|
tls_client.WithRandomTLSExtensionOrder(), |
|
tls_client.WithTimeoutSeconds(600), |
|
tls_client.WithClientProfile(profiles.Okhttp4Android13), |
|
}...) |
|
|
|
stdClient := &TlsClient{Client: client} |
|
return stdClient |
|
} |
|
|
|
func convertResponse(resp *fhttp.Response) *http.Response { |
|
response := &http.Response{ |
|
Status: resp.Status, |
|
StatusCode: resp.StatusCode, |
|
Proto: resp.Proto, |
|
ProtoMajor: resp.ProtoMajor, |
|
ProtoMinor: resp.ProtoMinor, |
|
Header: http.Header(resp.Header), |
|
Body: resp.Body, |
|
ContentLength: resp.ContentLength, |
|
TransferEncoding: resp.TransferEncoding, |
|
Close: resp.Close, |
|
Uncompressed: resp.Uncompressed, |
|
Trailer: http.Header(resp.Trailer), |
|
} |
|
return response |
|
} |
|
|
|
func (t *TlsClient) handleHeaders(req *fhttp.Request, headers httpclient.AuroraHeaders) { |
|
if headers == nil { |
|
return |
|
} |
|
for k, v := range headers { |
|
req.Header.Set(k, v) |
|
} |
|
} |
|
|
|
func (t *TlsClient) handleCookies(req *fhttp.Request, cookies []*http.Cookie) { |
|
if cookies == nil { |
|
return |
|
} |
|
for _, c := range cookies { |
|
req.AddCookie(&fhttp.Cookie{ |
|
Name: c.Name, |
|
Value: c.Value, |
|
Path: c.Path, |
|
Domain: c.Domain, |
|
Expires: c.Expires, |
|
RawExpires: c.RawExpires, |
|
MaxAge: c.MaxAge, |
|
Secure: c.Secure, |
|
HttpOnly: c.HttpOnly, |
|
SameSite: fhttp.SameSite(c.SameSite), |
|
Raw: c.Raw, |
|
Unparsed: c.Unparsed, |
|
}) |
|
} |
|
} |
|
|
|
func (t *TlsClient) Request(method httpclient.HttpMethod, url string, headers httpclient.AuroraHeaders, cookies []*http.Cookie, body io.Reader) (*http.Response, error) { |
|
req, err := fhttp.NewRequest(string(method), url, body) |
|
if err != nil { |
|
return nil, err |
|
} |
|
t.handleHeaders(req, headers) |
|
t.handleCookies(req, cookies) |
|
if t.ReqBefore != nil { |
|
if err := t.ReqBefore(req); err != nil { |
|
return nil, err |
|
} |
|
} |
|
do, err := t.Client.Do(req) |
|
if err != nil { |
|
return nil, err |
|
} |
|
return convertResponse(do), nil |
|
} |
|
|
|
func (t *TlsClient) SetProxy(url string) error { |
|
return t.Client.SetProxy(url) |
|
} |
|
|