| // 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 'dart:async'; |
| import 'dart:typed_data'; |
| |
| import 'package:mojo/core.dart' as core; |
| import 'package:mojo/mojo/url_request.mojom.dart'; |
| import 'package:mojo/mojo/url_response.mojom.dart'; |
| import 'package:mojo_services/mojo/network_service.mojom.dart'; |
| import 'package:mojo_services/mojo/url_loader.mojom.dart'; |
| import 'package:sky/mojo/shell.dart' as shell; |
| |
| NetworkServiceProxy _initNetworkService() { |
| NetworkServiceProxy networkService = new NetworkServiceProxy.unbound(); |
| shell.requestService("mojo:authenticated_network_service", networkService); |
| return networkService; |
| } |
| |
| final NetworkServiceProxy _networkService = _initNetworkService(); |
| |
| class Response { |
| ByteData body; |
| |
| Response(this.body); |
| |
| String bodyAsString() { |
| if (body == null) |
| return null; |
| return new String.fromCharCodes(new Uint8List.view(body.buffer)); |
| } |
| } |
| |
| Future<UrlResponse> fetch(UrlRequest request) async { |
| try { |
| UrlLoaderProxy loader = new UrlLoaderProxy.unbound(); |
| _networkService.ptr.createUrlLoader(loader); |
| UrlResponse response = (await loader.ptr.start(request)).response; |
| loader.close(); |
| return response; |
| } catch (e) { |
| print("NetworkService unavailable $e"); |
| return new UrlResponse()..statusCode = 500; |
| } |
| } |
| |
| Future<UrlResponse> fetchUrl(String relativeUrl) async { |
| String url = Uri.base.resolve(relativeUrl).toString(); |
| UrlRequest request = new UrlRequest() |
| ..url = url |
| ..autoFollowRedirects = true; |
| return fetch(request); |
| } |
| |
| Future<Response> fetchBody(String relativeUrl) async { |
| UrlResponse response = await fetchUrl(relativeUrl); |
| if (response.body == null) return new Response(null); |
| |
| ByteData data = await core.DataPipeDrainer.drainHandle(response.body); |
| return new Response(data); |
| } |
| |
| Future<String> fetchString(String relativeUrl) async { |
| Response response = await fetchBody(relativeUrl); |
| return response.bodyAsString(); |
| } |