migrate to null safety (dart-lang/http_multi_server#32)

diff --git a/pkgs/http_multi_server/.github/workflows/test-package.yml b/pkgs/http_multi_server/.github/workflows/test-package.yml
index 62d0d01..21a3c50 100644
--- a/pkgs/http_multi_server/.github/workflows/test-package.yml
+++ b/pkgs/http_multi_server/.github/workflows/test-package.yml
@@ -59,27 +59,3 @@
       - name: Run VM tests
         run: dart test --platform vm
         if: always() && steps.install.outcome == 'success'
-
-  # Run tests on a matrix consisting of two dimensions:
-  # 1. OS: ubuntu-latest, (macos-latest, windows-latest)
-  # 2. release: 2.1.1
-  test-legacy-sdk:
-    needs: analyze
-    runs-on: ${{ matrix.os }}
-    strategy:
-      fail-fast: false
-      matrix:
-        # Add macos-latest and/or windows-latest if relevant for this package.
-        os: [ubuntu-latest]
-        sdk: [2.1.1]
-    steps:
-      - uses: actions/checkout@v2
-      - uses: dart-lang/setup-dart@v0.3
-        with:
-          sdk: ${{ matrix.sdk }}
-      - id: install
-        name: Install dependencies
-        run: pub get
-      - name: Run VM tests
-        run: pub run test --platform vm
-        if: always() && steps.install.outcome == 'success'
diff --git a/pkgs/http_multi_server/CHANGELOG.md b/pkgs/http_multi_server/CHANGELOG.md
index 49d648b..5d90eaf 100644
--- a/pkgs/http_multi_server/CHANGELOG.md
+++ b/pkgs/http_multi_server/CHANGELOG.md
@@ -1,8 +1,10 @@
-## 2.2.1-dev
+## 3.0.0-dev
+
+* Migrate to null safety.
 
 ## 2.2.0
 
-- Preparation for [HttpHeaders change]. Update signature of `MultiHeaders.add()`
+* Preparation for [HttpHeaders change]. Update signature of `MultiHeaders.add()`
   and `MultiHeaders.set()` to match new signature of `HttpHeaders`. The
   parameter is not yet forwarded and will not behave as expected.
 
@@ -10,11 +12,10 @@
 
 ## 2.1.0
 
-- Add `HttpMultiServer.bind` static which centralizes logic around common local
+* Add `HttpMultiServer.bind` static which centralizes logic around common local
   serving scenarios - handling a more flexible 'localhost' and listening on
   'any' hostname.
-- Update SDK constraints to `>=2.1.0 <3.0.0`.
-
+* Update SDK constraints to `>=2.1.0 <3.0.0`.
 
 ## 2.0.6
 
diff --git a/pkgs/http_multi_server/lib/http_multi_server.dart b/pkgs/http_multi_server/lib/http_multi_server.dart
index 1ba0a2b..bd8a6a7 100644
--- a/pkgs/http_multi_server/lib/http_multi_server.dart
+++ b/pkgs/http_multi_server/lib/http_multi_server.dart
@@ -36,9 +36,10 @@
   /// If the wrapped servers have different default values, it's not defined
   /// which value is returned.
   @override
-  String get serverHeader => _servers.first.serverHeader;
+  String? get serverHeader => _servers.first.serverHeader;
+
   @override
-  set serverHeader(String value) {
+  set serverHeader(String? value) {
     for (var server in _servers) {
       server.serverHeader = value;
     }
@@ -52,9 +53,9 @@
   final HttpHeaders defaultResponseHeaders;
 
   @override
-  Duration get idleTimeout => _servers.first.idleTimeout;
+  Duration? get idleTimeout => _servers.first.idleTimeout;
   @override
-  set idleTimeout(Duration value) {
+  set idleTimeout(Duration? value) {
     for (var server in _servers) {
       server.idleTimeout = value;
     }
@@ -105,9 +106,7 @@
   ///
   /// See [HttpServer.bind].
   static Future<HttpServer> loopback(int port,
-      {int backlog, bool v6Only = false, bool shared = false}) {
-    backlog ??= 0;
-
+      {int backlog = 0, bool v6Only = false, bool shared = false}) {
     return _loopback(
         port,
         (address, port) => HttpServer.bind(address, port,
@@ -118,12 +117,10 @@
   ///
   /// See [HttpServer.bindSecure].
   static Future<HttpServer> loopbackSecure(int port, SecurityContext context,
-      {int backlog,
+      {int backlog = 0,
       bool v6Only = false,
       bool requestClientCertificate = false,
       bool shared = false}) {
-    backlog ??= 0;
-
     return _loopback(
         port,
         (address, port) => HttpServer.bindSecure(address, port, context,
@@ -162,9 +159,7 @@
   /// [HttpServer.bindSecure].
   static Future<HttpServer> _loopback(
       int port, Future<HttpServer> Function(InternetAddress, int port) bind,
-      [int remainingRetries]) async {
-    remainingRetries ??= 5;
-
+      [int remainingRetries = 5]) async {
     if (!await supportsIPv4) {
       return await bind(InternetAddress.loopbackIPv6, port);
     }
@@ -182,7 +177,7 @@
       // rethrow.
       await v4Server.close();
 
-      if (error.osError.errorCode != _addressInUseErrno) rethrow;
+      if (error.osError?.errorCode != _addressInUseErrno) rethrow;
       if (port != 0) rethrow;
       if (remainingRetries == 0) rethrow;
 
diff --git a/pkgs/http_multi_server/lib/src/multi_headers.dart b/pkgs/http_multi_server/lib/src/multi_headers.dart
index 25807b0..92bfd64 100644
--- a/pkgs/http_multi_server/lib/src/multi_headers.dart
+++ b/pkgs/http_multi_server/lib/src/multi_headers.dart
@@ -29,45 +29,45 @@
   }
 
   @override
-  ContentType get contentType => _headers.first.contentType;
+  ContentType? get contentType => _headers.first.contentType;
   @override
-  set contentType(ContentType value) {
+  set contentType(ContentType? value) {
     for (var headers in _headers) {
       headers.contentType = value;
     }
   }
 
   @override
-  DateTime get date => _headers.first.date;
+  DateTime? get date => _headers.first.date;
   @override
-  set date(DateTime value) {
+  set date(DateTime? value) {
     for (var headers in _headers) {
       headers.date = value;
     }
   }
 
   @override
-  DateTime get expires => _headers.first.expires;
+  DateTime? get expires => _headers.first.expires;
   @override
-  set expires(DateTime value) {
+  set expires(DateTime? value) {
     for (var headers in _headers) {
       headers.expires = value;
     }
   }
 
   @override
-  String get host => _headers.first.host;
+  String? get host => _headers.first.host;
   @override
-  set host(String value) {
+  set host(String? value) {
     for (var headers in _headers) {
       headers.host = value;
     }
   }
 
   @override
-  DateTime get ifModifiedSince => _headers.first.ifModifiedSince;
+  DateTime? get ifModifiedSince => _headers.first.ifModifiedSince;
   @override
-  set ifModifiedSince(DateTime value) {
+  set ifModifiedSince(DateTime? value) {
     for (var headers in _headers) {
       headers.ifModifiedSince = value;
     }
@@ -83,9 +83,9 @@
   }
 
   @override
-  int get port => _headers.first.port;
+  int? get port => _headers.first.port;
   @override
-  set port(int value) {
+  set port(int? value) {
     for (var headers in _headers) {
       headers.port = value;
     }
@@ -133,10 +133,10 @@
   }
 
   @override
-  String value(String name) => _headers.first.value(name);
+  String? value(String name) => _headers.first.value(name);
 
   @override
-  List<String> operator [](String name) => _headers.first[name];
+  List<String>? operator [](String name) => _headers.first[name];
 
   @override
   void clear() {
diff --git a/pkgs/http_multi_server/pubspec.yaml b/pkgs/http_multi_server/pubspec.yaml
index e93015c..3593fc1 100644
--- a/pkgs/http_multi_server/pubspec.yaml
+++ b/pkgs/http_multi_server/pubspec.yaml
@@ -1,17 +1,20 @@
 name: http_multi_server
-version: 2.2.1-dev
+version: 3.0.0-dev
 
 description: >-
   A dart:io HttpServer wrapper that handles requests from multiple servers.
 homepage: https://github.com/dart-lang/http_multi_server
 
 environment:
-  sdk: '>=2.1.1 <3.0.0'
+  sdk: '>=2.12.0-0 <3.0.0'
 
 dependencies:
-  async: '>=1.2.0 <3.0.0'
+  async: ^2.5.0
 
 dev_dependencies:
-  http: ^0.12.0
-  pedantic: ^1.8.0
-  test: ^1.5.2
+  http: ^0.13.0
+  pedantic: ^1.10.0
+  test: ^1.16.0
+
+dependency_overrides:
+  test: ^1.16.0
diff --git a/pkgs/http_multi_server/test/http_multi_server_test.dart b/pkgs/http_multi_server/test/http_multi_server_test.dart
index 2cbb984..749980e 100644
--- a/pkgs/http_multi_server/test/http_multi_server_test.dart
+++ b/pkgs/http_multi_server/test/http_multi_server_test.dart
@@ -13,9 +13,9 @@
 void main() {
   group('with multiple HttpServers', () {
     var multiServer;
-    HttpServer subServer1;
-    HttpServer subServer2;
-    HttpServer subServer3;
+    late HttpServer subServer1;
+    late HttpServer subServer2;
+    late HttpServer subServer3;
     setUp(() {
       return Future.wait([
         HttpServer.bind('localhost', 0).then((server) => subServer1 = server),