Index: mojo/public/dart/third_party/shelf_static/lib/src/directory_listing.dart |
diff --git a/mojo/public/dart/third_party/shelf_static/lib/src/directory_listing.dart b/mojo/public/dart/third_party/shelf_static/lib/src/directory_listing.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f1df7e3825c69a99ddf4c866682b7ba3108b87b4 |
--- /dev/null |
+++ b/mojo/public/dart/third_party/shelf_static/lib/src/directory_listing.dart |
@@ -0,0 +1,98 @@ |
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library shelf_static.directory_listing; |
+ |
+import 'dart:async'; |
+import 'dart:convert'; |
+import 'dart:io'; |
+ |
+import 'package:path/path.dart' as path; |
+import 'package:shelf/shelf.dart'; |
+ |
+String _getHeader(String sanitizedHeading) { |
+ return '''<!DOCTYPE html> |
+<html> |
+<head> |
+ <title>Directory listing for $sanitizedHeading</title> |
+ <style> |
+ html, body { |
+ margin: 0; |
+ padding: 0; |
+ } |
+ body { |
+ font-family: sans-serif; |
+ } |
+ h1 { |
+ background-color: #607D8B; |
+ box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.37); |
+ color: white; |
+ font-size: 56px; |
+ font-weight: normal; |
+ line-height: 1.5; |
+ margin: 0; |
+ padding: 115px 30px 56px 30px; |
+ white-space: nowrap; |
+ } |
+ ul { |
+ list-style-type: none; |
+ margin: 0; |
+ padding: 0; |
+ } |
+ li { |
+ margin: 0; |
+ padding: 0; |
+ } |
+ a { |
+ color: #212121; |
+ text-decoration: none; |
+ display: block; |
+ font-size: 16px; |
+ height: 48px; |
+ line-height: 48px; |
+ padding-left: 16px; |
+ transition: background-color 200ms ease-in-out; |
+ } |
+ a:hover { |
+ background-color: #EEEEEE; |
+ } |
+ </style> |
+</head> |
+<body> |
+ <h1>$sanitizedHeading</h1> |
+ <ul> |
+'''; |
+} |
+ |
+const String _trailer = ''' </ul> |
+</body> |
+</html> |
+'''; |
+ |
+Response listDirectory(String fileSystemPath, String dirPath) { |
+ StreamController<List<int>> controller = new StreamController<List<int>>(); |
+ Encoding encoding = new Utf8Codec(); |
+ HtmlEscape sanitizer = const HtmlEscape(); |
+ |
+ void add(String string) { |
+ controller.add(encoding.encode(string)); |
+ } |
+ |
+ String heading = path.relative(dirPath, from: fileSystemPath); |
+ if (heading == '.') heading = '/'; |
+ else heading = '/$heading/'; |
+ |
+ add(_getHeader(sanitizer.convert(heading))); |
+ new Directory(dirPath).list().listen((FileSystemEntity entity) { |
+ String name = path.relative(entity.path, from: dirPath); |
+ if (entity is Directory) name += '/'; |
+ String sanitizedName = sanitizer.convert(name); |
+ add(' <li><a href="$sanitizedName">$sanitizedName</a></li>\n'); |
+ }, onDone: () { |
+ add(_trailer); |
+ controller.close(); |
+ }); |
+ return new Response.ok(controller.stream, |
+ encoding: encoding, headers: {HttpHeaders.CONTENT_TYPE: 'text/html'}); |
+} |