diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2c719a3..075f4b4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,7 @@
-## v0.3.0-nullsafety-dev
+## v0.3.0-nullsafety.0
+
+* **BREAKING** `SyncHttpClient` functions now require the `url` parameter to be
+  `Uri`. Previously, both `Uri` and `String` were supported.
 
 * The `SyncHttpClientResponse.contentLength` getter will return `-1` instead of
   `null` if content length not specified.
diff --git a/analysis_options.yaml b/analysis_options.yaml
new file mode 100644
index 0000000..796cd48
--- /dev/null
+++ b/analysis_options.yaml
@@ -0,0 +1,48 @@
+include: package:pedantic/analysis_options.yaml
+
+analyzer:
+  strong-mode:
+    implicit-casts: false
+
+linter:
+  rules:
+    - avoid_empty_else
+    - avoid_init_to_null
+    - avoid_null_checks_in_equality_operators
+    - avoid_unused_constructor_parameters
+    - await_only_futures
+    - camel_case_types
+    - cancel_subscriptions
+    - constant_identifier_names
+    - control_flow_in_finally
+    - directives_ordering
+    - empty_catches
+    - empty_constructor_bodies
+    - empty_statements
+    - hash_and_equals
+    - implementation_imports
+    - iterable_contains_unrelated_type
+    - library_names
+    - library_prefixes
+    - list_remove_unrelated_type
+    - non_constant_identifier_names
+    - overridden_fields
+    - package_api_docs
+    - package_names
+    - package_prefixed_library_names
+    - prefer_equal_for_default_values
+    - prefer_expression_function_bodies
+    - prefer_final_fields
+    - prefer_generic_function_type_aliases
+    - prefer_is_not_empty
+    - prefer_relative_imports
+    - slash_for_doc_comments
+    - test_types_in_equals
+    - throw_in_finally
+    - type_init_formals
+    - unnecessary_brace_in_string_interps
+    - unnecessary_const
+    - unnecessary_new
+    - unnecessary_parenthesis
+    - unrelated_type_equality_checks
+    - valid_regexps
diff --git a/lib/src/line_decoder.dart b/lib/src/line_decoder.dart
index 1785dfd..46cbb9f 100644
--- a/lib/src/line_decoder.dart
+++ b/lib/src/line_decoder.dart
@@ -7,11 +7,11 @@
 // '\n' character
 const int _lineTerminator = 10;
 
