content length, file not found
diff --git a/lib/shelf_static.dart b/lib/shelf_static.dart
index dbaa478..dc22e83 100644
--- a/lib/shelf_static.dart
+++ b/lib/shelf_static.dart
@@ -9,6 +9,7 @@
// default document
// sym links
// mime type handling
+// hidden files
Handler getHandler(String fileSystemPath) {
return (Request request) {
@@ -20,12 +21,23 @@
var requestedPath = p.joinAll(segs);
var file = new File(requestedPath);
- return file.resolveSymbolicLinks().then((String resolvedPath) {
- if(!p.isWithin(rootPath, resolvedPath)) {
- throw 'Requested path ${request.pathInfo} resolved to $resolvedPath is not under $rootPath.';
- }
+ if (!file.existsSync()) {
+ return new Response.notFound('Not Found');
+ }
- return new Response.ok(file.openRead());
- });
+ var resolvedPath = file.resolveSymbolicLinksSync();
+
+ if (!p.isWithin(rootPath, resolvedPath)) {
+ throw 'Requested path ${request.pathInfo} resolved to $resolvedPath '
+ 'is not under $rootPath.';
+ }
+
+ var stats = file.statSync();
+
+ var headers = {
+ HttpHeaders.CONTENT_LENGTH: stats.size
+ };
+
+ return new Response.ok(file.openRead(), headers: headers);
};
}
diff --git a/test/basic_file_test.dart b/test/basic_file_test.dart
index d41c6d0..6e6aecb 100644
--- a/test/basic_file_test.dart
+++ b/test/basic_file_test.dart
@@ -8,7 +8,6 @@
import 'test_util.dart';
void main() {
-
setUp(() {
var tempDir;
schedule(() {
@@ -32,16 +31,26 @@
test('access root file', () {
schedule(() {
-
var handler = getHandler(d.defaultRoot);
return makeRequest(handler, '/root.txt').then((response) {
expect(response.statusCode, HttpStatus.OK);
+ expect(response.headers[HttpHeaders.CONTENT_LENGTH], 8);
expect(response.readAsString(), completion('root txt'));
});
});
});
+ test('file not found', () {
+ schedule(() {
+ var handler = getHandler(d.defaultRoot);
+
+ return makeRequest(handler, '/not_here.txt').then((response) {
+ expect(response.statusCode, HttpStatus.NOT_FOUND);
+ });
+ });
+ });
+
// root file success, fail
// pathed file success, fail