allow all options of HTTPPool to be specified by users
diff --git a/http.go b/http.go
index ac23865..5d43937 100644
--- a/http.go
+++ b/http.go
@@ -29,10 +29,8 @@
 	pb "github.com/golang/groupcache/groupcachepb"
 )
 
-// TODO: make this configurable?
 const defaultBasePath = "/_groupcache/"
 
-// TODO: make this configurable as well.
 const defaultReplicas = 50
 
 // HTTPPool implements PeerPicker for a pool of HTTP peers.
@@ -57,21 +55,59 @@
 	peers *consistenthash.Map
 }
 
-var httpPoolMade bool
+// HTTPPoolOptions are the configurations of a HTTPPool.
+type HTTPPoolOptions struct {
+	// BasePath specifies the HTTP path that will serve groupcache requests.
+	// If blank, it defaults to "/_groupcache/".
+	BasePath string
 
-// NewHTTPPool initializes an HTTP pool of peers.
-// It registers itself as a PeerPicker and as an HTTP handler with the
-// http.DefaultServeMux.
+	// Replicas specifies the number of key replicas on the consistent hash.
+	// If blank, it defaults to 50.
+	Replicas int
+
+	// HashFn specifies the hash function of the consistent hash.
+	// If blank, it defaults to crc32.ChecksumIEEE.
+	HashFn consistenthash.Hash
+}
+
+// NewHTTPPool initializes an HTTP pool of peers, and registers itself as a PeerPicker.
+// For convenience, it also registers itself as an http.Handler with http.DefaultServeMux.
 // The self argument be a valid base URL that points to the current server,
 // for example "http://example.net:8000".
 func NewHTTPPool(self string) *HTTPPool {
+	p := NewHTTPPoolOpts(self, nil)
+	http.Handle(p.basePath, p)
+	return p
+}
+
+var httpPoolMade bool
+
+// NewHTTPPoolOpts initializes an HTTP pool of peers with the given options.
+// Unlike NewHTTPPool, this function does not register the created pool as an HTTP handler.
+// The returned *HTTPPool implements http.Handler and must be registered using http.Handle.
+func NewHTTPPoolOpts(self string, o *HTTPPoolOptions) *HTTPPool {
 	if httpPoolMade {
 		panic("groupcache: NewHTTPPool must be called only once")
 	}
 	httpPoolMade = true
-	p := &HTTPPool{basePath: defaultBasePath, self: self, peers: consistenthash.New(defaultReplicas, nil)}
+
+	opts := HTTPPoolOptions{}
+	if o != nil {
+		opts = *o
+	}
+	if opts.BasePath == "" {
+		opts.BasePath = defaultBasePath
+	}
+	if opts.Replicas == 0 {
+		opts.Replicas = defaultReplicas
+	}
+
+	p := &HTTPPool{
+		basePath: opts.BasePath,
+		self:     self,
+		peers:    consistenthash.New(opts.Replicas, opts.HashFn),
+	}
 	RegisterPeerPicker(func() PeerPicker { return p })
-	http.Handle(defaultBasePath, p)
 	return p
 }