in elastictransport/discovery.go [128:190]
func (c *Client) getNodesInfo() ([]nodeInfo, error) {
var (
out []nodeInfo
scheme = c.urls[0].Scheme
)
var ctx context.Context
var cancel context.CancelFunc
if c.discoverNodeTimeout != nil {
ctx, cancel = context.WithTimeout(context.Background(), *c.discoverNodeTimeout)
defer cancel()
} else {
ctx = context.Background() // Use default context if no timeout is set
}
req, err := http.NewRequestWithContext(ctx, "GET", "/_nodes/http", nil)
if err != nil {
return out, err
}
c.Lock()
conn, err := c.pool.Next()
c.Unlock()
// TODO(karmi): If no connection is returned, fallback to original URLs
if err != nil {
return out, err
}
c.setReqURL(conn.URL, req)
c.setReqAuth(conn.URL, req)
c.setReqUserAgent(req)
c.setReqGlobalHeader(req)
res, err := c.transport.RoundTrip(req)
if err != nil {
return out, err
}
defer res.Body.Close()
if res.StatusCode > 200 {
body, _ := ioutil.ReadAll(res.Body)
return out, fmt.Errorf("server error: %s: %s", res.Status, body)
}
var env map[string]json.RawMessage
if err := json.NewDecoder(res.Body).Decode(&env); err != nil {
return out, err
}
var nodes map[string]nodeInfo
if err := json.Unmarshal(env["nodes"], &nodes); err != nil {
return out, err
}
for id, node := range nodes {
node.ID = id
node.URL = c.getNodeURL(node, scheme)
out = append(out, node)
}
return out, nil
}