diff --git a/packages/flutter/lib/src/http/mojo_client.dart b/packages/flutter/lib/src/http/mojo_client.dart index 3665f4220a1..af1d8f066aa 100644 --- a/packages/flutter/lib/src/http/mojo_client.dart +++ b/packages/flutter/lib/src/http/mojo_client.dart @@ -149,8 +149,14 @@ class MojoClient { ByteData data = await mojo.DataPipeDrainer.drainHandle(response.body); Uint8List bodyBytes = new Uint8List.view(data.buffer); return new Response(bodyBytes: bodyBytes, statusCode: response.statusCode); - } catch (e) { - print("NetworkService unavailable $e"); + } catch (exception) { + assert(() { + debugPrint('-- EXCEPTION CAUGHT BY NETWORKING HTTP LIBRARY -------------------------'); + debugPrint('An exception was raised while sending bytes to the Mojo network library:'); + debugPrint('$exception'); + debugPrint('------------------------------------------------------------------------'); + return true; + }); return new Response(statusCode: 500); } finally { loader.close(); diff --git a/packages/flutter/lib/src/services/fetch.dart b/packages/flutter/lib/src/services/fetch.dart index fbe8b594794..bf2f7fc1f8a 100644 --- a/packages/flutter/lib/src/services/fetch.dart +++ b/packages/flutter/lib/src/services/fetch.dart @@ -4,32 +4,47 @@ import 'dart:async'; -import 'package:mojo/mojo/url_request.mojom.dart'; -import 'package:mojo/mojo/url_response.mojom.dart'; -import 'package:mojo_services/mojo/url_loader.mojom.dart'; +import 'package:mojo/mojo/url_request.mojom.dart' as mojom; +import 'package:mojo/mojo/url_response.mojom.dart' as mojom; +import 'package:mojo_services/mojo/url_loader.mojom.dart' as mojom; import '../http/mojo_client.dart'; +import 'print.dart'; export 'package:mojo/mojo/url_response.mojom.dart' show UrlResponse; -Future fetch(UrlRequest request) async { - UrlLoaderProxy loader = new UrlLoaderProxy.unbound(); +Future fetch(mojom.UrlRequest request, { bool require200: false }) async { + mojom.UrlLoaderProxy loader = new mojom.UrlLoaderProxy.unbound(); try { MojoClient.networkService.ptr.createUrlLoader(loader); - UrlResponse response = (await loader.ptr.start(request)).response; + mojom.UrlResponse response = (await loader.ptr.start(request)).response; + if (require200 && (response.error != null || response.statusCode != 200)) { + StringBuffer message = new StringBuffer(); + message.writeln('Could not ${request.method ?? "fetch"} ${request.url ?? "resource"}'); + if (response.error != null) + message.writeln('Network error: ${response.error.code} ${response.error.description ?? ""}'); + if (response.statusCode != 200) + message.writeln('Protocol error: ${response.statusCode} ${response.statusLine ?? ""}'); + if (response.url != request.url) + message.writeln('Final URL after redirects was: ${response.url}'); + throw message; + } return response; - } catch (e) { - print("NetworkService unavailable $e"); - return new UrlResponse()..statusCode = 500; + } catch (exception) { + debugPrint('-- EXCEPTION CAUGHT BY NETWORKING HTTP LIBRARY -------------------------'); + debugPrint('An exception was raised while sending bytes to the Mojo network library:'); + debugPrint('$exception'); + debugPrint('------------------------------------------------------------------------'); + return null; } finally { loader.close(); } } -Future fetchUrl(String relativeUrl) { +Future fetchUrl(String relativeUrl, { bool require200: false }) { String url = Uri.base.resolve(relativeUrl).toString(); - UrlRequest request = new UrlRequest() + mojom.UrlRequest request = new mojom.UrlRequest() ..url = url ..autoFollowRedirects = true; - return fetch(request); + return fetch(request, require200: require200); } diff --git a/packages/flutter/lib/src/services/image_cache.dart b/packages/flutter/lib/src/services/image_cache.dart index 4141210ae9f..560e182c447 100644 --- a/packages/flutter/lib/src/services/image_cache.dart +++ b/packages/flutter/lib/src/services/image_cache.dart @@ -52,15 +52,14 @@ class _UrlFetcher implements ImageProvider { @override Future loadImage() async { - UrlResponse response = await fetchUrl(_url); - if (response.statusCode >= 400) { - print("Failed (${response.statusCode}) to load image $_url"); - return null; + UrlResponse response = await fetchUrl(_url, require200: true); + if (response != null) { + return new ImageInfo( + image: await decodeImageFromDataPipe(response.body), + scale: _scale + ); } - return new ImageInfo( - image: await decodeImageFromDataPipe(response.body), - scale: _scale - ); + return null; } @override