Skip to content

Commit 0f9610b

Browse files
author
Anna Gringauze
authored
Potential partial fix for broken socket exceptions (#1417)
* Handle http request serving errors * Update changelogs, versions, build * Addressed CR comments * Addressed CR comments
1 parent 8d32135 commit 0f9610b

File tree

13 files changed

+129
-42
lines changed

13 files changed

+129
-42
lines changed

dwds/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
## 11.4.0
22

33
- Fix duplicated scripts returned by `VmService.getScripts` API.
4+
- Handle and log http request serving errors.
45
- Encode extension url asynchronously.
56
- Use default constant port for debug service.
67
- If we fail binding to the port, fall back to previous strategy

dwds/lib/src/injected/client.js

Lines changed: 50 additions & 25 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dwds/lib/src/servers/extension_backend.dart

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,25 @@
44

55
// @dart = 2.9
66

7+
import 'dart:async';
78
import 'dart:io';
89

910
import 'package:async/async.dart';
11+
1012
import 'package:http_multi_server/http_multi_server.dart';
13+
import 'package:logging/logging.dart';
1114
import 'package:shelf/shelf.dart';
12-
import 'package:shelf/shelf_io.dart';
1315

1416
import '../../data/extension_request.dart';
1517
import '../handlers/socket_connections.dart';
18+
import '../utilities/shared.dart';
1619
import 'extension_debugger.dart';
1720

1821
const authenticationResponse = 'Dart Debug Authentication Success!\n\n'
1922
'You can close this tab and launch the Dart Debug Extension again.';
2023

24+
Logger _logger = Logger('ExtensiobBackend');
25+
2126
/// A backend for the Dart Debug Extension.
2227
///
2328
/// Sets up an SSE handler to communicate with the extension background.
@@ -50,7 +55,9 @@ class ExtensionBackend {
5055
return Response.notFound('');
5156
}).add(_socketHandler.handler);
5257
var server = await HttpMultiServer.bind(hostname, 0);
53-
serveRequests(server, cascade.handler);
58+
serveHttpRequests(server, cascade.handler, (e, s) {
59+
_logger.warning('Error serving requests', e, s);
60+
});
5461
return ExtensionBackend._(
5562
_socketHandler, server.address.host, server.port, server);
5663
}

dwds/lib/src/services/debug_service.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ import 'dart:math';
1111
import 'dart:typed_data';
1212

1313
import 'package:dds/dds.dart';
14+
import 'package:logging/logging.dart';
1415
import 'package:pedantic/pedantic.dart';
1516
import 'package:shelf/shelf.dart' as shelf;
1617
import 'package:shelf/shelf.dart' hide Response;
17-
import 'package:shelf/shelf_io.dart';
1818
import 'package:shelf_web_socket/shelf_web_socket.dart';
1919
import 'package:sse/server/sse_handler.dart';
2020
import 'package:vm_service/vm_service.dart';
@@ -29,6 +29,8 @@ import 'chrome_proxy_service.dart';
2929
bool _acceptNewConnections = true;
3030
int _clientsConnected = 0;
3131

