Correctly support HEAD (#54)
diff --git a/.github/workflows/test-package.yml b/.github/workflows/test-package.yml
index d927941..c964e5d 100644
--- a/.github/workflows/test-package.yml
+++ b/.github/workflows/test-package.yml
@@ -23,7 +23,7 @@
sdk: [dev]
steps:
- uses: actions/checkout@v2
- - uses: dart-lang/setup-dart@v0.3
+ - uses: dart-lang/setup-dart@v1.0
with:
sdk: ${{ matrix.sdk }}
- id: install
@@ -49,7 +49,7 @@
sdk: [2.12.0, dev]
steps:
- uses: actions/checkout@v2
- - uses: dart-lang/setup-dart@v0.3
+ - uses: dart-lang/setup-dart@v1.0
with:
sdk: ${{ matrix.sdk }}
- id: install
diff --git a/CHANGELOG.md b/CHANGELOG.md
index cbefda0..60be005 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.1.0-dev
+
+* Correctly handle `HEAD` requests.
+
## 1.0.0
* Migrate to null safety.
diff --git a/lib/src/static_handler.dart b/lib/src/static_handler.dart
index 23ac17f..11220aa 100644
--- a/lib/src/static_handler.dart
+++ b/lib/src/static_handler.dart
@@ -196,5 +196,8 @@
final contentType = await getContentType();
if (contentType != null) headers[HttpHeaders.contentTypeHeader] = contentType;
- return Response.ok(file.openRead(), headers: headers);
+ return Response.ok(
+ request.method == 'HEAD' ? null : file.openRead(),
+ headers: headers,
+ );
}
diff --git a/pubspec.yaml b/pubspec.yaml
index 78e3cf7..c9419c9 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
name: shelf_static
-version: 1.0.0
+version: 1.1.0-dev
description: Static file server support for shelf
repository: https://github.com/dart-lang/shelf_static
@@ -11,7 +11,8 @@
http_parser: ^4.0.0
mime: ^1.0.0
path: ^1.8.0
- shelf: ^1.0.0
+ # shelf version that allows correctly setting content-length w/ HEAD
+ shelf: ^1.1.2
dev_dependencies:
args: ^2.0.0
diff --git a/test/basic_file_test.dart b/test/basic_file_test.dart
index ab89efc..a1425da 100644
--- a/test/basic_file_test.dart
+++ b/test/basic_file_test.dart
@@ -48,6 +48,15 @@
expect(response.readAsString(), completion('root txt'));
});
+ test('HEAD', () async {
+ final handler = createStaticHandler(d.sandbox);
+
+ final response = await makeRequest(handler, '/root.txt', method: 'HEAD');
+ expect(response.statusCode, HttpStatus.ok);
+ expect(response.contentLength, 8);
+ expect(await response.readAsString(), isEmpty);
+ });
+
test('access root file with space', () async {
final handler = createStaticHandler(d.sandbox);
diff --git a/test/test_util.dart b/test/test_util.dart
index e496394..5c628d8 100644
--- a/test/test_util.dart
+++ b/test/test_util.dart
@@ -10,14 +10,23 @@
final p.Context _ctx = p.url;
/// Makes a simple GET request to [handler] and returns the result.
-Future<Response> makeRequest(Handler handler, String path,
- {String? handlerPath, Map<String, String>? headers}) {
+Future<Response> makeRequest(
+ Handler handler,
+ String path, {
+ String? handlerPath,
+ Map<String, String>? headers,
+ String method = 'GET',
+}) async {
final rootedHandler = _rootHandler(handlerPath, handler);
- return Future.sync(() => rootedHandler(_fromPath(path, headers)));
+ return rootedHandler(_fromPath(path, headers, method: method));
}
-Request _fromPath(String path, Map<String, String>? headers) =>
- Request('GET', Uri.parse('http://localhost$path'), headers: headers);
+Request _fromPath(
+ String path,
+ Map<String, String>? headers, {
+ required String method,
+}) =>
+ Request(method, Uri.parse('http://localhost$path'), headers: headers);
Handler _rootHandler(String? path, Handler handler) {
if (path == null || path.isEmpty) {