Skip to content

Commit c79af5a

Browse files
authored
Merge pull request #8 from r8/index-file
Add support for defaultDocument serving
2 parents 8b22a4a + bd32aae commit c79af5a

File tree

4 files changed

+41
-19
lines changed

4 files changed

+41
-19
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
## 0.0.1
22

33
* Initial release.
4+
5+
## 0.0.2
6+
7+
* Add support for defaultDocument serving.

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import 'package:shelf/shelf_io.dart' as io;
1616
import 'package:shelf_flutter_asset/shelf_flutter_asset.dart';
1717
1818
void main() {
19-
var assetHandler = createAssetHandler();
19+
var assetHandler = createAssetHandler(defaultDocument: 'index.html');
2020
2121
io.serve(assetHandler, 'localhost', 8080);
2222
}

example/lib/main.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import 'package:shelf_flutter_asset/shelf_flutter_asset.dart';
44
import 'package:webview_flutter/webview_flutter.dart';
55

66
void main() {
7-
var assetHandler = createAssetHandler();
7+
var assetHandler = createAssetHandler(defaultDocument: 'index.html');
88

99
io.serve(assetHandler, 'localhost', 8080);
1010

@@ -46,7 +46,7 @@ class _MyHomePageState extends State<MyHomePage> {
4646
_controller = WebViewController()
4747
..setJavaScriptMode(JavaScriptMode.unrestricted)
4848
..setBackgroundColor(const Color(0x00000000))
49-
..loadRequest(Uri.parse('http://localhost:8080/index.html'));
49+
..loadRequest(Uri.parse('http://localhost:8080'));
5050
}
5151

5252
@override

lib/shelf_flutter_asset.dart

+34-16
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,61 @@
1+
import 'dart:io';
2+
13
import 'package:flutter/services.dart';
2-
import 'package:shelf/shelf.dart';
34
import 'package:mime/mime.dart';
45
import 'package:path/path.dart' as p;
5-
import 'dart:io';
6+
import 'package:shelf/shelf.dart';
67

78
/// The default resolver for MIME types.
89
final _defaultMimeTypeResolver = MimeTypeResolver();
910

1011
/// Creates a Shelf [Handler] that serves files from Flutter assets.
1112
///
13+
/// If requested resource does not exist and [defaultDocument] is specified,
14+
/// request path is checked for a resource with that name.
15+
/// If it exists, it is served.
16+
///
1217
/// Specify a custom [contentTypeResolver] to customize automatic content type
1318
/// detection.
14-
Handler createAssetHandler({MimeTypeResolver? contentTypeResolver}) {
19+
Handler createAssetHandler(
20+
{String? defaultDocument, MimeTypeResolver? contentTypeResolver}) {
1521
final mimeResolver = contentTypeResolver ?? _defaultMimeTypeResolver;
1622

1723
return (Request request) async {
1824
final segments = ['assets', ...request.url.pathSegments];
1925

20-
final key = p.joinAll(segments);
26+
String key = p.joinAll(segments);
2127

22-
try {
23-
final body = await _loadResource(key);
28+
Uint8List? body;
2429

25-
final contentType = mimeResolver.lookup(key);
30+
body = await _loadResource(key);
2631

27-
final headers = {
28-
HttpHeaders.contentLengthHeader: '${body.length}',
29-
if (contentType != null) HttpHeaders.contentTypeHeader: contentType,
30-
};
32+
if (body == null && defaultDocument != null) {
33+
key = p.join(key, defaultDocument);
3134

32-
return Response.ok(body, headers: headers);
33-
} catch (_) {
35+
body = await _loadResource(key);
36+
}
37+
38+
if (body == null) {
3439
return Response.notFound('Not Found');
3540
}
41+
42+
final contentType = mimeResolver.lookup(key);
43+
44+
final headers = {
45+
HttpHeaders.contentLengthHeader: '${body.length}',
46+
if (contentType != null) HttpHeaders.contentTypeHeader: contentType,
47+
};
48+
49+
return Response.ok(body, headers: headers);
3650
};
3751
}
3852

39-
Future<Uint8List> _loadResource(String key) async {
40-
final byteData = await rootBundle.load(key);
53+
Future<Uint8List?> _loadResource(String key) async {
54+
try {
55+
final byteData = await rootBundle.load(key);
56+
57+
return byteData.buffer.asUint8List();
58+
} catch (_) {}
4159

42-
return byteData.buffer.asUint8List();
60+
return null;
4361
}

0 commit comments

Comments
 (0)