32+
Logger _logger = Logger('DebugService');
33+
3234
void Function(WebSocketChannel, String) _createNewConnectionHandler(
3335
ChromeProxyService chromeProxyService,
3436
ServiceExtensionRegistry serviceExtensionRegistry, {
@@ -253,7 +255,9 @@ class DebugService {
253255
};
254256
}
255257
var server = await startHttpServer(hostname, port: 44456);
256-
serveRequests(server, handler);
258+
serveHttpRequests(server, handler, (e, s) {
259+
_logger.warning('Error serving requests', e, s);
260+
});
257261
return DebugService._(
258262
chromeProxyService,
259263
server.address.host,

dwds/lib/src/utilities/shared.dart

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,16 @@
44

55
// @dart = 2.9
66

7+
import 'dart:async';
78
import 'dart:io';
89

910
import 'package:http_multi_server/http_multi_server.dart';
11+
import 'package:shelf/shelf.dart';
12+
import 'package:shelf/shelf_io.dart';
13+
import 'package:stack_trace/stack_trace.dart';
1014
import 'package:vm_service/vm_service.dart';
11-
import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart';
15+
import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart'
16+
as wip;
1217

1318
import '../../dwds.dart' show ChromeDebugException;
1419

@@ -72,9 +77,20 @@ Future<HttpServer> startHttpServer(String hostname, {int port}) async {
7277
return httpServer;
7378
}
7479

75-
/// Throws an [ExceptionDetails] object if `exceptionDetails` is present on the
80+
/// Handles [requests] using [handler].
81+
///
82+
/// Captures all sync and async stack error traces and passes
83+
/// them to the [onError] handler.
84+
void serveHttpRequests(Stream<HttpRequest> requests, Handler handler,
85+
void Function(Object, StackTrace) onError) {
86+
return Chain.capture(() {
87+
serveRequests(requests, handler);
88+
}, onError: onError);
89+
}
90+
91+
/// Throws an [wip.ExceptionDetails] object if `exceptionDetails` is present on the
7692
/// result.
77-
void handleErrorIfPresent(WipResponse response,
93+
void handleErrorIfPresent(wip.WipResponse response,
7894
{String evalContents, Object additionalDetails}) {
7995
if (response == null) return;
8096
if (response.result.containsKey('exceptionDetails')) {

dwds/pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ dependencies:
3030
shelf_static: ^1.0.0
3131
shelf_web_socket: ^1.0.0
3232
source_maps: ^0.10.0
33+
stack_trace: ^1.10.0
3334
sse: ^4.1.0
3435
# We pin the version because we implement the interface.
3536
vm_service: 7.3.0

dwds/test/expression_compiler_service_test.dart

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ import 'dart:io';
1010

1111
import 'package:dwds/dwds.dart';
1212
import 'package:dwds/src/utilities/shared.dart';
13+
import 'package:logging/logging.dart';
1314
import 'package:path/path.dart' as p;
1415
import 'package:shelf/shelf.dart';
15-
import 'package:shelf/shelf_io.dart' as shelf_io;
1616
import 'package:test/test.dart';
1717

1818
import 'fixtures/logging.dart';
1919

20+
Logger _logger = Logger('ExpressionCompilerServiceTest');
21+
2022
@TestOn('vm')
2123
void main() async {
2224
group('expression compiler service with fake asset server', () {
@@ -65,8 +67,11 @@ void main() async {
6567
await service.initialize(moduleFormat: 'amd');
6668

6769
// setup asset server
68-
shelf_io.serveRequests(
69-
server, Cascade().add(service.handler).add(assetHandler).handler);
70+
serveHttpRequests(
71+
server, Cascade().add(service.handler).add(assetHandler).handler,
72+
(e, s) {
73+
_logger.warning('Error serving requests', e, s);
74+
});
7075

7176
// generate full dill
7277
File.fromUri(source)

dwds/test/fixtures/server.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ import 'package:build_daemon/data/build_status.dart' as daemon;
1010
import 'package:devtools_server/devtools_server.dart' as devtools_lancher;
1111
import 'package:dwds/data/build_result.dart';
1212
import 'package:dwds/dwds.dart';
13+
import 'package:dwds/src/utilities/shared.dart';
1314
import 'package:http_multi_server/http_multi_server.dart';
1415
import 'package:logging/logging.dart';
1516
import 'package:shelf/shelf.dart';
16-
import 'package:shelf/shelf_io.dart' as shelf_io;
1717
import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart';
1818

1919
Logger _logger = Logger('TestServer');
@@ -127,12 +127,14 @@ class TestServer {
127127
cascade = cascade.add(ddcService.handler);
128128
}
129129

130-
shelf_io.serveRequests(
130+
serveHttpRequests(
131131
server,
132132
pipeline
133133
.addMiddleware(_logRequests)
134134
.addMiddleware(dwds.middleware)
135-
.addHandler(cascade.handler));
135+
.addHandler(cascade.handler), (e, s) {
136+
_logger.warning('Error handling requests', e, s);
137+
});
136138

137139
return TestServer._(
138140
target,

webdev/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 2.7.7-dev
2+
3+
- Handle and log http request serving errors.
4+
15
## 2.7.6
26

37
- Update SDK constraint to `>=2.14.0 <3.0.0`

webdev/lib/src/serve/webdev_server.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,17 @@ import 'package:dwds/dwds.dart';
1414
import 'package:http/http.dart' as http;
1515
import 'package:http/io_client.dart';
1616
import 'package:http_multi_server/http_multi_server.dart';
17+
import 'package:logging/logging.dart';
1718
import 'package:shelf/shelf.dart';
18-
import 'package:shelf/shelf_io.dart' as shelf_io;
1919
import 'package:shelf_proxy/shelf_proxy.dart';
2020

2121
import '../command/configuration.dart';
22+
import '../util.dart';
2223
import 'chrome.dart';
2324
import 'handlers/favicon_handler.dart';
2425

26+
Logger _logger = Logger('WebDevServer');
27+
2528
class ServerOptions {
2629
final Configuration configuration;
2730
final int port;
@@ -179,7 +182,10 @@ class WebDevServer {
179182
server = await HttpMultiServer.bind(hostname, options.port);
180183
}
181184

182-
shelf_io.serveRequests(server, pipeline.addHandler(cascade.handler));
185+
serveHttpRequests(server, pipeline.addHandler(cascade.handler), (e, s) {
186+
_logger.warning('Error serving requests', e, s);
187+
});
188+
183189
return WebDevServer._(
184190
options.target,
185191
server,

webdev/lib/src/util.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,27 @@
44

55
// @dart = 2.9
66

7+
import 'dart:async';
78
import 'dart:io';
89

910
import 'package:path/path.dart' as p;
11+
import 'package:shelf/shelf.dart';
12+
import 'package:shelf/shelf_io.dart';
13+
import 'package:stack_trace/stack_trace.dart';
1014

1115
const appName = 'webdev';
1216

17+
/// Handles [requests] using [handler].
18+
///
19+
/// Captures all sync and async stack error traces and passes
20+
/// them to the [onError] handler.
21+
void serveHttpRequests(Stream<HttpRequest> requests, Handler handler,
22+
void Function(Object, StackTrace) onError) {
23+
return Chain.capture(() {
24+
serveRequests(requests, handler);
25+
}, onError: onError);
26+
}
27+
1328
/// The path to the root directory of the SDK.
1429
final String _sdkDir = (() {
1530
// The Dart executable is in "/path/to/sdk/bin/dart", so two levels up is

webdev/lib/src/version.dart

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

webdev/pubspec.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: webdev
22
# Every time this changes you need to run `pub run build_runner build`.
3-
version: 2.7.6
3+
version: 2.7.7-dev
44
# We should not depend on a dev SDK before publishing.
55
# publish_to: none
66
homepage: https://github.com/dart-lang/webdev
@@ -32,6 +32,7 @@ dependencies:
3232
shelf: ^1.0.0
3333
shelf_proxy: ^1.0.0
3434
shelf_static: ^1.0.0
35+
stack_trace: ^1.10.0
3536
sse: ^4.1.0
3637
vm_service: '>=3.0.0 <8.0.0'
3738
webkit_inspection_protocol: '>=0.4.0 <2.0.0'

0 commit comments

Comments
 (0)