87 lines
2.1 KiB
Go
87 lines
2.1 KiB
Go
package requests
|
|
|
|
import (
|
|
"bytes"
|
|
"compress/gzip"
|
|
"compress/zlib"
|
|
"io"
|
|
"io/ioutil"
|
|
"net/http"
|
|
)
|
|
|
|
// Response 响应内容包含http.Response 已读
|
|
type Response struct {
|
|
readContent string
|
|
readResponse *http.Response
|
|
}
|
|
|
|
// FromHTTPResponse 生成Response 从标准http.Response
|
|
func FromHTTPResponse(resp *http.Response, isDecompressNoAccept bool) (*Response, error) {
|
|
var err error
|
|
// 复制response 返回内容 并且测试是否有解压的需求
|
|
srcbuf, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
resp.Body.Close()
|
|
|
|
content := ""
|
|
|
|
if isDecompressNoAccept { // 在某个已经遗忘的网页测试过, 为了兼容 Python requests
|
|
srcReader := bytes.NewReader(srcbuf)
|
|
var reader io.ReadCloser
|
|
if reader, err = gzip.NewReader(srcReader); err == nil {
|
|
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)
|
|
}
|
|
|
|
} else {
|
|
content = string(srcbuf)
|
|
}
|
|
|
|
return &Response{readContent: content, readResponse: resp}, nil
|
|
}
|
|
|
|
// Content 返回解压后的内容
|
|
func (gresp *Response) Content() string {
|
|
return gresp.readContent
|
|
}
|
|
|
|
// GetSrcResponse 获取原生golang http.Response
|
|
func (gresp *Response) GetSrcResponse() *http.Response {
|
|
return gresp.readResponse
|
|
}
|
|
|
|
// GetStatue 获取Statue String
|
|
func (gresp *Response) GetStatue() string {
|
|
return gresp.readResponse.Status
|
|
}
|
|
|
|
// GetStatueCode 获取Statue int
|
|
func (gresp *Response) GetStatueCode() int {
|
|
return gresp.readResponse.StatusCode
|
|
}
|
|
|
|
// GetHeader Header map[string][]string
|
|
func (gresp *Response) GetHeader() http.Header {
|
|
return gresp.readResponse.Header
|
|
}
|
|
|
|
// GetContentLength 获取Content的内容长度, 如果存在 IsDecompressNoAccept 可能是压缩级别的长度, 非GetContent长度
|
|
func (gresp *Response) GetContentLength() int64 {
|
|
return gresp.readResponse.ContentLength
|
|
}
|