Files
curlx/resopnse.go
T

148 lines
2.6 KiB
Go
Raw Normal View History

2023-08-06 01:17:27 +08:00
package curlx
import (
2025-12-28 15:14:05 +08:00
"compress/gzip"
"io"
2023-08-06 01:17:27 +08:00
"net"
"net/http"
"strings"
"github.com/tidwall/gjson"
)
// Response response object
type Response struct {
response *http.Response
request *http.Request
body []byte
err error
2023-08-06 01:17:27 +08:00
}
2025-12-28 15:14:05 +08:00
func (l *Response) Close() error {
if l.response.Body != nil {
return l.response.Body.Close()
2023-08-06 01:17:27 +08:00
}
2025-12-28 15:14:05 +08:00
return nil
2023-08-06 01:17:27 +08:00
}
// GetRequest get request object
func (r *Response) GetRequest() *http.Request {
return r.request
2023-08-06 01:17:27 +08:00
}
2025-12-28 15:14:05 +08:00
func (r *Response) GetResponse() *http.Response {
return r.response
2023-08-06 01:17:27 +08:00
}
2025-12-28 15:14:05 +08:00
// GetBody parse response body
func (r *Response) GetBody() ([]byte, error) {
if r.err != nil {
return nil, r.err
2025-12-28 15:14:05 +08:00
}
if r.body != nil {
return r.body, nil
2025-12-28 15:14:05 +08:00
}
if r.response == nil {
2025-12-28 15:14:05 +08:00
return nil, nil
}
body := []byte{}
var err error
if r.response.Header.Get("Content-Encoding") == "gzip" {
reader, err := gzip.NewReader(r.response.Body)
2025-12-28 15:14:05 +08:00
if err != nil {
return nil, err
}
defer reader.Close()
body, err = io.ReadAll(reader)
if err != nil {
return nil, err
}
} else {
body, err = io.ReadAll(r.response.Body)
2025-12-28 15:14:05 +08:00
if err != nil {
return nil, err
}
}
// close body
r.response.Body.Close()
2023-08-06 01:17:27 +08:00
r.body = body
2025-12-28 15:14:05 +08:00
return body, err
2023-08-06 01:17:27 +08:00
}
2025-12-28 15:14:05 +08:00
func (r Response) GetStatusCode() int {
if r.response == nil {
2025-12-28 15:14:05 +08:00
return 0
}
return r.response.StatusCode
2023-08-06 01:17:27 +08:00
}
// IsTimeout get if request is timeout
func (r *Response) IsTimeout() bool {
if r.err == nil {
2023-08-06 01:17:27 +08:00
return false
}
netErr, ok := r.err.(net.Error)
2023-08-06 01:17:27 +08:00
if !ok {
return false
}
if netErr.Timeout() {
return true
}
return false
}
2025-12-28 15:14:05 +08:00
// GetParsedBody parse response body with gjson
func (r *Response) GetParsedBody() (*gjson.Result, error) {
body, err := r.GetBody()
if err != nil {
return nil, err
}
pb := gjson.ParseBytes(body)
return &pb, nil
}
2023-08-06 01:17:27 +08:00
// GetHeaders get response headers
func (r *Response) GetHeaders() map[string][]string {
if r.response == nil {
return nil
}
return r.response.Header
2023-08-06 01:17:27 +08:00
}
// GetHeader get response header
func (r *Response) GetHeader(name string) []string {
headers := r.GetHeaders()
for k, v := range headers {
2025-09-13 22:23:29 +08:00
if strings.EqualFold(name, k) {
2023-08-06 01:17:27 +08:00
return v
}
}
return nil
}
// GetHeaderLine get a single response header
func (r *Response) GetHeaderLine(name string) string {
header := r.GetHeader(name)
if len(header) > 0 {
return header[0]
}
return ""
}
// HasHeader get if header exsits in response headers
func (r *Response) HasHeader(name string) bool {
headers := r.GetHeaders()
for k := range headers {
2025-09-13 17:50:06 +08:00
if strings.EqualFold(name, k) {
2023-08-06 01:17:27 +08:00
return true
}
}
return false
}