webdev icon indicating copy to clipboard operation
webdev copied to clipboard

[DDS] Can't access debug web app on localhost but works on 127.0.0.1

Open dumbPy opened this issue 2 years ago • 2 comments

Steps to reproduce:

# create a web project
dart create -t web myapp
cd myapp
dart pub global activate webdev

start debug daemon (since that's what vscode seems to be doing)

webdev daemon web:8080

This starts the web app at 127.0.0.1:8080

If I change the browser address to localhost:8080 it crashes the daemon with below error

[{"event":"daemon.log","params":{"log":"[INFO] Received request for entrypoint at http://localhost:8082/main.dart.bootstrap.js"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Loading debug metadata..."}}]
[{"event":"daemon.log","params":{"log":"[INFO] Loaded debug metadata (sound null safety)"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Injected debugging metadata for entrypoint at http://localhost:8082/main.dart.bootstrap.js"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Initializing expression compiler for main.dart.bootstrap.js with sound null safety: true"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Updating dependencies..."}}]
Unhandled exception:
WebSocketException: Connection to 'http://127.0.0.1:62716/v5_zz3h5jg0=/ws#' was not upgraded to websocket
#0      _WebSocketImpl.connect (dart:_http/websocket_impl.dart:1011:41)
dart-lang/webdev#1      WebSocket.connect (dart:_http/websocket.dart:320:22)
dart-lang/webdev#2      new IOWebSocketChannel.connect (package:web_socket_channel/io.dart:80:28)
dart-lang/webdev#3      connect (package:web_socket_channel/src/_connect_io.dart:15:24)
dart-lang/webdev#4      new WebSocketChannel.connect (package:web_socket_channel/src/channel.dart:115:16)
dart-lang/webdev#5      _defaultWebSocketBuilder (package:dds/src/dds_impl.dart:51:27)
dart-lang/webdev#6      DartDevelopmentServiceImpl.startService (package:dds/src/dds_impl.dart:78:40)
dart-lang/webdev#7      DartDevelopmentService.startDartDevelopmentService (package:dds/dds.dart:97:19)
<asynchronous suspension>
dart-lang/webdev#8      DebugService.startDartDevelopmentService (package:dwds/src/services/debug_service.dart:154:12)
<asynchronous suspension>
dart-lang/webdev#9      DevHandler._createAppDebugServices (package:dwds/src/handlers/dev_handler.dart:466:7)
<asynchronous suspension>
dart-lang/webdev#10     DevHandler.loadAppServices (package:dwds/src/handlers/dev_handler.dart:241:21)
<asynchronous suspension>
dart-lang/webdev#11     Dwds.debugConnection (package:dwds/dart_web_debug_service.dart:61:30)
<asynchronous suspension>
dart-lang/webdev#12     AppDomain._handleAppConnections (package:webdev/src/daemon/app_domain.dart:62:29)
<asynchronous suspension>

ps, I am on mac. Not sure if this is related to dart-lang/webdev#233 and dart-lang/webdev#402 since they are able to access on localhost but not on 127.0.0.1 but it's opposite in my case.

Also here's my /etc/hosts

127.0.0.1	localhost
255.255.255.255	broadcasthost
::1             localhost

dumbPy avatar Feb 23 '23 17:02 dumbPy

Thanks @dumbPy for filing the issue!

I can repro this on my mac. This looks like a DDS issue (judging from the stack trace) - indeed, running webdev daemon web:8080 --disable-dds works as expected.

@bkonyi FYI

I will transfer this issue to the dart SDK repo.

annagrin avatar Feb 23 '23 19:02 annagrin

I'm able to get a crash, but I'm not seeing it in DDS:

[{"event":"daemon.connected","params":{"version":"0.4.2","pid":47303}}]
[{"event":"daemon.log","params":{"log":"[INFO] Connecting to the build daemon..."}}]
[{"event":"daemon.log","params":{"log":"[INFO] Generating build script..."}}]
[{"event":"daemon.log","params":{"log":"[INFO] Generating build script completed, took 401ms"}}]
[{"event":"daemon.log","params":{"log":"[INFO] "}}]
[{"event":"daemon.log","params":{"log":"[INFO] Precompiling build script......"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Precompiling build script... completed, took 7.7s"}}]
[{"event":"daemon.log","params":{"log":"[INFO] "}}]
[{"event":"daemon.log","params":{"log":"[INFO] Starting daemon..."}}]
[{"event":"daemon.log","params":{"log":"[INFO] Initializing inputs"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Building new asset graph..."}}]
[{"event":"daemon.log","params":{"log":"[INFO] Building new asset graph completed, took 1.0s\n"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Checking for unexpected pre-existing outputs...."}}]
[{"event":"daemon.log","params":{"log":"[INFO] Checking for unexpected pre-existing outputs. completed, took 1ms\n"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Initializing inputs"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Building new asset graph..."}}]
[{"event":"daemon.log","params":{"log":"[INFO] Building new asset graph completed, took 1.0s"}}]
[{"event":"daemon.log","params":{"log":"[INFO] "}}]
[{"event":"daemon.log","params":{"log":"[INFO] Checking for unexpected pre-existing outputs...."}}]
[{"event":"daemon.log","params":{"log":"[INFO] Checking for unexpected pre-existing outputs. completed, took 1ms"}}]
[{"event":"daemon.log","params":{"log":"[INFO] "}}]
[{"event":"daemon.log","params":{"log":"[INFO] Setting up file watchers..."}}]
[{"event":"daemon.log","params":{"log":"[INFO] Setting up file watchers completed, took 5ms"}}]
[{"event":"daemon.log","params":{"log":"[INFO] "}}]
[{"event":"daemon.log","params":{"log":"[INFO] Registering build targets..."}}]
[{"event":"daemon.log","params":{"log":"[INFO] Starting initial build..."}}]
[{"event":"daemon.log","params":{"log":"[INFO] Starting resource servers..."}}]
[{"event":"daemon.log","params":{"log":"[INFO] Serving DevTools at http://127.0.0.1:51570\n"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Serving `web` on http://127.0.0.1:8080\n"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Starting chrome with user data directory: /Users/bkonyi/myapp/.dart_tool/webdev/chrome_user_data"}}]
[{"event":"daemon.log","params":{"log":"[INFO] About to build [web]..."}}]
[{"event":"daemon.log","params":{"log":"[INFO] Running build..."}}]
[{"event":"daemon.log","params":{"log":"[INFO] 1.0s elapsed, 0/2 actions completed."}}]
[{"event":"daemon.log","params":{"log":"[INFO] 2.0s elapsed, 0/2 actions completed."}}]
[{"event":"daemon.log","params":{"log":"[INFO] 3.1s elapsed, 6/8 actions completed."}}]
[{"event":"daemon.log","params":{"log":"[INFO] 4.1s elapsed, 1291/1291 actions completed."}}]
[{"event":"daemon.log","params":{"log":"[INFO] Running build completed, took 4.1s\n"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Caching finalized dependency graph..."}}]
[{"event":"daemon.log","params":{"log":"[INFO] Caching finalized dependency graph completed, took 140ms\n"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Succeeded after 4.3s with 15 outputs (1727 actions)\n"}}]
[{"event":"daemon.log","params":{"log":"[INFO] ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Received request for entrypoint at http://127.0.0.1:8080/main.dart.bootstrap.js"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Loading debug metadata..."}}]
[{"event":"daemon.log","params":{"log":"[INFO] Loaded debug metadata (sound null safety)"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Injected debugging metadata for entrypoint at http://127.0.0.1:8080/main.dart.bootstrap.js"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Initializing expression compiler for main.dart.bootstrap.js with sound null safety: true"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Starting..."}}]
[{"event":"daemon.log","params":{"log":"[INFO] Debug service listening on ws://127.0.0.1:51622/YtZm9zPHIQM=/ws\n"}}]
[{"event":"app.start","params":{"appId":"pdj07uerloikPm38p+GKEg==","directory":"/Users/bkonyi/myapp","deviceId":"chrome","launchMode":"run"}}]
[{"event":"app.started","params":{"appId":"pdj07uerloikPm38p+GKEg=="}}]
[{"event":"app.debugPort","params":{"appId":"pdj07uerloikPm38p+GKEg==","port":44456,"wsUri":"ws://127.0.0.1:51622/YtZm9zPHIQM=/ws"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Updating dependencies..."}}]
[{"event":"daemon.log","params":{"log":"[INFO] Updated dependencies."}}]
[{"event":"daemon.log","params":{"log":"[INFO] Received request for entrypoint at http://127.0.0.1:8080/main.dart.bootstrap.js"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Loading debug metadata..."}}]
[{"event":"daemon.log","params":{"log":"[INFO] Loaded debug metadata (sound null safety)"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Injected debugging metadata for entrypoint at http://127.0.0.1:8080/main.dart.bootstrap.js"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Initializing expression compiler for main.dart.bootstrap.js with sound null safety: true"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Updating dependencies..."}}]
[{"event":"app.start","params":{"appId":"pdj07uerloikPm38p+GKEg==","directory":"/Users/bkonyi/myapp","deviceId":"chrome","launchMode":"run"}}]
[{"event":"app.started","params":{"appId":"pdj07uerloikPm38p+GKEg=="}}]
[{"event":"app.debugPort","params":{"appId":"pdj07uerloikPm38p+GKEg==","port":44456,"wsUri":"ws://127.0.0.1:51622/YtZm9zPHIQM=/ws"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Updated dependencies."}}]
[{"event":"daemon.log","params":{"log":"[INFO] Received request for entrypoint at http://localhost:8080/main.dart.bootstrap.js"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Loading debug metadata..."}}]
[{"event":"daemon.log","params":{"log":"[INFO] Loaded debug metadata (sound null safety)"}}]
[{"event":"daemon.log","params":{"log":"[INFO] Injected debugging metadata for entrypoint at http://localhost:8080/main.dart.bootstrap.js"}}]
Unhandled exception:
Instance of 'AppConnectionException'
#0      DevHandler._startLocalDebugService (package:dwds/src/handlers/dev_handler.dart:182:7)
<asynchronous suspension>
dart-lang/sdk#1      DevHandler.loadAppServices (package:dwds/src/handlers/dev_handler.dart:234:28)
<asynchronous suspension>
dart-lang/sdk#2      Dwds.debugConnection (package:dwds/dart_web_debug_service.dart:59:30)
<asynchronous suspension>
dart-lang/sdk#3      AppDomain._handleAppConnections (package:webdev/src/daemon/app_domain.dart:64:29)
<asynchronous suspension>

We could be seeing the WebSocketException coming from DDS if DWDS fails to accept the connection from DDS due to a crash / bad state. Given that this is a failure to upgrade to a websocket connection, I doubt this is a DDS error.

FYI @elliette @annagrin

bkonyi avatar Mar 30 '23 19:03 bkonyi