| 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'});
|
| +}
|
|
|