From 1cb79439034968aac4c26101ba810252f35c08b5 Mon Sep 17 00:00:00 2001 From: lzf Date: Fri, 11 Jul 2025 16:57:24 +0800 Subject: [PATCH 1/4] update --- myhttp/httpc/httpclient.go | 98 +++++++++++++++++++++++++------------- myhttp/httpc/option.go | 49 +++++++++++++++++++ 2 files changed, 113 insertions(+), 34 deletions(-) create mode 100644 myhttp/httpc/option.go diff --git a/myhttp/httpc/httpclient.go b/myhttp/httpc/httpclient.go index 4154037..77ce830 100644 --- a/myhttp/httpc/httpclient.go +++ b/myhttp/httpc/httpclient.go @@ -3,7 +3,6 @@ package httpc import ( "bytes" "context" - "crypto/tls" "errors" "fmt" "git.makemake.in/kzkzzzz/mycommon/mylog" @@ -21,18 +20,34 @@ var ( ) func init() { - defaultClient = NewWithRedirect(false) - noRedirectClient = NewWithRedirect(true) + defaultClient = New() + noRedirectClient = New(WithNoRedirect()) } -func NewTransport() *http.Transport { +func Client() *HttpClient { + return defaultClient +} + +func NoRedirectClient() *HttpClient { + return noRedirectClient +} + +func NewTransport(maxConn int, idleTimeout time.Duration) *http.Transport { + if maxConn <= 0 { + panic("max connection <= 0") + } + + if idleTimeout <= 0 { + panic("idle timeout <= 0") + } + tr := http.DefaultTransport.(*http.Transport).Clone() tr.MaxIdleConns = 0 tr.MaxConnsPerHost = 0 - tr.MaxIdleConnsPerHost = 2048 - tr.IdleConnTimeout = time.Second * 90 + tr.MaxIdleConnsPerHost = maxConn + tr.IdleConnTimeout = idleTimeout tr.DisableKeepAlives = false - tr.TLSClientConfig = &tls.Config{InsecureSkipVerify: false} + //tr.TLSClientConfig = &tls.Config{InsecureSkipVerify: false} return tr } @@ -46,24 +61,43 @@ type Request struct { } type HttpClient struct { + config *Config client *http.Client } -func NewWithRedirect(noRedirect bool) *HttpClient { - tr := NewTransport() - client := &http.Client{ - Transport: tr, - Timeout: time.Second * 6, +func New(opts ...ConfigOpt) *HttpClient { + config := &Config{} + for _, opt := range opts { + opt(config) } - if noRedirect { - client.CheckRedirect = func(req *http.Request, via []*http.Request) error { - return http.ErrUseLastResponse + if config.timeout <= 0 { + config.timeout = time.Second * 6 + } + + if config.transport == nil { + config.transport = NewTransport(3072, time.Second*90) + } + + if config.client == nil { + client := &http.Client{ + Transport: config.transport, + Timeout: config.timeout, } + + if config.redirectFn != nil { + client.CheckRedirect = config.redirectFn + } + + config.client = client } - h := &HttpClient{client: client} - return h + hc := &HttpClient{ + config: config, + client: config.client, + } + + return hc } func NewWithClient(httpClient *http.Client) *HttpClient { @@ -81,7 +115,7 @@ func (h *HttpClient) SetProxy(pr string) *HttpClient { return h } -func (h *HttpClient) Request(ctx context.Context) *Request { +func (h *HttpClient) NewRequest(ctx context.Context) *Request { r := &Request{ ctx: ctx, header: nil, @@ -91,22 +125,26 @@ func (h *HttpClient) Request(ctx context.Context) *Request { return r } -func PcRequest(ctx context.Context) *Request { - return defaultClient.PcRequest(ctx) +func NewRequest(ctx context.Context) *Request { + return defaultClient.NewRequest(ctx) } -func MobileRequest(ctx context.Context) *Request { - return defaultClient.MobileRequest(ctx) +func NewPcRequest(ctx context.Context) *Request { + return defaultClient.NewPcRequest(ctx) } -func (h *HttpClient) PcRequest(ctx context.Context) *Request { - r := h.Request(ctx) +func NewMobileRequest(ctx context.Context) *Request { + return defaultClient.NewMobileRequest(ctx) +} + +func (h *HttpClient) NewPcRequest(ctx context.Context) *Request { + r := h.NewRequest(ctx) r.SetHeaderPcAgent() return r } -func (h *HttpClient) MobileRequest(ctx context.Context) *Request { - r := h.Request(ctx) +func (h *HttpClient) NewMobileRequest(ctx context.Context) *Request { + r := h.NewRequest(ctx) r.SetHeaderMobileAgent() return r } @@ -223,14 +261,6 @@ func (r *Request) Do(method, rawUrl string) (*Response, error) { return resp, nil } -func Client() *HttpClient { - return defaultClient -} - -func NoRedirectClient() *HttpClient { - return noRedirectClient -} - func (r *Request) SetHeaderPcAgent() *Request { r.SetHeader(HeaderUserAgent, PcUserAgent) return r diff --git a/myhttp/httpc/option.go b/myhttp/httpc/option.go new file mode 100644 index 0000000..7dcdb48 --- /dev/null +++ b/myhttp/httpc/option.go @@ -0,0 +1,49 @@ +package httpc + +import ( + "net/http" + "time" +) + +type ( + Config struct { + timeout time.Duration + client *http.Client + transport *http.Transport + redirectFn func(req *http.Request, via []*http.Request) error + } + + ConfigOpt func(c *Config) +) + +func WithTimout(v time.Duration) ConfigOpt { + return func(c *Config) { + c.timeout = v + } +} + +func WithClient(v *http.Client) ConfigOpt { + return func(c *Config) { + c.client = v + } +} + +func WithTransport(v *http.Transport) ConfigOpt { + return func(c *Config) { + c.transport = v + } +} + +func WithRedirectFn(v func(req *http.Request, via []*http.Request) error) ConfigOpt { + return func(c *Config) { + c.redirectFn = v + } +} + +func WithNoRedirect() ConfigOpt { + return func(c *Config) { + c.redirectFn = func(req *http.Request, via []*http.Request) error { + return http.ErrUseLastResponse + } + } +} From 7ead69e1b68e8e8ef84ad03bbe0c5f14271d9ff2 Mon Sep 17 00:00:00 2001 From: lzf Date: Fri, 11 Jul 2025 16:59:47 +0800 Subject: [PATCH 2/4] update --- myhttp/httpc/httpclient.go | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/myhttp/httpc/httpclient.go b/myhttp/httpc/httpclient.go index 77ce830..5893533 100644 --- a/myhttp/httpc/httpclient.go +++ b/myhttp/httpc/httpclient.go @@ -100,11 +100,6 @@ func New(opts ...ConfigOpt) *HttpClient { return hc } -func NewWithClient(httpClient *http.Client) *HttpClient { - h := &HttpClient{client: httpClient} - return h -} - func (h *HttpClient) SetProxy(pr string) *HttpClient { u, err := url.Parse(pr) if err != nil { @@ -125,18 +120,6 @@ func (h *HttpClient) NewRequest(ctx context.Context) *Request { return r } -func NewRequest(ctx context.Context) *Request { - return defaultClient.NewRequest(ctx) -} - -func NewPcRequest(ctx context.Context) *Request { - return defaultClient.NewPcRequest(ctx) -} - -func NewMobileRequest(ctx context.Context) *Request { - return defaultClient.NewMobileRequest(ctx) -} - func (h *HttpClient) NewPcRequest(ctx context.Context) *Request { r := h.NewRequest(ctx) r.SetHeaderPcAgent() From 86b2a17868c81326567ccf3b0f7bae0616775792 Mon Sep 17 00:00:00 2001 From: lzf Date: Fri, 11 Jul 2025 17:08:16 +0800 Subject: [PATCH 3/4] update --- myhttp/httpc/httpclient.go | 6 ++++-- myhttp/httpc/option.go | 15 +++++++++++---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/myhttp/httpc/httpclient.go b/myhttp/httpc/httpclient.go index 5893533..0b5c1ea 100644 --- a/myhttp/httpc/httpclient.go +++ b/myhttp/httpc/httpclient.go @@ -232,8 +232,10 @@ func (r *Request) Do(method, rawUrl string) (*Response, error) { return nil, err } - if res.StatusCode != http.StatusOK { - return nil, fmt.Errorf("status code err: %d (%s)", res.StatusCode, body) + if r.httpClient.config.noCheckStatus == false { + if res.StatusCode != http.StatusOK { + return nil, fmt.Errorf("status code err: %d (%s)", res.StatusCode, body) + } } resp := &Response{ diff --git a/myhttp/httpc/option.go b/myhttp/httpc/option.go index 7dcdb48..61b8e8c 100644 --- a/myhttp/httpc/option.go +++ b/myhttp/httpc/option.go @@ -7,10 +7,11 @@ import ( type ( Config struct { - timeout time.Duration - client *http.Client - transport *http.Transport - redirectFn func(req *http.Request, via []*http.Request) error + timeout time.Duration + client *http.Client + transport *http.Transport + redirectFn func(req *http.Request, via []*http.Request) error + noCheckStatus bool } ConfigOpt func(c *Config) @@ -47,3 +48,9 @@ func WithNoRedirect() ConfigOpt { } } } + +func WithNoCheckStatus(v bool) ConfigOpt { + return func(c *Config) { + c.noCheckStatus = v + } +} From c255a257c3956f29d27643e7c0d013abbd71a5c5 Mon Sep 17 00:00:00 2001 From: lzf Date: Fri, 11 Jul 2025 17:11:28 +0800 Subject: [PATCH 4/4] update --- myhttp/httpc/httpclient.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/myhttp/httpc/httpclient.go b/myhttp/httpc/httpclient.go index 0b5c1ea..8771373 100644 --- a/myhttp/httpc/httpclient.go +++ b/myhttp/httpc/httpclient.go @@ -216,7 +216,10 @@ func (r *Request) Do(method, rawUrl string) (*Response, error) { req.URL.RawQuery = query.Encode() - req.Header.Set("Content-Type", r.contentType) + if r.contentType != "" { + req.Header.Set("Content-Type", r.contentType) + } + for k := range r.header { req.Header.Set(k, r.header.Get(k)) }