// Copyright (c) 2013, 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.

library utils;

import 'dart:async';
import 'dart:convert';
import 'dart:io';
import "package:path/path.dart";

Future<int> getStatusCode(int port,
                          String path,
                          {String host,
                           bool secure: false,
                           DateTime ifModifiedSince,
                           bool rawPath: false}) {
  var uri;
  if (rawPath) {
    uri = new Uri(scheme: secure ? 'https' : 'http',
                  host: 'localhost',
                  port: port,
                  path: path);
  } else {
    uri = (secure ?
        new Uri.https('localhost:$port', path) :
        new Uri.http('localhost:$port', path));
  }
  return new HttpClient().getUrl(uri)
      .then((request) {
        if (host != null) request.headers.host = host;
        if (ifModifiedSince != null) {
          request.headers.ifModifiedSince = ifModifiedSince;
        }
        return request.close();
      })
      .then((response) => response.drain().then(
          (_) => response.statusCode));
}


Future<HttpHeaders> getHeaders(int port, String path) {
  return new HttpClient().get('localhost', port, path)
      .then((request) => request.close())
      .then((response) => response.drain().then(
          (_) => response.headers));
}


Future<String> getAsString(int port, String path) {
  return new HttpClient().get('localhost', port, path)
      .then((request) => request.close())
      .then((response) => UTF8.decodeStream(response));
}


const CERTIFICATE = "localhost_cert";


setupSecure() {
  String scriptDir = dirname(new Options().script);
  String certificateDatabase = join(scriptDir, 'pkcert');
  SecureSocket.initialize(database: certificateDatabase,
                          password: 'dartdart');
}
