forked from hswaw/hscloud
cluster/identd/ident: add Query function
This is a high-level wrapper for querying identd, and uses IdentError to carry errors received from the server. Change-Id: I6444a67117193b97146ffd1548151cdb234d47b5master
parent
1c2bc12ad0
commit
8e603e13e5
|
@ -185,3 +185,41 @@ func (c *Client) Close() error {
|
||||||
}
|
}
|
||||||
return c.conn.Close()
|
return c.conn.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Query performs a single ident protocol request to a server running at target
|
||||||
|
// and returns the received ident response. If the ident server cannot be
|
||||||
|
// queries, or the ident server returns an ident error, an error is returned.
|
||||||
|
//
|
||||||
|
// This a convenience wrapper around Dial/Do. The given target must be either a
|
||||||
|
// host or host:port pair. If not given, the port defaults to 113.
|
||||||
|
//
|
||||||
|
// Returned ident server error resposes are *IdentError, and can be tested for
|
||||||
|
// using errors.Is/errors.As. See the IdentError type documentation for more
|
||||||
|
// information.
|
||||||
|
//
|
||||||
|
// The given context will be used to time out the request, either at the
|
||||||
|
// connection or request stage. If the context is canceled/times out, the
|
||||||
|
// context error will be returned and the query aborted.
|
||||||
|
//
|
||||||
|
// Since Query opens a connection to the ident server just for a single query,
|
||||||
|
// it should not be used if a single server is going to be queries about
|
||||||
|
// multiple addresses, and instead Dial/Do should be used to keep a
|
||||||
|
// long-standing connection if possible.
|
||||||
|
func Query(ctx context.Context, target string, client, server uint16) (*IdentResponse, error) {
|
||||||
|
cl, err := Dial(target)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("could not dial: %w", err)
|
||||||
|
}
|
||||||
|
defer cl.Close()
|
||||||
|
resp, err := cl.Do(ctx, &Request{
|
||||||
|
ClientPort: client,
|
||||||
|
ServerPort: server,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("could not query: %w", err)
|
||||||
|
}
|
||||||
|
if resp.Ident != nil {
|
||||||
|
return resp.Ident, nil
|
||||||
|
}
|
||||||
|
return nil, &IdentError{Inner: resp.Error}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue