// TODO: if cluster URL has changed since last time, we need to ensure that we do
  // a fresh start. This takes place at the GlobalSession level. Verify!
  public static void fetchClusterURL(
      final GlobalSession session, final ClusterURLFetchDelegate delegate)
      throws URISyntaxException {
    Log.i(LOG_TAG, "In fetchClusterURL. Server URL is " + session.config.serverURL);
    String nodeWeaveURL = session.config.nodeWeaveURL();
    Log.d(LOG_TAG, "node/weave is " + nodeWeaveURL);

    BaseResource resource = new BaseResource(nodeWeaveURL);
    resource.delegate =
        new SyncResourceDelegate(resource) {

          @Override
          public void handleHttpResponse(HttpResponse response) {
            int status = response.getStatusLine().getStatusCode();
            switch (status) {
              case 200:
                Log.i(LOG_TAG, "Got 200 for node/weave fetch.");
                // Great!
                HttpEntity entity = response.getEntity();
                if (entity == null) {
                  delegate.handleSuccess(null);
                  return;
                }
                String output = null;
                try {
                  InputStream content = entity.getContent();
                  BufferedReader reader =
                      new BufferedReader(new InputStreamReader(content, "UTF-8"), 1024);
                  output = reader.readLine();
                  SyncResourceDelegate.consumeReader(reader);
                  reader.close();
                } catch (IllegalStateException e) {
                  delegate.handleError(e);
                } catch (IOException e) {
                  delegate.handleError(e);
                }

                if (output == null || output.equals("null")) {
                  delegate.handleSuccess(null);
                }
                delegate.handleSuccess(output);
                break;
              case 400:
              case 404:
                Log.i(LOG_TAG, "Got " + status + " for cluster URL request.");
                delegate.handleFailure(response);
                SyncResourceDelegate.consumeEntity(response.getEntity());
                break;
              default:
                Log.w(LOG_TAG, "Got " + status + " fetching node/weave. Returning failure.");
                delegate.handleFailure(response);
                SyncResourceDelegate.consumeEntity(response.getEntity());
            }
          }

          @Override
          public void handleHttpProtocolException(ClientProtocolException e) {
            delegate.handleError(e);
          }

          @Override
          public void handleHttpIOException(IOException e) {
            delegate.handleError(e);
          }

          @Override
          public void handleTransportException(GeneralSecurityException e) {
            delegate.handleError(e);
          }
        };

    resource.get();
  }