This commit is contained in:
gospider
2025-02-21 23:44:54 +08:00
parent 4885a83b7d
commit 730d3fd786
3 changed files with 18 additions and 13 deletions

1
go.mod
View File

@@ -79,4 +79,5 @@ require (
golang.org/x/sys v0.30.0 // indirect
golang.org/x/text v0.22.0 // indirect
golang.org/x/tools v0.30.0 // indirect
google.golang.org/protobuf v1.36.5 // indirect
)

3
go.sum
View File

@@ -447,8 +447,7 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/protobuf v1.36.2 h1:R8FeyR1/eLmkutZOM5CWghmo5itiG9z0ktFlTVLuTmU=
google.golang.org/protobuf v1.36.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=

View File

@@ -320,39 +320,44 @@ func (obj *Response) IsSSE() bool {
// read body
func (obj *Response) ReadBody() (err error) {
obj.readBodyLock.Lock()
defer obj.readBodyLock.Unlock()
if obj.IsWebSocket() && obj.IsSSE() {
return errors.New("can not read stream")
}
obj.readBodyLock.Lock()
defer func() {
if err != nil {
obj.ForceCloseConn()
}
obj.readBodyLock.Unlock()
}()
if obj.readBody {
return nil
}
obj.readBody = true
bBody := bytes.NewBuffer(nil)
done := make(chan struct{})
var readErr error
go func() {
defer close(done)
if obj.option.Bar && obj.ContentLength() > 0 {
_, err = io.Copy(&barBody{
_, readErr = io.Copy(&barBody{
bar: bar.NewClient(obj.response.ContentLength),
body: bBody,
}, obj.Body())
} else {
_, err = io.Copy(bBody, obj.Body())
_, readErr = io.Copy(bBody, obj.Body())
}
if err == io.ErrUnexpectedEOF {
err = nil
if readErr == io.ErrUnexpectedEOF {
readErr = nil
}
}()
select {
case <-obj.ctx.Done():
err = obj.ctx.Err()
return tools.WrapError(obj.ctx.Err(), "response read ctx error")
case <-done:
}
if err != nil {
obj.ForceCloseConn()
return errors.New("response read content error: " + err.Error())
if readErr != nil {
return tools.WrapError(readErr, "response read content error")
}
}
if !obj.option.DisDecode && obj.defaultDecode() {
obj.content, obj.encoding, _ = tools.Charset(bBody.Bytes(), obj.ContentType())