Browse Source

client: establish httpClusterClient.reset

Brian Waldon 11 years ago
parent
commit
0943831b8e
1 changed files with 28 additions and 20 deletions
  1. 28 20
      client/http.go

+ 28 - 20
client/http.go

@@ -67,19 +67,34 @@ type CancelableTransport interface {
 }
 }
 
 
 func newHTTPClusterClient(tr CancelableTransport, eps []string) (*httpClusterClient, error) {
 func newHTTPClusterClient(tr CancelableTransport, eps []string) (*httpClusterClient, error) {
-	c := httpClusterClient{
-		transport: tr,
-		endpoints: eps,
-		clients:   make([]HTTPClient, len(eps)),
+	c := &httpClusterClient{}
+	if err := c.reset(tr, eps); err != nil {
+		return nil, err
 	}
 	}
+	return c, nil
+}
+
+type httpClusterClient struct {
+	transport CancelableTransport
+	endpoints []string
+	clients   []HTTPClient
+}
 
 
-	for i, ep := range eps {
-		u, err := url.Parse(ep)
+func (c *httpClusterClient) reset(tr CancelableTransport, eps []string) error {
+	le := len(eps)
+	ne := make([]string, le)
+	if copy(ne, eps) != le {
+		return errors.New("copy call failed")
+	}
+
+	nc := make([]HTTPClient, len(ne))
+	for i, e := range ne {
+		u, err := url.Parse(e)
 		if err != nil {
 		if err != nil {
-			return nil, err
+			return err
 		}
 		}
 
 
-		c.clients[i] = &redirectFollowingHTTPClient{
+		nc[i] = &redirectFollowingHTTPClient{
 			max: DefaultMaxRedirects,
 			max: DefaultMaxRedirects,
 			client: &httpClient{
 			client: &httpClient{
 				transport: tr,
 				transport: tr,
@@ -88,13 +103,11 @@ func newHTTPClusterClient(tr CancelableTransport, eps []string) (*httpClusterCli
 		}
 		}
 	}
 	}
 
 
-	return &c, nil
-}
+	c.endpoints = ne
+	c.clients = nc
+	c.transport = tr
 
 
-type httpClusterClient struct {
-	transport CancelableTransport
-	endpoints []string
-	clients   []HTTPClient
+	return nil
 }
 }
 
 
 func (c *httpClusterClient) Do(ctx context.Context, act HTTPAction) (resp *http.Response, body []byte, err error) {
 func (c *httpClusterClient) Do(ctx context.Context, act HTTPAction) (resp *http.Response, body []byte, err error) {
@@ -135,13 +148,8 @@ func (c *httpClusterClient) Sync(ctx context.Context) error {
 	if len(eps) == 0 {
 	if len(eps) == 0 {
 		return ErrNoEndpoints
 		return ErrNoEndpoints
 	}
 	}
-	nc, err := newHTTPClusterClient(c.transport, eps)
-	if err != nil {
-		return err
-	}
 
 
-	*c = *nc
-	return nil
+	return c.reset(c.transport, eps)
 }
 }
 
 
 type roundTripResponse struct {
 type roundTripResponse struct {