#!mojo mojo:sky_viewer
<sky>
<script>
import '/sky/framework/embedder.dart';
import 'dart:async';
import 'dart:typed_data';
import "dart:sky.internals" as internals;
import 'mojo:bindings';
import 'mojo:core';

import 'package:mojo/services/network/public/interfaces/network_service.mojom.dart';
import 'package:mojo/services/network/public/interfaces/url_loader.mojom.dart';

Future<String> run(url) async {
  var networkService= new NetworkServiceProxy.unbound();
  embedder.connectToService("mojo:network_service", networkService);

  var urlLoader = new UrlLoaderProxy.unbound();
  networkService.ptr.createUrlLoader(urlLoader);

  var urlRequest = new UrlRequest()
      ..url = url
      ..autoFollowRedirects = true;
  var urlResponse = await urlLoader.ptr.start(urlRequest);

  urlLoader.close();
  networkService.close();

  print("url => ${urlResponse.response.url}");
  print("status_line => ${urlResponse.response.statusLine}");
  print("mime_type => ${urlResponse.response.mimeType}");

  ByteData bodyData =
      await DataPipeDrainer.drainHandle(urlResponse.response.body);
  print("read ${bodyData.lengthInBytes} bytes");

  return new String.fromCharCodes(new Uint8List.view(bodyData.buffer));
}

main() async {
  var url = "http://127.0.0.1:8000/sky/tests/services/resources/pass.txt";
  var result = await run(url);
  internals.notifyTestComplete(result);
}
</script>
</sky>