-typedef void _LineDecoderCallback(
+typedef _LineDecoderCallback = void Function(
     String line, int bytesRead, _LineDecoder decoder);
 
 class _LineDecoder {
-  BytesBuilder _unprocessedBytes = new BytesBuilder();
+  final BytesBuilder _unprocessedBytes = BytesBuilder();
 
   int expectedByteCount = -1;
 
@@ -21,7 +21,7 @@
 
   void add(List<int> chunk) {
     while (chunk.isNotEmpty) {
-      int splitIndex = -1;
+      var splitIndex = -1;
 
       if (expectedByteCount > 0) {
         splitIndex = expectedByteCount - _unprocessedBytes.length;
diff --git a/lib/src/sync_http.dart b/lib/src/sync_http.dart
index a2e4e7f..d6b437e 100644
--- a/lib/src/sync_http.dart
+++ b/lib/src/sync_http.dart
@@ -13,19 +13,19 @@
 abstract class SyncHttpClient {
   /// Send a GET request to the provided URL.
   static SyncHttpClientRequest getUrl(Uri uri) =>
-      new SyncHttpClientRequest._('GET', uri, false);
+      SyncHttpClientRequest._('GET', uri, false);
 
   /// Send a POST request to the provided URL.
-  static SyncHttpClientRequest postUrl(uri) =>
-      new SyncHttpClientRequest._('POST', uri, true);
+  static SyncHttpClientRequest postUrl(Uri uri) =>
+      SyncHttpClientRequest._('POST', uri, true);
 
   /// Send a DELETE request to the provided URL.
-  static SyncHttpClientRequest deleteUrl(uri) =>
-      new SyncHttpClientRequest._('DELETE', uri, false);
+  static SyncHttpClientRequest deleteUrl(Uri uri) =>
+      SyncHttpClientRequest._('DELETE', uri, false);
 
   /// Send a PUT request to the provided URL.
-  static SyncHttpClientRequest putUrl(uri) =>
-      new SyncHttpClientRequest._('PUT', uri, true);
+  static SyncHttpClientRequest putUrl(Uri uri) =>
+      SyncHttpClientRequest._('PUT', uri, true);
 }
 
 /// HTTP request for a synchronous client connection.
@@ -38,8 +38,7 @@
   HttpHeaders? _headers;
 
   /// The headers associated with the HTTP request.
-  HttpHeaders get headers =>
-      _headers ??= new _SyncHttpClientRequestHeaders(this);
+  HttpHeaders get headers => _headers ??= _SyncHttpClientRequestHeaders(this);
 
   /// The type of HTTP request being made.
   final String method;
@@ -58,9 +57,9 @@
   final RawSynchronousSocket _socket;
 
   SyncHttpClientRequest._(this.method, Uri uri, bool body)
-      : this.uri = uri,
-        this._body = body ? new BytesBuilder() : null,
-        this._socket = RawSynchronousSocket.connectSync(uri.host, uri.port);
+      : uri = uri,
+        _body = body ? BytesBuilder() : null,
+        _socket = RawSynchronousSocket.connectSync(uri.host, uri.port);
 
   /// Write content into the body of the HTTP request.
   void write(Object? obj) {
@@ -69,7 +68,7 @@
         _body!.add(encoding.encoder.convert(obj.toString()));
       }
     } else {
-      throw new StateError('write not allowed for method $method');
+      throw StateError('write not allowed for method $method');
     }
   }
 
@@ -78,9 +77,9 @@
 
   /// Send the HTTP request and get the response.
   SyncHttpClientResponse close() {
-    String queryString = "";
+    var queryString = '';
     if (uri.hasQuery) {
-      StringBuffer query = new StringBuffer();
+      var query = StringBuffer();
       query.write('?');
       uri.queryParameters.forEach((k, v) {
         query.write(Uri.encodeComponent(k));
@@ -90,9 +89,8 @@
       });
       queryString = query.toString().substring(0, query.length - 1);
     }
-    StringBuffer buffer = new StringBuffer();
-    buffer
-        .write('$method ${uri.path}${queryString} HTTP/$_protocolVersion\r\n');
+    var buffer = StringBuffer();
+    buffer.write('$method ${uri.path}$queryString HTTP/$_protocolVersion\r\n');
     headers.forEach((name, values) {
       values.forEach((value) {
         buffer.write('$name: $value\r\n');
@@ -100,10 +98,10 @@
     });
     buffer.write('\r\n');
     if (hasBody) {
-      buffer.write(new String.fromCharCodes(_body!.takeBytes()));
+      buffer.write(String.fromCharCodes(_body!.takeBytes()));
     }
     _socket.writeFromSync(buffer.toString().codeUnits);
-    return new SyncHttpClientResponse(_socket);
+    return SyncHttpClientResponse(_socket);
   }
 }
 
@@ -111,6 +109,7 @@
   final Map<String, List<String>> _headers = <String, List<String>>{};
 
   final SyncHttpClientRequest _request;
+  @override
   ContentType? contentType;
 
   _SyncHttpClientRequestHeaders(this._request);
@@ -157,7 +156,7 @@
       case HttpHeaders.expiresHeader:
       case HttpHeaders.ifModifiedSinceHeader:
       case HttpHeaders.hostHeader:
-        throw new UnsupportedError('Unsupported or immutable property: $name');
+        throw UnsupportedError('Unsupported or immutable property: $name');
       case HttpHeaders.contentTypeHeader:
         contentType = value as ContentType?;
         break;
@@ -181,7 +180,7 @@
       case HttpHeaders.expiresHeader:
       case HttpHeaders.ifModifiedSinceHeader:
       case HttpHeaders.hostHeader:
-        throw new UnsupportedError('Unsupported or immutable property: $name');
+        throw UnsupportedError('Unsupported or immutable property: $name');
       case HttpHeaders.contentTypeHeader:
         if (contentType == value) {
           contentType = null;
@@ -209,7 +208,7 @@
       case HttpHeaders.expiresHeader:
       case HttpHeaders.ifModifiedSinceHeader:
       case HttpHeaders.hostHeader:
-        throw new UnsupportedError('Unsupported or immutable property: $name');
+        throw UnsupportedError('Unsupported or immutable property: $name');
       case HttpHeaders.contentTypeHeader:
         contentType = null;
         break;
@@ -235,13 +234,13 @@
     } else if (val.length == 1) {
       return val[0];
     } else {
-      throw new HttpException('header $name has more than one value');
+      throw HttpException('header $name has more than one value');
     }
   }
 
   /// Iterates over all header key-value pairs and applies [f].
   @override
-  void forEach(void f(String name, List<String> values)) {
+  void forEach(void Function(String name, List<String> values) f) {
     var forEachFunc = (String name) {
       var values = this[name];
       if (values != null && values.isNotEmpty) {
@@ -261,43 +260,41 @@
   }
 
   @override
-  bool get chunkedTransferEncoding {
-    return value(HttpHeaders.transferEncodingHeader)?.toLowerCase() ==
-        'chunked';
-  }
+  bool get chunkedTransferEncoding =>
+      value(HttpHeaders.transferEncodingHeader)?.toLowerCase() == 'chunked';
 
   @override
-  void set chunkedTransferEncoding(bool _chunkedTransferEncoding) {
-    throw new UnsupportedError('chunked transfer is unsupported');
+  set chunkedTransferEncoding(bool _chunkedTransferEncoding) {
+    throw UnsupportedError('chunked transfer is unsupported');
   }
 
   @override
   int get contentLength => _request.contentLength;
 
   @override
-  void set contentLength(int _contentLength) {
-    throw new UnsupportedError('content length is automatically set');
+  set contentLength(int _contentLength) {
+    throw UnsupportedError('content length is automatically set');
   }
 
   @override
-  void set date(DateTime? _date) {
-    throw new UnsupportedError('date is unsupported');
+  set date(DateTime? _date) {
+    throw UnsupportedError('date is unsupported');
   }
 
   @override
   DateTime? get date => null;
 
   @override
-  void set expires(DateTime? _expires) {
-    throw new UnsupportedError('expires is unsupported');
+  set expires(DateTime? _expires) {
+    throw UnsupportedError('expires is unsupported');
   }
 
   @override
   DateTime? get expires => null;
 
   @override
-  void set host(String? _host) {
-    throw new UnsupportedError('host is automatically set');
+  set host(String? _host) {
+    throw UnsupportedError('host is automatically set');
   }
 
   @override
@@ -307,26 +304,26 @@
   DateTime? get ifModifiedSince => null;
 
   @override
-  void set ifModifiedSince(DateTime? _ifModifiedSince) {
-    throw new UnsupportedError('if modified since is unsupported');
+  set ifModifiedSince(DateTime? _ifModifiedSince) {
+    throw UnsupportedError('if modified since is unsupported');
   }
 
   @override
   void noFolding(String name) {
-    throw new UnsupportedError('no folding is unsupported');
+    throw UnsupportedError('no folding is unsupported');
   }
 
   @override
   bool get persistentConnection => false;
 
   @override
-  void set persistentConnection(bool _persistentConnection) {
-    throw new UnsupportedError('persistence connections are unsupported');
+  set persistentConnection(bool _persistentConnection) {
+    throw UnsupportedError('persistence connections are unsupported');
   }
 
   @override
-  void set port(int? _port) {
-    throw new UnsupportedError('port is automatically set');
+  set port(int? _port) {
+    throw UnsupportedError('port is automatically set');
   }
 
   @override
@@ -363,13 +360,13 @@
   factory SyncHttpClientResponse(RawSynchronousSocket socket) {
     int? statusCode;
     String? reasonPhrase;
-    StringBuffer body = new StringBuffer();
-    Map<String, List<String>> headers = {};
+    var body = StringBuffer();
+    var headers = <String, List<String>>{};
 
-    bool inHeader = false;
-    bool inBody = false;
-    int contentLength = 0;
-    int contentRead = 0;
+    var inHeader = false;
+    var inBody = false;
+    var contentLength = 0;
+    var contentRead = 0;
 
     void processLine(String line, int bytesRead, _LineDecoder decoder) {
       if (inBody) {
@@ -383,13 +380,12 @@
           }
           return;
         }
-        int separator = line.indexOf(':');
-        String name = line.substring(0, separator).toLowerCase().trim();
-        String value = line.substring(separator + 1).trim();
+        var separator = line.indexOf(':');
+        var name = line.substring(0, separator).toLowerCase().trim();
+        var value = line.substring(separator + 1).trim();
         if (name == HttpHeaders.transferEncodingHeader &&
             value.toLowerCase() != 'identity') {
-          throw new UnsupportedError(
-              'only identity transfer encoding is accepted');
+          throw UnsupportedError('only identity transfer encoding is accepted');
         }
         if (name == HttpHeaders.contentLengthHeader) {
           contentLength = int.parse(value);
@@ -404,11 +400,11 @@
         reasonPhrase = line.substring('HTTP/1.x xxx '.length);
         inHeader = true;
       } else {
-        throw new UnsupportedError('unsupported http response format');
+        throw UnsupportedError('unsupported http response format');
       }
     }
 
-    var lineDecoder = new _LineDecoder.withCallback(processLine);
+    var lineDecoder = _LineDecoder.withCallback(processLine);
 
     try {
       while (!inHeader ||
@@ -416,7 +412,7 @@
           ((contentRead + lineDecoder.bufferedBytes) < contentLength)) {
         var bytes = socket.readSync(1024);
 
-        if (bytes == null || bytes.length == 0) {
+        if (bytes == null || bytes.isEmpty) {
           break;
         }
         lineDecoder.add(bytes);
@@ -429,7 +425,7 @@
       }
     }
 
-    return new SyncHttpClientResponse._(headers,
+    return SyncHttpClientResponse._(headers,
         reasonPhrase: reasonPhrase,
         statusCode: statusCode,
         body: body.toString());
@@ -437,7 +433,7 @@
 
   SyncHttpClientResponse._(Map<String, List<String>> headers,
       {this.reasonPhrase, this.statusCode, this.body})
-      : this.headers = new _SyncHttpClientResponseHeaders(headers);
+      : headers = _SyncHttpClientResponseHeaders(headers);
 }
 
 class _SyncHttpClientResponseHeaders implements HttpHeaders {
@@ -450,23 +446,21 @@
 
   @override
   void add(String name, Object value, {bool preserveHeaderCase = false}) {
-    throw new UnsupportedError('Response headers are immutable');
+    throw UnsupportedError('Response headers are immutable');
   }
 
   @override
-  bool get chunkedTransferEncoding {
-    return value(HttpHeaders.transferEncodingHeader)?.toLowerCase() ==
-        'chunked';
-  }
+  bool get chunkedTransferEncoding =>
+      value(HttpHeaders.transferEncodingHeader)?.toLowerCase() == 'chunked';
 
   @override
-  void set chunkedTransferEncoding(bool _chunkedTransferEncoding) {
-    throw new UnsupportedError('Response headers are immutable');
+  set chunkedTransferEncoding(bool _chunkedTransferEncoding) {
+    throw UnsupportedError('Response headers are immutable');
   }
 
   @override
   int get contentLength {
-    String? val = value(HttpHeaders.contentLengthHeader);
+    var val = value(HttpHeaders.contentLengthHeader);
     if (val != null) {
       var parsed = int.tryParse(val);
       if (parsed != null) {
@@ -477,8 +471,8 @@
   }
 
   @override
-  void set contentLength(int _contentLength) {
-    throw new UnsupportedError('Response headers are immutable');
+  set contentLength(int _contentLength) {
+    throw UnsupportedError('Response headers are immutable');
   }
 
   @override
@@ -491,13 +485,13 @@
   }
 
   @override
-  void set contentType(ContentType? _contentType) {
-    throw new UnsupportedError('Response headers are immutable');
+  set contentType(ContentType? _contentType) {
+    throw UnsupportedError('Response headers are immutable');
   }
 
   @override
-  void set date(DateTime? _date) {
-    throw new UnsupportedError('Response headers are immutable');
+  set date(DateTime? _date) {
+    throw UnsupportedError('Response headers are immutable');
   }
 
   @override
@@ -510,8 +504,8 @@
   }
 
   @override
-  void set expires(DateTime? _expires) {
-    throw new UnsupportedError('Response headers are immutable');
+  set expires(DateTime? _expires) {
+    throw UnsupportedError('Response headers are immutable');
   }
 
   @override
@@ -524,11 +518,12 @@
   }
 
   @override
-  void forEach(void f(String name, List<String> values)) => _headers.forEach(f);
+  void forEach(void Function(String name, List<String> values) f) =>
+      _headers.forEach(f);
 
   @override
-  void set host(String? _host) {
-    throw new UnsupportedError('Response headers are immutable');
+  set host(String? _host) {
+    throw UnsupportedError('Response headers are immutable');
   }
 
   @override
@@ -550,26 +545,26 @@
   }
 
   @override
-  void set ifModifiedSince(DateTime? _ifModifiedSince) {
-    throw new UnsupportedError('Response headers are immutable');
+  set ifModifiedSince(DateTime? _ifModifiedSince) {
+    throw UnsupportedError('Response headers are immutable');
   }
 
   @override
   void noFolding(String name) {
-    throw new UnsupportedError('Response headers are immutable');
+    throw UnsupportedError('Response headers are immutable');
   }
 
   @override
   bool get persistentConnection => false;
 
   @override
-  void set persistentConnection(bool _persistentConnection) {
-    throw new UnsupportedError('Response headers are immutable');
+  set persistentConnection(bool _persistentConnection) {
+    throw UnsupportedError('Response headers are immutable');
   }
 
   @override
-  void set port(int? _port) {
-    throw new UnsupportedError('Response headers are immutable');
+  set port(int? _port) {
+    throw UnsupportedError('Response headers are immutable');
   }
 
   @override
@@ -583,17 +578,17 @@
 
   @override
   void remove(String name, Object value) {
-    throw new UnsupportedError('Response headers are immutable');
+    throw UnsupportedError('Response headers are immutable');
   }
 
   @override
   void removeAll(String name) {
-    throw new UnsupportedError('Response headers are immutable');
+    throw UnsupportedError('Response headers are immutable');
   }
 
   @override
   void set(String name, Object value, {bool preserveHeaderCase = false}) {
-    throw new UnsupportedError('Response headers are immutable');
+    throw UnsupportedError('Response headers are immutable');
   }
 
   @override
@@ -604,12 +599,12 @@
     } else if (val.length == 1) {
       return val[0];
     } else {
-      throw new HttpException('header $name has more than one value');
+      throw HttpException('header $name has more than one value');
     }
   }
 
   @override
   void clear() {
-    throw new UnsupportedError('Response headers are immutable');
+    throw UnsupportedError('Response headers are immutable');
   }
 }
diff --git a/pubspec.yaml b/pubspec.yaml
index a00b053..1ee819c 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,13 +1,11 @@
 name: sync_http
-version: 0.3.0-nullsafety-dev
+version: 0.3.0-nullsafety.0
 description: Synchronous HTTP client for Dart.
 homepage: https://github.com/dart-lang/sync_http
 
-# We are not ready to publish NNBD packages yet.
-publish_to: none
-
 environment:
   sdk: '>=2.12.0-0 <3.0.0'
 
 dev_dependencies:
+  pedantic: ^1.10.0-nullsafety.0
   test: ^1.16.0-nullsafety.8
diff --git a/test/http_basic_test.dart b/test/http_basic_test.dart
index 36a8cb9..eb63330 100644
--- a/test/http_basic_test.dart
+++ b/test/http_basic_test.dart
@@ -2,19 +2,19 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:async";
-import "dart:io";
-import "dart:isolate";
+import 'dart:async';
+import 'dart:io';
+import 'dart:isolate';
 
-import "package:sync_http/sync_http.dart";
-import "package:test/test.dart";
+import 'package:sync_http/sync_http.dart';
+import 'package:test/test.dart';
 
-typedef void ServerCallback(int? port);
+typedef ServerCallback = void Function(int? port);
 
 class TestServerMain {
-  TestServerMain() : _statusPort = new ReceivePort();
+  TestServerMain() : _statusPort = ReceivePort();
 
-  ReceivePort _statusPort; // Port for receiving messages from the server.
+  final ReceivePort _statusPort; // Port for receiving messages from the server.
   late SendPort _serverPort; // Port for sending messages to the server.
   late ServerCallback _startedCallback;
 
@@ -23,18 +23,19 @@
   }
 
   void start() {
-    ReceivePort receivePort = new ReceivePort();
+    var receivePort = ReceivePort();
     Isolate.spawn(startTestServer, receivePort.sendPort);
     receivePort.first.then((port) {
-      _serverPort = port!;
+      _serverPort = port as SendPort;
 
       // Send server start message to the server.
-      var command = new TestServerCommand.start();
+      var command = TestServerCommand.start();
       port.send([command, _statusPort.sendPort]);
     });
 
     // Handle status messages from the server.
-    _statusPort.listen((var status) {
+    _statusPort.listen((var value) {
+      var status = value as TestServerStatus;
       if (status.isStarted) {
         _startedCallback(status.port);
       }
@@ -43,7 +44,7 @@
 
   void close() {
     // Send server stop message to the server.
-    _serverPort.send([new TestServerCommand.stop(), _statusPort.sendPort]);
+    _serverPort.send([TestServerCommand.stop(), _statusPort.sendPort]);
     _statusPort.close();
   }
 }
@@ -55,12 +56,14 @@
 
 class TestServerCommand {
   TestServerCommand.start() : _command = TestServerCommandState.start;
+
   TestServerCommand.stop() : _command = TestServerCommandState.stop;
 
-  bool get isStart => (_command == TestServerCommandState.start);
-  bool get isStop => (_command == TestServerCommandState.stop);
+  bool get isStart => _command == TestServerCommandState.start;
 
-  TestServerCommandState _command;
+  bool get isStop => _command == TestServerCommandState.stop;
+
+  final TestServerCommandState _command;
 }
 
 enum TestServerStatusState {
@@ -71,21 +74,25 @@
 
 class TestServerStatus {
   TestServerStatus.started(this._port) : _state = TestServerStatusState.started;
+
   TestServerStatus.stopped() : _state = TestServerStatusState.stopped;
+
   TestServerStatus.error() : _state = TestServerStatusState.error;
 
-  bool get isStarted => (_state == TestServerStatusState.started);
-  bool get isStopped => (_state == TestServerStatusState.stopped);
-  bool get isError => (_state == TestServerStatusState.error);
+  bool get isStarted => _state == TestServerStatusState.started;
+
+  bool get isStopped => _state == TestServerStatusState.stopped;
+
+  bool get isError => _state == TestServerStatusState.error;
 
   int? get port => _port;
 
-  TestServerStatusState _state;
+  final TestServerStatusState _state;
   int? _port;
 }
 
 void startTestServer(SendPort replyTo) {
-  var server = new TestServer();
+  var server = TestServer();
   server.init();
   replyTo.send(server.dispatchSendPort);
 }
@@ -94,13 +101,13 @@
   // Echo the request content back to the response.
   void _echoHandler(HttpRequest request) {
     var response = request.response;
-    if (request.method != "POST") {
+    if (request.method != 'POST') {
       response.close();
       return;
     }
     response.contentLength = request.contentLength;
     request.listen((List<int> data) {
-      var string = new String.fromCharCodes(data);
+      var string = String.fromCharCodes(data);
       response.write(string);
       response.close();
     });
@@ -109,8 +116,8 @@
   // Echo the request content back to the response.
   void _zeroToTenHandler(HttpRequest request) {
     var response = request.response;
-    String msg = "01234567890";
-    if (request.method != "GET") {
+    var msg = '01234567890';
+    if (request.method != 'GET') {
       response.close();
       return;
     }
@@ -123,9 +130,9 @@
   void _notFoundHandler(HttpRequest request) {
     var response = request.response;
     response.statusCode = HttpStatus.notFound;
-    String msg = "Page not found";
+    var msg = 'Page not found';
     response.contentLength = msg.length;
-    response.headers.set("Content-Type", "text/html; charset=UTF-8");
+    response.headers.set('Content-Type', 'text/html; charset=UTF-8');
     response.write(msg);
     response.close();
   }
@@ -141,9 +148,9 @@
   // Check the "Host" header.
   void _hostHandler(HttpRequest request) {
     var response = request.response;
-    expect(1, equals(request.headers["Host"]!.length));
-    expect("dart.dev:1234", equals(request.headers["Host"]![0]));
-    expect("dart.dev", equals(request.headers.host));
+    expect(1, equals(request.headers['Host']!.length));
+    expect('dart.dev:1234', equals(request.headers['Host']![0]));
+    expect('dart.dev', equals(request.headers.host));
     expect(1234, equals(request.headers.port));
     response.statusCode = HttpStatus.ok;
     response.close();
@@ -151,9 +158,8 @@
 
   void _hugeHandler(HttpRequest request) {
     var response = request.response;
-    List<int> expected =
-        new List<int>.generate((1 << 20), (i) => (i + 1) % 256);
-    String msg = expected.toString();
+    var expected = List<int>.generate(1 << 20, (i) => (i + 1) % 256);
+    var msg = expected.toString();
     response.contentLength = msg.length;
     response.statusCode = HttpStatus.ok;
     response.write(msg);
@@ -162,36 +168,36 @@
 
   void init() {
     // Setup request handlers.
-    _requestHandlers = new Map();
-    _requestHandlers["/echo"] = _echoHandler;
-    _requestHandlers["/0123456789"] = _zeroToTenHandler;
-    _requestHandlers["/reasonformoving"] = _reasonForMovingHandler;
-    _requestHandlers["/host"] = _hostHandler;
-    _requestHandlers["/huge"] = _hugeHandler;
-    _dispatchPort = new ReceivePort();
+    _requestHandlers = {};
+    _requestHandlers['/echo'] = _echoHandler;
+    _requestHandlers['/0123456789'] = _zeroToTenHandler;
+    _requestHandlers['/reasonformoving'] = _reasonForMovingHandler;
+    _requestHandlers['/host'] = _hostHandler;
+    _requestHandlers['/huge'] = _hugeHandler;
+    _dispatchPort = ReceivePort();
     _dispatchPort.listen(dispatch);
   }
 
   SendPort get dispatchSendPort => _dispatchPort.sendPort;
 
-  dispatch(var message) async {
-    TestServerCommand command = message[0];
-    SendPort replyTo = message[1]!;
+  void dispatch(var message) async {
+    var command = (message as List)[0] as TestServerCommand;
+    var replyTo = message[1] as SendPort;
     if (command.isStart) {
       try {
-        var addr = (await InternetAddress.lookup("localhost"))[0];
-        HttpServer.bind(addr, 0).then((server) {
+        var addr = (await InternetAddress.lookup('localhost'))[0];
+        await HttpServer.bind(addr, 0).then((server) {
           _server = server;
           _server.listen(_requestReceivedHandler);
-          replyTo.send(new TestServerStatus.started(_server.port));
+          replyTo.send(TestServerStatus.started(_server.port));
         });
       } catch (e) {
-        replyTo.send(new TestServerStatus.error());
+        replyTo.send(TestServerStatus.error());
       }
     } else if (command.isStop) {
-      _server.close();
+      await _server.close();
       _dispatchPort.close();
-      replyTo.send(new TestServerStatus.stopped());
+      replyTo.send(TestServerStatus.stopped());
     }
   }
 
@@ -210,8 +216,8 @@
 }
 
 Future testStartStop() async {
-  Completer completer = new Completer();
-  TestServerMain testServerMain = new TestServerMain();
+  var completer = Completer();
+  var testServerMain = TestServerMain();
   testServerMain.setServerStartedHandler((int? port) {
     testServerMain.close();
     completer.complete();
@@ -221,15 +227,15 @@
 }
 
 Future testGET() async {
-  Completer completer = new Completer();
-  TestServerMain testServerMain = new TestServerMain();
+  var completer = Completer();
+  var testServerMain = TestServerMain();
   testServerMain.setServerStartedHandler((int? port) {
     var request =
-        SyncHttpClient.getUrl(new Uri.http("localhost:$port", "/0123456789"));
+        SyncHttpClient.getUrl(Uri.http('localhost:$port', '/0123456789'));
     var response = request.close();
     expect(HttpStatus.ok, equals(response.statusCode));
     expect(11, equals(response.contentLength));
-    expect("01234567890", equals(response.body));
+    expect('01234567890', equals(response.body));
     testServerMain.close();
     completer.complete();
   });
@@ -238,17 +244,17 @@
 }
 
 Future testPOST() async {
-  Completer completer = new Completer();
-  String data = "ABCDEFGHIJKLMONPQRSTUVWXYZ";
-  final int kMessageCount = 10;
+  var completer = Completer();
+  var data = 'ABCDEFGHIJKLMONPQRSTUVWXYZ';
+  final kMessageCount = 10;
 
-  TestServerMain testServerMain = new TestServerMain();
+  var testServerMain = TestServerMain();
 
   void runTest(int? port) {
-    int count = 0;
+    var count = 0;
     void sendRequest() {
       var request =
-          SyncHttpClient.postUrl(new Uri.http("localhost:$port", "/echo"));
+          SyncHttpClient.postUrl(Uri.http('localhost:$port', '/echo'));
       request.write(data);
       var response = request.close();
       expect(HttpStatus.ok, equals(response.statusCode));
@@ -271,14 +277,14 @@
 }
 
 Future test404() async {
-  Completer completer = new Completer();
-  TestServerMain testServerMain = new TestServerMain();
+  var completer = Completer();
+  var testServerMain = TestServerMain();
   testServerMain.setServerStartedHandler((int? port) {
-    var request = SyncHttpClient.getUrl(
-        new Uri.http("localhost:$port", "/thisisnotfound"));
+    var request =
+        SyncHttpClient.getUrl(Uri.http('localhost:$port', '/thisisnotfound'));
     var response = request.close();
     expect(HttpStatus.notFound, equals(response.statusCode));
-    expect("Page not found", equals(response.body));
+    expect('Page not found', equals(response.body));
     testServerMain.close();
     completer.complete();
   });
@@ -287,11 +293,11 @@
 }
 
 Future testReasonPhrase() async {
-  Completer completer = new Completer();
-  TestServerMain testServerMain = new TestServerMain();
+  var completer = Completer();
+  var testServerMain = TestServerMain();
   testServerMain.setServerStartedHandler((int? port) {
-    var request = SyncHttpClient.getUrl(
-        new Uri.http("localhost:$port", "/reasonformoving"));
+    var request =
+        SyncHttpClient.getUrl(Uri.http('localhost:$port', '/reasonformoving'));
     var response = request.close();
     expect(HttpStatus.movedPermanently, equals(response.statusCode));
     expect(
@@ -304,14 +310,12 @@
 }
 
 Future testHuge() async {
-  Completer completer = new Completer();
-  TestServerMain testServerMain = new TestServerMain();
+  var completer = Completer();
+  var testServerMain = TestServerMain();
   testServerMain.setServerStartedHandler((int? port) {
-    var request =
-        SyncHttpClient.getUrl(new Uri.http("localhost:$port", "/huge"));
+    var request = SyncHttpClient.getUrl(Uri.http('localhost:$port', '/huge'));
     var response = request.close();
-    String expected =
-        new List<int>.generate((1 << 20), (i) => (i + 1) % 256).toString();
+    var expected = List<int>.generate(1 << 20, (i) => (i + 1) % 256).toString();
     expect(HttpStatus.ok, equals(response.statusCode));
     expect(expected.length, equals(response.contentLength));
     expect(expected.toString(), equals(response.body));
@@ -323,22 +327,22 @@
 }
 
 void main() {
-  test("Simple server test", () async {
+  test('Simple server test', () async {
     await testStartStop();
   });
-  test("Sync HTTP GET test", () async {
+  test('Sync HTTP GET test', () async {
     await testGET();
   });
-  test("Sync HTTP POST test", () async {
+  test('Sync HTTP POST test', () async {
     await testPOST();
   });
-  test("Sync HTTP 404 test", () async {
+  test('Sync HTTP 404 test', () async {
     await test404();
   });
-  test("Sync HTTP moved test", () async {
+  test('Sync HTTP moved test', () async {
     await testReasonPhrase();
   });
-  test("Sync HTTP huge test", () async {
+  test('Sync HTTP huge test', () async {
     await testHuge();
   });
 }
