Skip to content

Commit

Permalink
api: Refactoring into shared query logic
Browse files Browse the repository at this point in the history
  • Loading branch information
armon committed Feb 18, 2015
1 parent 0101ee3 commit c0c9fb5
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 40 deletions.
22 changes: 22 additions & 0 deletions api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,28 @@ func (c *Client) doRequest(r *request) (time.Duration, *http.Response, error) {
return diff, resp, err
}

// Query is used to do a GET request against an endpoint
// and deserialize the response into an interface using
// standard Consul conventions.
func (c *Client) query(endpoint string, out interface{}, q *QueryOptions) (*QueryMeta, error) {
r := c.newRequest("GET", endpoint)
r.setQueryOptions(q)
rtt, resp, err := requireOK(c.doRequest(r))
if err != nil {
return nil, err
}
defer resp.Body.Close()

qm := &QueryMeta{}
parseQueryMeta(resp, qm)
qm.RequestTime = rtt

if err := decodeBody(resp, out); err != nil {
return nil, err
}
return qm, nil
}

// parseQueryMeta is used to help parse query meta-data
func parseQueryMeta(resp *http.Response, q *QueryMeta) error {
header := resp.Header
Expand Down
18 changes: 18 additions & 0 deletions api/raw.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package api

// Raw can be used to do raw queries against custom endpoints
type Raw struct {
c *Client
}

// Raw returns a handle to query endpoints
func (c *Client) Raw() *Raw {
return &Raw{c}
}

// Query is used to do a GET request against an endpoint
// and deserialize the response into an interface using
// standard Consul conventions.
func (raw *Raw) Query(endpoint string, out interface{}, q *QueryOptions) (*QueryMeta, error) {
return raw.c.query(endpoint, out, q)
}
46 changes: 6 additions & 40 deletions api/session.go
Original file line number Diff line number Diff line change
Expand Up @@ -179,23 +179,11 @@ func (s *Session) RenewPeriodic(initialTTL string, id string, q *WriteOptions, d

// Info looks up a single session
func (s *Session) Info(id string, q *QueryOptions) (*SessionEntry, *QueryMeta, error) {
r := s.c.newRequest("GET", "/v1/session/info/"+id)
r.setQueryOptions(q)
rtt, resp, err := requireOK(s.c.doRequest(r))
if err != nil {
return nil, nil, err
}
defer resp.Body.Close()

qm := &QueryMeta{}
parseQueryMeta(resp, qm)
qm.RequestTime = rtt

var entries []*SessionEntry
if err := decodeBody(resp, &entries); err != nil {
qm, err := s.c.query("/v1/session/info/"+id, &entries, q)
if err != nil {
return nil, nil, err
}

if len(entries) > 0 {
return entries[0], qm, nil
}
Expand All @@ -204,41 +192,19 @@ func (s *Session) Info(id string, q *QueryOptions) (*SessionEntry, *QueryMeta, e

// List gets sessions for a node
func (s *Session) Node(node string, q *QueryOptions) ([]*SessionEntry, *QueryMeta, error) {
r := s.c.newRequest("GET", "/v1/session/node/"+node)
r.setQueryOptions(q)
rtt, resp, err := requireOK(s.c.doRequest(r))
if err != nil {
return nil, nil, err
}
defer resp.Body.Close()

qm := &QueryMeta{}
parseQueryMeta(resp, qm)
qm.RequestTime = rtt

var entries []*SessionEntry
if err := decodeBody(resp, &entries); err != nil {
qm, err := s.c.query("/v1/session/node/"+node, &entries, q)
if err != nil {
return nil, nil, err
}
return entries, qm, nil
}

// List gets all active sessions
func (s *Session) List(q *QueryOptions) ([]*SessionEntry, *QueryMeta, error) {
r := s.c.newRequest("GET", "/v1/session/list")
r.setQueryOptions(q)
rtt, resp, err := requireOK(s.c.doRequest(r))
if err != nil {
return nil, nil, err
}
defer resp.Body.Close()

qm := &QueryMeta{}
parseQueryMeta(resp, qm)
qm.RequestTime = rtt

var entries []*SessionEntry
if err := decodeBody(resp, &entries); err != nil {
qm, err := s.c.query("/v1/session/list", &entries, q)
if err != nil {
return nil, nil, err
}
return entries, qm, nil
Expand Down

0 comments on commit c0c9fb5

Please sign in to comment.