// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

/// Provides access to an authenticated HTTP client which can be used to access
/// Google APIs.
library gcloud.http;

import 'package:http/http.dart' as http;

import 'service_scope.dart' as ss;

const Symbol _authenticatedClientKey = #gcloud.http;

/// Access the [http.Client] object available in the current service scope.
///
/// The returned object will be the one which was previously registered with
/// [registerAuthClientService] within the current (or a parent) service
/// scope.
///
/// Accessing this getter outside of a service scope will result in an error.
/// See the `package:gcloud/service_scope.dart` library for more information.
http.Client get authClientService => ss.lookup(_authenticatedClientKey);

/// Registers the [http.Client] object within the current service scope.
///
/// The provided `client` object will be avilable via the top-level
/// `authenticatedHttp` getter.
///
/// Calling this function outside of a service scope will result in an error.
/// Calling this function more than once inside the same service scope is not
/// allowed.
void registerAuthClientService(http.Client client, {bool close: true}) {
  ss.register(_authenticatedClientKey, client);
  if (close) {
    ss.registerScopeExitCallback(() => client.close());
  }
}
