|
@@ -0,0 +1,100 @@
|
|
|
+package httpclient
|
|
|
+
|
|
|
+import (
|
|
|
+ "bytes"
|
|
|
+ "context"
|
|
|
+ "encoding/json"
|
|
|
+ "git.nspix.com/golang/micro/helper/random"
|
|
|
+ "io"
|
|
|
+ "net"
|
|
|
+ "net/http"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+var (
|
|
|
+ httpClient = http.Client{
|
|
|
+ Timeout: time.Second * 15,
|
|
|
+ Transport: &http.Transport{
|
|
|
+ Proxy: http.ProxyFromEnvironment,
|
|
|
+ DialContext: (&net.Dialer{
|
|
|
+ Timeout: 30 * time.Second,
|
|
|
+ KeepAlive: 30 * time.Second,
|
|
|
+ }).DialContext,
|
|
|
+ ForceAttemptHTTP2: false,
|
|
|
+ MaxIdleConns: 10,
|
|
|
+ IdleConnTimeout: 30 * time.Second,
|
|
|
+ TLSHandshakeTimeout: 10 * time.Second,
|
|
|
+ ExpectContinueTimeout: 1 * time.Second,
|
|
|
+ },
|
|
|
+ }
|
|
|
+)
|
|
|
+
|
|
|
+func Get(ctx context.Context, url string, header map[string]string) (res *http.Response, err error) {
|
|
|
+ var (
|
|
|
+ req *http.Request
|
|
|
+ )
|
|
|
+ if req, err = http.NewRequest("GET", url, nil); err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if header != nil {
|
|
|
+ for k, v := range header {
|
|
|
+ req.Header.Set(k, v)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return MockDo(ctx, req)
|
|
|
+}
|
|
|
+
|
|
|
+func Post(ctx context.Context, url string, header map[string]string, data interface{}) (res *http.Response, err error) {
|
|
|
+ var (
|
|
|
+ req *http.Request
|
|
|
+ contentType string
|
|
|
+ reader io.Reader
|
|
|
+ )
|
|
|
+ switch v := data.(type) {
|
|
|
+ case string:
|
|
|
+ reader = strings.NewReader(v)
|
|
|
+ contentType = "x-www-form-urlencoded"
|
|
|
+ case []byte:
|
|
|
+ reader = bytes.NewReader(v)
|
|
|
+ contentType = ""
|
|
|
+ default:
|
|
|
+ var b []byte
|
|
|
+ if b, err = json.Marshal(v); err == nil {
|
|
|
+ reader = bytes.NewReader(b)
|
|
|
+ contentType = "application/json"
|
|
|
+ } else {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if req, err = http.NewRequest("POST", url, reader); err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if contentType != "" {
|
|
|
+ req.Header.Set("Content-Type", contentType)
|
|
|
+ }
|
|
|
+ if header != nil {
|
|
|
+ for k, v := range header {
|
|
|
+ req.Header.Set(k, v)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return MockDo(ctx, req)
|
|
|
+}
|
|
|
+
|
|
|
+func MockDo(ctx context.Context, req *http.Request) (res *http.Response, err error) {
|
|
|
+ randomIp := random.IP()
|
|
|
+ req.Header.Set("X-Forwarded-For", randomIp)
|
|
|
+ req.Header.Set("X-Real-IP", randomIp)
|
|
|
+ req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36")
|
|
|
+ if ctx != nil {
|
|
|
+ req = req.WithContext(ctx)
|
|
|
+ }
|
|
|
+ return Do(ctx, req)
|
|
|
+}
|
|
|
+
|
|
|
+func Do(ctx context.Context, req *http.Request) (res *http.Response, err error) {
|
|
|
+ if ctx != nil {
|
|
|
+ req = req.WithContext(ctx)
|
|
|
+ }
|
|
|
+ return httpClient.Do(req)
|
|
|
+}
|