mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
v2_client: read whole response body before close
Client have to read whole response bodies if they want the advantage of reusing TCP connections. https://code.google.com/p/go/source/detail?r=d4e1ec84876c0f5611ab86a03826da14b866efb2&name=release-branch.go1.1&path=/src/pkg/net/http/transport.go
This commit is contained in:
parent
984f309815
commit
ee2d5d66af
@ -72,7 +72,7 @@ func (c *v2client) GetMachines(url string) ([]*machineMessage, *etcdErr.Error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
msgs := new([]*machineMessage)
|
msgs := new([]*machineMessage)
|
||||||
if uerr := c.parseJSONResponse(resp, msgs); uerr != nil {
|
if uerr := c.readJSONResponse(resp, msgs); uerr != nil {
|
||||||
return nil, uerr
|
return nil, uerr
|
||||||
}
|
}
|
||||||
return *msgs, nil
|
return *msgs, nil
|
||||||
@ -85,7 +85,7 @@ func (c *v2client) GetClusterConfig(url string) (*config.ClusterConfig, *etcdErr
|
|||||||
}
|
}
|
||||||
|
|
||||||
config := new(config.ClusterConfig)
|
config := new(config.ClusterConfig)
|
||||||
if uerr := c.parseJSONResponse(resp, config); uerr != nil {
|
if uerr := c.readJSONResponse(resp, config); uerr != nil {
|
||||||
return nil, uerr
|
return nil, uerr
|
||||||
}
|
}
|
||||||
return config, nil
|
return config, nil
|
||||||
@ -102,20 +102,20 @@ func (c *v2client) AddMachine(url string, name string, info *context) *etcdErr.E
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return clientError(err)
|
return clientError(err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
if err := c.checkErrorResponse(resp); err != nil {
|
if err := c.readErrorResponse(resp); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *v2client) parseJSONResponse(resp *http.Response, val interface{}) *etcdErr.Error {
|
func (c *v2client) readJSONResponse(resp *http.Response, val interface{}) *etcdErr.Error {
|
||||||
defer resp.Body.Close()
|
if err := c.readErrorResponse(resp); err != nil {
|
||||||
|
|
||||||
if err := c.checkErrorResponse(resp); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
defer ioutil.ReadAll(resp.Body)
|
||||||
|
|
||||||
if err := json.NewDecoder(resp.Body).Decode(val); err != nil {
|
if err := json.NewDecoder(resp.Body).Decode(val); err != nil {
|
||||||
log.Printf("Error parsing join response: %v", err)
|
log.Printf("Error parsing join response: %v", err)
|
||||||
return clientError(err)
|
return clientError(err)
|
||||||
@ -123,8 +123,13 @@ func (c *v2client) parseJSONResponse(resp *http.Response, val interface{}) *etcd
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *v2client) checkErrorResponse(resp *http.Response) *etcdErr.Error {
|
func (c *v2client) readErrorResponse(resp *http.Response) *etcdErr.Error {
|
||||||
if resp.StatusCode != http.StatusOK {
|
if resp.StatusCode == http.StatusOK {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
defer ioutil.ReadAll(resp.Body)
|
||||||
|
|
||||||
uerr := &etcdErr.Error{}
|
uerr := &etcdErr.Error{}
|
||||||
if err := json.NewDecoder(resp.Body).Decode(uerr); err != nil {
|
if err := json.NewDecoder(resp.Body).Decode(uerr); err != nil {
|
||||||
log.Printf("Error parsing response to etcd error: %v", err)
|
log.Printf("Error parsing response to etcd error: %v", err)
|
||||||
@ -132,8 +137,6 @@ func (c *v2client) checkErrorResponse(resp *http.Response) *etcdErr.Error {
|
|||||||
}
|
}
|
||||||
return uerr
|
return uerr
|
||||||
}
|
}
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// put sends server side PUT request.
|
// put sends server side PUT request.
|
||||||
// It always follows redirects instead of stopping according to RFC 2616.
|
// It always follows redirects instead of stopping according to RFC 2616.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user