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) {