添加: CDecompressNoAccept

This commit is contained in:
huangsimin 2019-09-04 11:35:21 +08:00
parent 9d998a1964
commit 5ca3e9fc0c
4 changed files with 54 additions and 21 deletions

View File

@ -16,7 +16,7 @@ type Response struct {
} }
// FromHTTPResponse 生成Response 从标准http.Response // FromHTTPResponse 生成Response 从标准http.Response
func FromHTTPResponse(resp *http.Response) (*Response, error) { func FromHTTPResponse(resp *http.Response, IsDecompressNoAccept bool) (*Response, error) {
var err error var err error
// 复制response 返回内容 并且测试是否有解压的需求 // 复制response 返回内容 并且测试是否有解压的需求
srcbuf, err := ioutil.ReadAll(resp.Body) srcbuf, err := ioutil.ReadAll(resp.Body)
@ -26,23 +26,29 @@ func FromHTTPResponse(resp *http.Response) (*Response, error) {
resp.Body.Close() resp.Body.Close()
content := "" content := ""
srcReader := bytes.NewReader(srcbuf)
var reader io.ReadCloser if IsDecompressNoAccept {
if reader, err = gzip.NewReader(srcReader); err == nil {
defer reader.Close() srcReader := bytes.NewReader(srcbuf)
buf, err := ioutil.ReadAll(reader) var reader io.ReadCloser
if err != nil { if reader, err = gzip.NewReader(srcReader); err == nil {
return nil, err defer reader.Close()
buf, err := ioutil.ReadAll(reader)
if err != nil {
return nil, err
}
content = string(buf)
} else if reader, err = zlib.NewReader(srcReader); err == nil {
defer reader.Close()
buf, err := ioutil.ReadAll(reader)
if err != nil {
return nil, err
}
content = string(buf)
} else {
content = string(srcbuf)
} }
content = string(buf)
} else if reader, err = zlib.NewReader(srcReader); err == nil {
defer reader.Close()
buf, err := ioutil.ReadAll(reader)
if err != nil {
return nil, err
}
content = string(buf)
} else { } else {
content = string(srcbuf) content = string(srcbuf)
} }

View File

@ -7,7 +7,7 @@ import (
"474420502.top/eson/gjson" "474420502.top/eson/gjson"
) )
func TestTest(t *testing.T) { func TestFromHTTPResponse(t *testing.T) {
var gresp *http.Response var gresp *http.Response
var err error var err error
@ -15,7 +15,7 @@ func TestTest(t *testing.T) {
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
resp, err := FromHTTPResponse(gresp) resp, err := FromHTTPResponse(gresp, false)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
@ -32,3 +32,17 @@ func TestTest(t *testing.T) {
t.Error("esp.GetSrcResponse().Header == nil") t.Error("esp.GetSrcResponse().Header == nil")
} }
} }
func TestResponseGzipZip(t *testing.T) {
ses := NewSession()
if wf := ses.Get("http://httpbin.org/get"); wf != nil {
wf.AddHeader("accept-encoding", "deflate")
resp, err := wf.Execute()
if err != nil {
t.Error(err)
} else {
t.Error(resp.Content())
}
}
}

View File

@ -90,6 +90,11 @@ type BasicAuth struct {
Password string Password string
} }
// IsSetting 是否设置的一些情景
type IsSetting struct {
isDecompressNoAccept bool
}
// Session 的基本方法 // Session 的基本方法
type Session struct { type Session struct {
auth *BasicAuth auth *BasicAuth
@ -103,6 +108,8 @@ type Session struct {
Header http.Header Header http.Header
Query url.Values Query url.Values
Is IsSetting
} }
const ( const (
@ -171,6 +178,10 @@ const (
// CCookiejar 持久化 CookieJar // CCookiejar 持久化 CookieJar
CCookiejar // true or false ; default = true CCookiejar // true or false ; default = true
// CDecompressNoAccept 解压 当response header 不存在 Accept-Encoding
// 很多特殊情景会不返回Accept-Encoding: Gzip. 如 不按照标准的网站
CDecompressNoAccept
) )
// NewSession 创建Session // NewSession 创建Session
@ -187,7 +198,7 @@ func NewSession() *Session {
} }
client.Jar = cjar client.Jar = cjar
return &Session{client: client, body: NewBody(), transport: transport, auth: nil, cookiejar: client.Jar, Header: make(http.Header)} return &Session{client: client, body: NewBody(), transport: transport, auth: nil, cookiejar: client.Jar, Header: make(http.Header), Is: IsSetting{false}}
} }
// SetConfig 设置配置 // SetConfig 设置配置
@ -210,7 +221,9 @@ func (ses *Session) SetConfig(typeConfig TypeConfig, values interface{}) {
panic(errors.New("error type " + reflect.TypeOf(v).String())) panic(errors.New("error type " + reflect.TypeOf(v).String()))
} }
case CDialTimeout: case CDialTimeout:
// 没时间实现这些小细节 // TODO: CDialTimeout CRequestTimeout 与 细节
case CDecompressNoAccept:
ses.Is.isDecompressNoAccept = values.(bool)
case CKeepAlives: case CKeepAlives:
ses.transport.DisableKeepAlives = !values.(bool) ses.transport.DisableKeepAlives = !values.(bool)
case CCookiejar: case CCookiejar:

View File

@ -312,5 +312,5 @@ func (wf *Workflow) Execute() (*Response, error) {
return nil, err return nil, err
} }
return FromHTTPResponse(resp) return FromHTTPResponse(resp, wf.session.Is.isDecompressNoAccept)
} }