Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(362)

Side by Side Diff: sdk/lib/_internal/pub/lib/src/command/serve.dart

Issue 22878002: Handle missing files more gracefully in pub serve. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Revise. Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library pub.command.serve; 5 library pub.command.serve;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:io'; 8 import 'dart:io';
9 9
10 import 'package:barback/barback.dart'; 10 import 'package:barback/barback.dart';
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 }); 71 });
72 72
73 barback.errors.listen((error) { 73 barback.errors.listen((error) {
74 log.error("${_red}Build error:\n$error$_none"); 74 log.error("${_red}Build error:\n$error$_none");
75 }); 75 });
76 76
77 // TODO(rnystrom): Watch file system and update sources again when they 77 // TODO(rnystrom): Watch file system and update sources again when they
78 // are added or modified. 78 // are added or modified.
79 79
80 HttpServer.bind("localhost", port).then((server) { 80 HttpServer.bind("localhost", port).then((server) {
81 log.message("Serving ${entrypoint.root.name} "
82 "on http://localhost:${server.port}");
83
84 // Add all of the visible files. 81 // Add all of the visible files.
85 for (var package in provider.packages) { 82 for (var package in provider.packages) {
86 barback.updateSources(provider.listAssets(package)); 83 barback.updateSources(provider.listAssets(package));
87 } 84 }
88 85
86 log.message("Serving ${entrypoint.root.name} "
87 "on http://localhost:${server.port}");
88
89 server.listen((request) { 89 server.listen((request) {
90 var id = getIdFromUri(request.uri); 90 var id = getIdFromUri(request.uri);
91 if (id == null) { 91 if (id == null) {
92 return notFound(request, "Path ${request.uri.path} is not valid."); 92 return notFound(request, "Path ${request.uri.path} is not valid.");
93 } 93 }
94 94
95 barback.getAssetById(id).then((asset) { 95 barback.getAssetById(id).then((asset) {
96 log.message( 96 return validateStream(asset.read()).then((stream) {
97 "$_green${request.method}$_none ${request.uri} -> $asset"); 97 log.message(
98 // TODO(rnystrom): Set content-type based on asset type. 98 "$_green${request.method}$_none ${request.uri} -> $asset");
99 return request.response.addStream(asset.read()).then((_) { 99 // TODO(rnystrom): Set content-type based on asset type.
100 return request.response.addStream(stream).then((_) {
101 request.response.close();
102 });
103 }).catchError((error) {
104 log.error("$_red${request.method}$_none "
105 "${request.uri} -> $error");
106
107 // If we couldn't read the asset, handle the error gracefully.
108 if (error is FileException) {
109 // Assume this means the asset was a file-backed source asset
110 // and we couldn't read it, so treat it like a missing asset.
111 notFound(request, error);
112 return;
113 }
114
115 // Otherwise, it's some internal error.
116 request.response.statusCode = 500;
117 request.response.reasonPhrase = "Internal Error";
118 request.response.write(error);
100 request.response.close(); 119 request.response.close();
101 }); 120 });
102 // TODO(rnystrom): Serve up a 500 if we get an error reading the
103 // asset.
104 }).catchError((error) { 121 }).catchError((error) {
105 log.error("$_red${request.method}$_none ${request.uri} -> $error"); 122 log.error("$_red${request.method}$_none ${request.uri} -> $error");
106 if (error is! AssetNotFoundException) { 123 if (error is! AssetNotFoundException) {
107 completer.completeError(error); 124 completer.completeError(error);
108 return; 125 return;
109 } 126 }
110 127
111 notFound(request, error); 128 notFound(request, error);
112 }); 129 });
113 }); 130 });
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 180
164 // If we got here, we had a path like "/packages" which is a special 181 // If we got here, we had a path like "/packages" which is a special
165 // directory, but not a valid path since it lacks a following package name. 182 // directory, but not a valid path since it lacks a following package name.
166 if (isSpecial) return null; 183 if (isSpecial) return null;
167 184
168 // Otherwise, it's a path in current package's web directory. 185 // Otherwise, it's a path in current package's web directory.
169 return new AssetId(entrypoint.root.name, 186 return new AssetId(entrypoint.root.name,
170 path.url.join("web", path.url.joinAll(parts))); 187 path.url.join("web", path.url.joinAll(parts)));
171 } 188 }
172 } 189 }
OLDNEW
« no previous file with comments | « no previous file | sdk/lib/_internal/pub/lib/src/utils.dart » ('j') | sdk/lib/_internal/pub/lib/src/utils.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698