基本能用的简单请求
This commit is contained in:
huangsimin 2018-10-19 16:26:50 +08:00
parent 79f1bf54df
commit 3c4a80a8b6
5 changed files with 174 additions and 18 deletions

View File

@ -1,5 +0,0 @@
package requests
func Get(url string) {
}

View File

@ -1,9 +0,0 @@
package requests
import (
"testing"
)
func TestGet(t *testing.T) {
}

View File

@ -1,7 +1,12 @@
package requests
import (
"crypto/tls"
"errors"
"net/http"
"net/url"
"reflect"
"time"
)
// Params 相关参数结构
@ -12,10 +17,21 @@ type Params struct {
ContentType string
}
// BasicAuth 帐号认真结构
type BasicAuth struct {
// User 帐号
User string
// Password 密码
Password string
}
// Session 的基本方法
type Session struct {
client *http.Client
params *Params
client *http.Client
transport *http.Transport
cookies http.CookieJar
params *Params
auth *BasicAuth
}
// TypeContent post类型参数
@ -33,9 +49,97 @@ const (
TypeFormData = "multipart/form-data"
)
// TypeConfig 配置类型
type TypeConfig int
const (
_ TypeConfig = iota
// ConfigRequestTimeout request 包括 dial request redirect 总时间超时
ConfigRequestTimeout // 支持time.Duration 和 int(秒为单位)
// ConfigDialTimeout 一个Connect过程的Timeout
ConfigDialTimeout // 支持time.Duration 和 int(秒为单位)
// ConfigProxy 代理链接
ConfigProxy // http, https, socks5
// ConfigInsecure InsecureSkipVerify
ConfigInsecure // true, false
// ConfigBasicAuth 帐号认证
ConfigBasicAuth // user pwd
// ConfigTLS 帐号认证
ConfigTLS // user pwd
)
// NewSession 创建Session
func NewSession() *Session {
return &Session{client: &http.Client{}, params: &Params{}}
client := &http.Client{}
transport := &http.Transport{}
client.Transport = transport
return &Session{client: client, params: &Params{}, transport: transport, auth: nil}
}
// SetConfig 设置配置
func (ses *Session) SetConfig(typeConfig TypeConfig, values interface{}) {
switch typeConfig {
case ConfigRequestTimeout:
switch v := values.(type) {
case time.Duration:
ses.client.Timeout = v
case int:
ses.client.Timeout = time.Duration(v * int(time.Second))
case int64:
ses.client.Timeout = time.Duration(v * int64(time.Second))
case float32:
ses.client.Timeout = time.Duration(v * float32(time.Second))
case float64:
ses.client.Timeout = time.Duration(v * float64(time.Second))
default:
panic(errors.New("error type " + reflect.TypeOf(v).String()))
}
case ConfigDialTimeout:
case ConfigProxy:
switch v := values.(type) {
case string:
purl, err := (url.Parse(v))
if err != nil {
panic(err)
}
ses.transport.Proxy = http.ProxyURL(purl)
case *url.URL:
ses.transport.Proxy = http.ProxyURL(v)
}
case ConfigInsecure:
ses.transport.TLSClientConfig = &tls.Config{InsecureSkipVerify: !values.(bool)}
case ConfigTLS:
ses.transport.TLSClientConfig = values.(*tls.Config)
case ConfigBasicAuth:
if ses.auth == nil {
ses.auth = &BasicAuth{}
}
switch v := values.(type) {
case *BasicAuth:
ses.auth.User = v.User
ses.auth.User = v.Password
case BasicAuth:
ses.auth.User = v.User
ses.auth.User = v.Password
case []string:
ses.auth.User = v[0]
ses.auth.User = v[1]
case nil:
ses.auth = nil
}
default:
panic(errors.New("unknown typeConfig " + reflect.TypeOf(typeConfig).String()))
}
return
}
// Get 请求

View File

@ -273,3 +273,69 @@ func TestSession_Patch(t *testing.T) {
})
}
}
func TestSession_SetConfig(t *testing.T) {
type args struct {
typeConfig TypeConfig
values interface{}
}
tests := []struct {
name string
args args
wantErr bool
}{
// TODO: Add test cases.
{
name: "test timeout",
args: args{typeConfig: ConfigRequestTimeout, values: 0.01},
wantErr: true,
},
{
name: "test not timeout",
args: args{typeConfig: ConfigRequestTimeout, values: 5},
wantErr: false,
},
{
name: "test proxy",
args: args{typeConfig: ConfigProxy, values: "http://474420502.top:7070"},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ses := NewSession()
ses.SetConfig(tt.args.typeConfig, tt.args.values)
_, err := ses.Get("https://httpbin.org/get").Execute()
if (err != nil) != tt.wantErr {
t.Errorf("Metchod error = %v", err)
return
}
})
}
}
func TestSession_SetConfigInsecure(t *testing.T) {
ses := NewSession()
ses.SetConfig(ConfigInsecure, false)
for _, badSSL := range []string{
"https://self-signed.badssl.com/",
"https://expired.badssl.com/",
"https://wrong.host.badssl.com/",
} {
resp, err := ses.Get(badSSL).Execute()
if err != nil {
t.Error("Unable to make request", err)
}
if resp.GResponse.StatusCode != 200 {
t.Error("Request did not return OK, is ", resp.GResponse.StatusCode)
}
}
}

View File

@ -4,6 +4,6 @@ import (
"testing"
)
func TestURL(t *testing.T) {
func TestTest(t *testing.T) {
}