Commit 462befb8 authored by wangmingming's avatar wangmingming

处理入参cookie

parent 48d769fd
...@@ -5,19 +5,16 @@ import ( ...@@ -5,19 +5,16 @@ import (
"errors" "errors"
"fmt" "fmt"
"github.com/bitly/go-simplejson" "github.com/bitly/go-simplejson"
http "github.com/bogdanfinn/fhttp"
"github.com/wmm1996528/requests/url" "github.com/wmm1996528/requests/url"
"io"
) )
// Response结构体 // Response结构体
type Response struct { type Response struct {
Url string Url string
Headers url.Header Headers url.Header
Cookies []*http.Cookie Cookies map[string]string
Text string Text string
Content []byte Content []byte
Body io.ReadCloser
StatusCode int StatusCode int
History []*Response History []*Response
Request *url.Request Request *url.Request
...@@ -32,7 +29,7 @@ func (res *Response) Json() (map[string]interface{}, error) { ...@@ -32,7 +29,7 @@ func (res *Response) Json() (map[string]interface{}, error) {
// 使用go-simplejson解析 // 使用go-simplejson解析
func (res *Response) SimpleJson() (*simplejson.Json, error) { func (res *Response) SimpleJson() (*simplejson.Json, error) {
return simplejson.NewFromReader(res.Body) return simplejson.NewJson(res.Content)
} }
// 状态码是否错误 // 状态码是否错误
......
...@@ -2,7 +2,11 @@ package requests ...@@ -2,7 +2,11 @@ package requests
import ( import (
"bytes" "bytes"
"compress/flate"
"compress/gzip"
"encoding/binary"
"encoding/json" "encoding/json"
"github.com/andybalholm/brotli"
http "github.com/bogdanfinn/fhttp" http "github.com/bogdanfinn/fhttp"
"github.com/bogdanfinn/fhttp/cookiejar" "github.com/bogdanfinn/fhttp/cookiejar"
tls_client "github.com/bogdanfinn/tls-client" tls_client "github.com/bogdanfinn/tls-client"
...@@ -10,6 +14,9 @@ import ( ...@@ -10,6 +14,9 @@ import (
"github.com/wmm1996528/requests/tls" "github.com/wmm1996528/requests/tls"
"github.com/wmm1996528/requests/url" "github.com/wmm1996528/requests/url"
"io" "io"
"io/ioutil"
url2 "net/url"
"strings"
) )
func NewSession(tlsVersion tls.TlsVersion) *Session { func NewSession(tlsVersion tls.TlsVersion) *Session {
...@@ -91,7 +98,12 @@ func (s *Session) Do(method string, request *url.Request) (*models.Response, err ...@@ -91,7 +98,12 @@ func (s *Session) Do(method string, request *url.Request) (*models.Response, err
if s.Client == nil { if s.Client == nil {
// 初始化个新的 // 初始化个新的
s.Client = tls.NewClient(request.TlsProfile) s.Client = tls.NewClient(request.TlsProfile)
}
// 处理cookie
if request.Cookies != nil {
var cks []*http.Cookie
uri, _ := url2.Parse(request.Url)
s.Client.SetCookies(uri, cks)
} }
request.Method = method request.Method = method
...@@ -137,29 +149,110 @@ func (s *Session) PreData(request *url.Request) ([]byte, error) { ...@@ -137,29 +149,110 @@ func (s *Session) PreData(request *url.Request) ([]byte, error) {
if request.Data != nil { if request.Data != nil {
return []byte(request.Data.Encode()), nil return []byte(request.Data.Encode()), nil
} }
if request.Body != "" {
return []byte(request.Body), nil
}
return []byte{}, nil return []byte{}, nil
} }
// PreResponse 处理请求返回 // PreResponse 处理请求返回
func (s *Session) PreResponse(request *url.Request, do *http.Response) (*models.Response, error) { func (s *Session) PreResponse(request *url.Request, do *http.Response) (*models.Response, error) {
reader := http.DecompressBody(do) rb, err := io.ReadAll(do.Body)
rb, _ := io.ReadAll(reader) if err != nil {
return nil, err
}
encoding := do.Header.Get("Content-Encoding")
DecompressBody(&rb, encoding)
redirectURL, err := do.Location() redirectURL, err := do.Location()
redirectUrl := "" redirectUrl := ""
if err == nil { if err == nil {
// 没有错误时从跳转的location 获取url // 没有错误时从跳转的location 获取url
redirectUrl = redirectURL.String() redirectUrl = redirectURL.String()
} else {
redirectUrl = request.Url
} }
resp := &models.Response{ resp := &models.Response{
Url: redirectUrl, Url: redirectUrl,
Headers: url.Header(do.Header), Headers: url.Header(do.Header),
Cookies: do.Cookies(), Cookies: s.getAllCookie(request),
Text: string(rb), Text: string(rb),
Content: rb, Content: rb,
Body: reader,
StatusCode: do.StatusCode, StatusCode: do.StatusCode,
Request: request, Request: request,
} }
return resp, nil return resp, nil
} }
func (s *Session) getAllCookie(request *url.Request) map[string]string {
res := make(map[string]string)
uri, _ := url2.Parse(request.Url)
cks := s.Client.GetCookies(uri)
for _, ck := range cks {
res[ck.Name] = ck.Value
}
return res
}
// 解码Body数据
func DecompressBody(content *[]byte, encoding string) {
if encoding != "" {
if strings.ToLower(encoding) == "gzip" {
decodeGZip(content)
} else if strings.ToLower(encoding) == "deflate" {
decodeDeflate(content)
} else if strings.ToLower(encoding) == "br" {
decodeBrotli(content)
}
}
}
// 解码GZip编码
func decodeGZip(content *[]byte) error {
if content == nil {
return nil
}
b := new(bytes.Buffer)
binary.Write(b, binary.LittleEndian, content)
r, err := gzip.NewReader(b)
if err != nil {
return err
}
defer r.Close()
*content, err = ioutil.ReadAll(r)
if err != nil {
return err
}
return nil
}
// 解码deflate编码
func decodeDeflate(content *[]byte) error {
var err error
if content == nil {
return err
}
r := flate.NewReader(bytes.NewReader(*content))
defer r.Close()
*content, err = ioutil.ReadAll(r)
if err != nil {
return err
}
return nil
}
// 解码br编码
func decodeBrotli(content *[]byte) error {
var err error
if content == nil {
return err
}
r := brotli.NewReader(bytes.NewReader(*content))
*content, err = ioutil.ReadAll(r)
if err != nil {
return err
}
return nil
}
package url package url
import ( import (
"github.com/bogdanfinn/fhttp/cookiejar"
"github.com/wmm1996528/requests/tls" "github.com/wmm1996528/requests/tls"
"time" "time"
) )
...@@ -16,7 +15,7 @@ func NewRequest() *Request { ...@@ -16,7 +15,7 @@ func NewRequest() *Request {
type Request struct { type Request struct {
Params *Params Params *Params
Headers *Header Headers *Header
Cookies *cookiejar.Jar Cookies map[string]string
Data *Values Data *Values
Json map[string]interface{} Json map[string]interface{}
Body string Body string
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment