Chromium Code Reviews| Index: lib/src/dir_handler.dart |
| diff --git a/lib/src/dir_handler.dart b/lib/src/dir_handler.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..028f38e8f5e99a66e46f03b0e4d80cdff435504b |
| --- /dev/null |
| +++ b/lib/src/dir_handler.dart |
| @@ -0,0 +1,34 @@ |
| +// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
|
jakemac
2016/07/21 21:45:57
nit, 2016
nweiz
2016/07/21 23:07:24
Done.
|
| +// 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_packages_handler.dir_handler; |
| + |
| +import 'package:path/path.dart' as p; |
| +import 'package:shelf/shelf.dart'; |
| + |
| +/// A utility handler that mounts a sub-handler beneath a directory name, |
| +/// wherever that directory name appears in a URL. |
| +/// |
| +/// In practice, this is used to mount a [PackagesHandler] underneath |
| +/// `packages/` directories. |
| +class DirHandler { |
| + /// The directory name to look for. |
| + final String _name; |
| + |
| + /// The inner handler to mount. |
| + final Handler _inner; |
| + |
| + DirHandler(this._name, this._inner); |
| + |
| + /// The callback for handling a single request. |
| + call(Request request) { |
| + var segments = request.url.pathSegments; |
| + for (var i = 0; i < segments.length; i++) { |
| + if (segments[i] != _name) continue; |
| + return _inner(request.change(path: p.url.joinAll(segments.take(i + 1)))); |
| + } |
| + |
| + return new Response.notFound("Not found."); |
| + } |
| +} |