// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import '../shell.dart' as shell;
import 'dart:async';
import 'dart:sky' as sky;
import 'dart:typed_data';
import 'package:mojo/public/dart/core.dart' as core;
import 'package:mojo/services/network/public/interfaces/network_service.mojom.dart';
import 'package:mojo/services/network/public/interfaces/url_loader.mojom.dart';

class Response {
  ByteData body;

  Response(this.body);

  String bodyAsString() {
    return new String.fromCharCodes(new Uint8List.view(body.buffer));
  }
}

Future<Response> fetch(String relativeUrl) async {
  String url = new sky.URL(relativeUrl, sky.document.baseURI).href;

  var net = new NetworkServiceProxy.unbound();
  shell.requestService(net);

  var loader = new UrlLoaderProxy.unbound();
  net.ptr.createUrlLoader(loader);

  var request = new UrlRequest()
      ..url = url
      ..autoFollowRedirects = true;
  var response = (await loader.ptr.start(request)).response;

  loader.close();
  net.close();

  if (response.body == null)
    return new Response(null);

  ByteData data = await core.DataPipeDrainer.drainHandle(response.body);
  return new Response(data);
}
