This commit is contained in:
regiostech 2016-05-02 19:11:25 -04:00
parent 3bff493d36
commit 74e01cf576
5 changed files with 62 additions and 11 deletions

View file

@ -20,10 +20,19 @@ import 'package:angel_static/angel_static.dart';
main() async { main() async {
Angel angel = new Angel(); Angel angel = new Angel();
angel.registerMiddleware("static", serveStatic(new Directory("build/web"))); angel.registerMiddleware("static", serveStatic());
angel.get('/virtual*', serveStatic(virtualRoot: '/virtual'));
angel.get("*", "static"); angel.get("*", "static");
await angel.startServer(InternetAddress.LOOPBACK_IP_V4, 8080); await angel.startServer(InternetAddress.LOOPBACK_IP_V4, 8080);
} }
``` ```
# Options
`serveStatic` accepts two named parameters.
- **sourceDirectory**: A `Directory` containing the files to be served. If left null, then Angel will serve either from `build` or
`build/web`, depending on your `ANGEL_ENV`.
- **indexFileNames**: A `List<String` of filenames that should be served as index pages. Default is `['index.html']`.
- **virtualRoot**: To serve index files, you need to specify the virtual path under which
angel_static is serving your files. If you are not serving static files at the site root,
please include this.

View file

@ -1,23 +1,11 @@
library angel_static; library angel_static;
import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'package:angel_framework/angel_framework.dart'; import 'package:angel_framework/angel_framework.dart';
import 'package:mime/mime.dart' show lookupMimeType; import 'package:mime/mime.dart' show lookupMimeType;
/// Serves files statically from a given directory. Future<bool> _sendFile(File file, ResponseContext res) async {
Middleware serveStatic([Directory sourceDirectory]) {
if (sourceDirectory == null) {
String dirPath = Platform.environment['ANGEL_ENV'] == 'production'
? './build/web'
: './web';
sourceDirectory = new Directory(dirPath);
}
return (RequestContext req, ResponseContext res) async {
String requested = req.path.replaceAll(new RegExp(r'^\/'), '');
File file = new File.fromUri(
sourceDirectory.absolute.uri.resolve(requested));
if (await file.exists()) {
res res
..willCloseItself = true ..willCloseItself = true
..header(HttpHeaders.CONTENT_TYPE, lookupMimeType(file.path)) ..header(HttpHeaders.CONTENT_TYPE, lookupMimeType(file.path))
@ -27,6 +15,42 @@ Middleware serveStatic([Directory sourceDirectory]) {
return false; return false;
} }
/// Serves files statically from a given directory.
RequestMiddleware serveStatic({
Directory sourceDirectory,
List<String> indexFileNames: const['index.html'],
String virtualRoot: '/'
}) {
if (sourceDirectory == null) {
String dirPath = Platform.environment['ANGEL_ENV'] == 'production'
? './build/web'
: './web';
sourceDirectory = new Directory(dirPath);
}
RegExp requestingIndex = new RegExp(r'^((\/)|(\\))*$');
return (RequestContext req, ResponseContext res) async {
String requested = req.path.replaceAll(new RegExp(r'^\/'), '');
File file = new File.fromUri(
sourceDirectory.absolute.uri.resolve(requested));
if (await file.exists()) {
return await _sendFile(file, res);
}
// Try to resolve index
String relative = req.path.replaceFirst(virtualRoot, "")
.replaceAll(new RegExp(r'^\/+'), "");
if (requestingIndex.hasMatch(relative) || relative.isEmpty) {
for (String indexFileName in indexFileNames) {
file =
new File.fromUri(sourceDirectory.absolute.uri.resolve(indexFileName));
if (await file.exists()) {
return await _sendFile(file, res);
}
}
}
return true; return true;
}; };
} }

View file

@ -2,7 +2,7 @@ name: angel_static
description: Static server middleware for Angel. description: Static server middleware for Angel.
homepage: https://github.com/angel-dart/angel_static homepage: https://github.com/angel-dart/angel_static
author: thosakwe <thosakwe@gmail.com> author: thosakwe <thosakwe@gmail.com>
version: 1.0.0-beta.2 version: 1.0.0
dependencies: dependencies:
angel_framework: ">=0.0.0-dev < 0.1.0" angel_framework: ">=0.0.0-dev < 0.1.0"
mime: ">= 0.9.3 < 0.10.0" mime: ">= 0.9.3 < 0.10.0"

View file

@ -12,7 +12,14 @@ main() {
setUp(() async { setUp(() async {
angel = new Angel(); angel = new Angel();
angel.registerMiddleware("static", serveStatic(new Directory("test"))); angel.registerMiddleware(
"static", serveStatic(sourceDirectory: new Directory("test"),
indexFileNames: ['index.php', 'index.txt']));
angel.get('/virtual/*', "Fallback",
middleware: [serveStatic(sourceDirectory: new Directory("test"),
virtualRoot: '/virtual',
indexFileNames: ['index.txt'])
]);
angel.get("*", "Fallback", middleware: ["static"]); angel.get("*", "Fallback", middleware: ["static"]);
await angel.startServer(InternetAddress.LOOPBACK_IP_V4, 0); await angel.startServer(InternetAddress.LOOPBACK_IP_V4, 0);
@ -33,5 +40,15 @@ main() {
var response = await client.get("$url/nonexist.ent"); var response = await client.get("$url/nonexist.ent");
expect(response.body, equals('"Fallback"')); expect(response.body, equals('"Fallback"'));
}); });
test('can match index files', () async {
var response = await client.get(url);
expect(response.body, equals("index!"));
});
test('virtualRoots can match index', () async {
var response = await client.get("$url/virtual");
expect(response.body, equals("index!"));
});
}); });
} }

1
test/index.txt Normal file
View file

@ -0,0 +1 @@
index!