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();
});
}