text: /**
   * @license
   * Copyright Google Inc. All Rights Reserved.
   *
   * Use of this source code is governed by an MIT-style license that can be
   * found in the LICENSE file at https://angular.io/license
   */
  "use strict";
  var __extends = (this && this.__extends) || function (d, b) {
      for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
      function __() { this.constructor = d; }
      d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  };
  var core_1 = require('@angular/core');
  var exceptions_1 = require('../src/facade/exceptions');
  var lang_1 = require('../src/facade/lang');
  var base_request_options_1 = require('./base_request_options');
  var enums_1 = require('./enums');
  var interfaces_1 = require('./interfaces');
  var static_request_1 = require('./static_request');
  function httpRequest(backend, request) {
      return backend.createConnection(request).response;
  }
  function mergeOptions(defaultOpts, providedOpts, method, url) {
      var newOptions = defaultOpts;
      if (lang_1.isPresent(providedOpts)) {
          // Hack so Dart can used named parameters
          return newOptions.merge(new base_request_options_1.RequestOptions({
              method: providedOpts.method || method,
              url: providedOpts.url || url,
              search: providedOpts.search,
              headers: providedOpts.headers,
              body: providedOpts.body,
              withCredentials: providedOpts.withCredentials
          }));
      }
      if (lang_1.isPresent(method)) {
          return newOptions.merge(new base_request_options_1.RequestOptions({ method: method, url: url }));
      }
      else {
          return newOptions.merge(new base_request_options_1.RequestOptions({ url: url }));
      }
  }
  var Http = (function () {
      function Http(_backend, _defaultOptions) {
          this._backend = _backend;
          this._defaultOptions = _defaultOptions;
      }
      /**
       * Performs any type of http request. First argument is required, and can either be a url or
       * a {@link Request} instance. If the first argument is a url, an optional {@link RequestOptions}
       * object can be provided as the 2nd argument. The options object will be merged with the values
       * of {@link BaseRequestOptions} before performing the request.
       */
      Http.prototype.request = function (url, options) {
          var responseObservable;
          if (lang_1.isString(url)) {
              responseObservable = httpRequest(this._backend, new static_request_1.Request(mergeOptions(this._defaultOptions, options, enums_1.RequestMethod.Get, url)));
          }
          else if (url instanceof static_request_1.Request) {
              responseObservable = httpRequest(this._backend, url);
          }
          else {
              throw exceptions_1.makeTypeError('First argument must be a url string or Request instance.');
          }
          return responseObservable;
      };
      /**
       * Performs a request with `get` http method.
       */
      Http.prototype.get = function (url, options) {
          return httpRequest(this._backend, new static_request_1.Request(mergeOptions(this._defaultOptions, options, enums_1.RequestMethod.Get, url)));
      };
      /**
       * Performs a request with `post` http method.
       */
      Http.prototype.post = function (url, body, options) {
          return httpRequest(this._backend, new static_request_1.Request(mergeOptions(this._defaultOptions.merge(new base_request_options_1.RequestOptions({ body: body })), options, enums_1.RequestMethod.Post, url)));
      };
      /**
       * Performs a request with `put` http method.
       */
      Http.prototype.put = function (url, body, options) {
          return httpRequest(this._backend, new static_request_1.Request(mergeOptions(this._defaultOptions.merge(new base_request_options_1.RequestOptions({ body: body })), options, enums_1.RequestMethod.Put, url)));
      };
      /**
       * Performs a request with `delete` http method.
       */
      Http.prototype.delete = function (url, options) {
          return httpRequest(this._backend, new static_request_1.Request(mergeOptions(this._defaultOptions, options, enums_1.RequestMethod.Delete, url)));
      };
      /**
       * Performs a request with `patch` http method.
       */
      Http.prototype.patch = function (url, body, options) {
          return httpRequest(this._backend, new static_request_1.Request(mergeOptions(this._defaultOptions.merge(new base_request_options_1.RequestOptions({ body: body })), options, enums_1.RequestMethod.Patch, url)));
      };
      /**
       * Performs a request with `head` http method.
       */
      Http.prototype.head = function (url, options) {
          return httpRequest(this._backend, new static_request_1.Request(mergeOptions(this._defaultOptions, options, enums_1.RequestMethod.Head, url)));
      };
      /** @nocollapse */
      Http.decorators = [
          { type: core_1.Injectable },
      ];
      /** @nocollapse */
      Http.ctorParameters = [
          { type: interfaces_1.ConnectionBackend, },
          { type: base_request_options_1.RequestOptions, },
      ];
      return Http;
  }());
  exports.Http = Http;
  var Jsonp = (function (_super) {
      __extends(Jsonp, _super);
      function Jsonp(backend, defaultOptions) {
          _super.call(this, backend, defaultOptions);
      }
      /**
       * Performs any type of http request. First argument is required, and can either be a url or
       * a {@link Request} instance. If the first argument is a url, an optional {@link RequestOptions}
       * object can be provided as the 2nd argument. The options object will be merged with the values
       * of {@link BaseRequestOptions} before performing the request.
       *
       * @security Regular XHR is the safest alternative to JSONP for most applications, and is
       * supported by all current browsers. Because JSONP creates a `<script>` element with
       * contents retrieved from a remote source, attacker-controlled data introduced by an untrusted
       * source could expose your application to XSS risks. Data exposed by JSONP may also be
       * readable by malicious third-party websites. In addition, JSONP introduces potential risk for
       * future security issues (e.g. content sniffing).  For more detail, see the
       * [Security Guide](http://g.co/ng/security).
       */
      Jsonp.prototype.request = function (url, options) {
          var responseObservable;
          if (lang_1.isString(url)) {
              url =
                  new static_request_1.Request(mergeOptions(this._defaultOptions, options, enums_1.RequestMethod.Get, url));
          }
          if (url instanceof static_request_1.Request) {
              if (url.method !== enums_1.RequestMethod.Get) {
                  exceptions_1.makeTypeError('JSONP requests must use GET request method.');
              }
              responseObservable = httpRequest(this._backend, url);
          }
          else {
              throw exceptions_1.makeTypeError('First argument must be a url string or Request instance.');
          }
          return responseObservable;
      };
      /** @nocollapse */
      Jsonp.decorators = [
          { type: core_1.Injectable },
      ];
      /** @nocollapse */
      Jsonp.ctorParameters = [
          { type: interfaces_1.ConnectionBackend, },
          { type: base_request_options_1.RequestOptions, },
      ];
      return Jsonp;
  }(Http));
  exports.Jsonp = Jsonp;
  //# sourceMappingURL=http.js.map