interfaces: add ListServersByFilter() method

This method allows us list servers based on certain URI filter
paramters provided by the API endpoint.
diff --git a/interfaces.go b/interfaces.go
index 71c0be4..4c7dbee 100644
--- a/interfaces.go
+++ b/interfaces.go
@@ -1,5 +1,7 @@
 package gophercloud
 
+import "net/url"
+
 // AccessProvider instances encapsulate a Keystone authentication interface.
 type AccessProvider interface {
 	// FirstEndpointUrlByCriteria searches through the service catalog for the first
@@ -38,6 +40,22 @@
 	// in that it returns all available details for each server returned.
 	ListServers() ([]Server, error)
 
+	// ListServersByFilters provides a list of servers hosted by the user in a
+	// given region. This function let you requests servers by certain URI
+	// paramaters defined by the API endpoint.  This is sometimes more suitable
+	// if you have many servers and you only want to pick servers on certain
+	// criterias. An example usage could be :
+	//
+	//	   filter := url.Values{}
+	//	   filter.Set("name", "MyServer")
+	//	   filter.Set("status", "ACTIVE")
+	//
+	//	   filteredServers, err := c.ListServersByFilters(filter)
+	//
+	// Here, filteredServers only contains servers whose name started with
+	// "MyServer" and are in "ACTIVE" status.
+	ListServersByFilter(filter url.Values) ([]Server, error)
+
 	// ListServers provides a complete list of servers hosted by the user
 	// in a given region.  This function differs from ListServers() in that
 	// it returns only IDs and links to each server returned.
diff --git a/servers.go b/servers.go
index 425853b..1f6a7a4 100644
--- a/servers.go
+++ b/servers.go
@@ -5,9 +5,11 @@
 
 import (
 	"fmt"
+	"net/url"
+	"strings"
+
 	"github.com/mitchellh/mapstructure"
 	"github.com/racker/perigee"
-	"strings"
 )
 
 // genericServersProvider structures provide the implementation for generic OpenStack-compatible
@@ -26,6 +28,23 @@
 }
 
 // See the CloudServersProvider interface for details.
+func (gcp *genericServersProvider) ListServersByFilter(filter url.Values) ([]Server, error) {
+	var ss []Server
+
+	err := gcp.context.WithReauth(gcp.access, func() error {
+		url := gcp.endpoint + "/servers/detail?" + filter.Encode()
+		return perigee.Get(url, perigee.Options{
+			CustomClient: gcp.context.httpClient,
+			Results:      &struct{ Servers *[]Server }{&ss},
+			MoreHeaders: map[string]string{
+				"X-Auth-Token": gcp.access.AuthToken(),
+			},
+		})
+	})
+	return ss, err
+}
+
+// See the CloudServersProvider interface for details.
 func (gcp *genericServersProvider) ListServersLinksOnly() ([]Server, error) {
 	var ss []Server
 
@@ -496,7 +515,7 @@
 			MoreHeaders: map[string]string{
 				"X-Auth-Token": gsp.access.AuthToken(),
 			},
-			Results: &struct{Security_group_default_rules *[]SGRule}{&sgrs},
+			Results: &struct{ Security_group_default_rules *[]SGRule }{&sgrs},
 		})
 	})
 	return sgrs, err
@@ -511,8 +530,10 @@
 			MoreHeaders: map[string]string{
 				"X-Auth-Token": gsp.access.AuthToken(),
 			},
-			Results: &struct{Security_group_default_rule **SGRule}{&sgr},
-			ReqBody: struct{Security_group_default_rule SGRule `json:"security_group_default_rule"`}{r},
+			Results: &struct{ Security_group_default_rule **SGRule }{&sgr},
+			ReqBody: struct {
+				Security_group_default_rule SGRule `json:"security_group_default_rule"`
+			}{r},
 		})
 	})
 	return sgr, err
@@ -527,7 +548,7 @@
 			MoreHeaders: map[string]string{
 				"X-Auth-Token": gsp.access.AuthToken(),
 			},
-			Results: &struct{Security_group_default_rule **SGRule}{&sgr},
+			Results: &struct{ Security_group_default_rule **SGRule }{&sgr},
 		})
 	})
 	return sgr, err