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