Add analysis options with a number of lints and fix them (#19)

Disallow implicit casts
Require Uri parameters

Co-authored-by: Nate Bosch <nbosch@google.com>
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();
   });
 }