Skip to content

Commit f440b48

Browse files
authored
Fix issue where socket profile data was being displayed as web socket connections (#8061)
* Fix issue where socket profile data was being displayed as web socket connections Fixes #3033
1 parent 953b92d commit f440b48

File tree

10 files changed

+68
-65
lines changed

10 files changed

+68
-65
lines changed

packages/devtools_app/lib/src/screens/network/network_controller.dart

+16-16
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ class NetworkController extends DisposableController
146146
timelineMicrosOffset: timelineMicrosOffset,
147147
);
148148

149-
// If we have updated data for the selected web socket, we need to update
149+
// If we have updated data for the selected socket, we need to update
150150
// the value.
151151
final currentSelectedRequestId = selectedRequest.value?.id;
152152
if (currentSelectedRequestId != null) {
@@ -362,7 +362,7 @@ class NetworkController extends DisposableController
362362
}
363363
}
364364

365-
/// Class for managing the set of all current websocket requests, and
365+
/// Class for managing the set of all current sockets, and
366366
/// http profile requests.
367367
class CurrentNetworkRequests extends ValueNotifier<List<NetworkRequest>> {
368368
CurrentNetworkRequests() : super([]);
@@ -384,7 +384,7 @@ class CurrentNetworkRequests extends ValueNotifier<List<NetworkRequest>> {
384384
required int timelineMicrosOffset,
385385
}) {
386386
_updateOrAddRequests(requests);
387-
_updateWebSocketRequests(sockets, timelineMicrosOffset);
387+
_updateSocketProfiles(sockets, timelineMicrosOffset);
388388
notifyListeners();
389389
}
390390

@@ -415,29 +415,29 @@ class CurrentNetworkRequests extends ValueNotifier<List<NetworkRequest>> {
415415
}
416416
}
417417

418-
void _updateWebSocketRequests(
418+
void _updateSocketProfiles(
419419
List<SocketStatistic> sockets,
420420
int timelineMicrosOffset,
421421
) {
422-
for (final socket in sockets) {
423-
final webSocket = WebSocket(socket, timelineMicrosOffset);
422+
for (final socketStats in sockets) {
423+
final socket = Socket(socketStats, timelineMicrosOffset);
424424

425-
if (_requestsById.containsKey(webSocket.id)) {
426-
final existingRequest = _requestsById[webSocket.id];
427-
if (existingRequest is WebSocket) {
428-
existingRequest.update(webSocket);
425+
if (_requestsById.containsKey(socket.id)) {
426+
final existingRequest = _requestsById[socket.id];
427+
if (existingRequest is Socket) {
428+
existingRequest.update(socket);
429429
} else {
430-
// If we override an entry that is not a Websocket then that means
430+
// If we override an entry that is not a Socket then that means
431431
// the ids of the requestMapping entries may collide with other types
432432
// of requests.
433-
assert(existingRequest is WebSocket);
433+
assert(existingRequest is Socket);
434434
}
435435
} else {
436-
value.add(webSocket);
437-
// The new [sockets] may contain web sockets with the same ids as ones we
438-
// already have, so we remove the current web sockets and replace them with
436+
value.add(socket);
437+
// The new [sockets] may contain sockets with the same ids as ones we
438+
// already have, so we remove the current sockets and replace them with
439439
// updated data.
440-
_requestsById[webSocket.id] = webSocket;
440+
_requestsById[socket.id] = socket;
441441
}
442442
}
443443
}

packages/devtools_app/lib/src/screens/network/network_model.dart

+9-13
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ abstract class NetworkRequest with ChangeNotifier, SearchableDataMixin {
8282
);
8383
}
8484

85-
class WebSocket extends NetworkRequest {
86-
WebSocket(this._socket, this._timelineMicrosBase);
85+
class Socket extends NetworkRequest {
86+
Socket(this._socket, this._timelineMicrosBase);
8787

8888
int _timelineMicrosBase;
8989

@@ -93,7 +93,7 @@ class WebSocket extends NetworkRequest {
9393
return _timelineMicrosBase + micros;
9494
}
9595

96-
void update(WebSocket other) {
96+
void update(Socket other) {
9797
_socket = other._socket;
9898
_timelineMicrosBase = other._timelineMicrosBase;
9999
notifyListeners();
@@ -145,15 +145,15 @@ class WebSocket extends NetworkRequest {
145145
}
146146

147147
@override
148-
String get contentType => 'websocket';
148+
String get contentType => 'socket';
149149

150150
@override
151-
String get type => 'ws';
151+
String get type => _socket.socketType;
152152

153153
String get socketType => _socket.socketType;
154154

155155
@override
156-
String get uri => _socket.address;
156+
String get uri => '${_socket.address}:$port';
157157

158158
@override
159159
int get port => _socket.port;
@@ -166,21 +166,17 @@ class WebSocket extends NetworkRequest {
166166

167167
int get writeBytes => _socket.writeBytes;
168168

169-
// TODO(kenz): is this always GET? Chrome DevTools shows GET in the response
170-
// headers for web socket traffic.
171169
@override
172-
String get method => 'GET';
170+
String get method => 'SOCKET';
173171

174-
// TODO(kenz): is this always 101? Chrome DevTools lists "101" for WS status
175-
// codes with a tooltip of "101 Web Socket Protocol Handshake"
176172
@override
177-
String get status => '101';
173+
String get status => _socket.endTime == null ? 'Open' : 'Closed';
178174

179175
@override
180176
bool get inProgress => false;
181177

182178
@override
183-
bool operator ==(Object other) => other is WebSocket && id == other.id;
179+
bool operator ==(Object other) => other is Socket && id == other.id;
184180

185181
@override
186182
int get hashCode => id.hashCode;

packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart

+5-5
Original file line numberDiff line numberDiff line change
@@ -639,7 +639,7 @@ class NetworkRequestOverviewView extends StatelessWidget {
639639
padding: const EdgeInsets.all(defaultSpacing),
640640
children: [
641641
..._buildGeneralRows(context),
642-
if (data is WebSocket) ..._buildSocketOverviewRows(context),
642+
if (data is Socket) ..._buildSocketOverviewRows(context),
643643
const PaddedDivider(
644644
padding: EdgeInsets.only(bottom: denseRowSpacing),
645645
),
@@ -699,7 +699,7 @@ class NetworkRequestOverviewView extends StatelessWidget {
699699
_buildRow(
700700
context: context,
701701
title: 'Timing',
702-
child: data is WebSocket
702+
child: data is Socket
703703
? _buildSocketTimeGraph(context)
704704
: _buildHttpTimeGraph(),
705705
),
@@ -710,7 +710,7 @@ class NetworkRequestOverviewView extends StatelessWidget {
710710
child: _valueText(data.durationDisplay),
711711
),
712712
const SizedBox(height: defaultSpacing),
713-
...data is WebSocket
713+
...data is Socket
714714
? _buildSocketTimingRows(context)
715715
: _buildHttpTimingRows(context),
716716
const SizedBox(height: defaultSpacing),
@@ -832,7 +832,7 @@ class NetworkRequestOverviewView extends StatelessWidget {
832832
}
833833

834834
List<Widget> _buildSocketOverviewRows(BuildContext context) {
835-
final socket = data as WebSocket;
835+
final socket = data as Socket;
836836
return [
837837
_buildRow(
838838
context: context,
@@ -870,7 +870,7 @@ class NetworkRequestOverviewView extends StatelessWidget {
870870
}
871871

872872
List<Widget> _buildSocketTimingRows(BuildContext context) {
873-
final data = this.data as WebSocket;
873+
final data = this.data as Socket;
874874
final lastReadTimestamp = data.lastReadTimestamp;
875875
final lastWriteTimestamp = data.lastWriteTimestamp;
876876
return [

packages/devtools_app/lib/src/screens/network/network_screen.dart

+4-4
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ class NetworkRequestsTable extends StatelessWidget {
305305
});
306306

307307
static final methodColumn = MethodColumn();
308-
static final addressColumn = UriColumn();
308+
static final addressColumn = AddressColumn();
309309
static final statusColumn = StatusColumn();
310310
static final typeColumn = TypeColumn();
311311
static final durationColumn = DurationColumn();
@@ -353,11 +353,11 @@ class NetworkRequestsTable extends StatelessWidget {
353353
}
354354
}
355355

356-
class UriColumn extends ColumnData<NetworkRequest>
356+
class AddressColumn extends ColumnData<NetworkRequest>
357357
implements ColumnRenderer<NetworkRequest> {
358-
UriColumn()
358+
AddressColumn()
359359
: super.wide(
360-
'Uri',
360+
'Address',
361361
minWidthPx: scaleByFontFactor(isEmbedded() ? 100 : 150.0),
362362
showTooltip: true,
363363
);

packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ TODO: Remove this section if there are not any general updates.
2626

2727
## Memory updates
2828

29-
* Enable offline analysis of snapshots, historical data analysis and save/load.
30-
- [#7843](https://github.com/flutter/devtools/pull/7843)
29+
* Enable offline analysis of snapshots, historical data analysis and save/load. - [#7843](https://github.com/flutter/devtools/pull/7843)
3130

3231
![Memory offline data](images/memory-save-load.png "Memory offline data")
3332

@@ -37,8 +36,9 @@ TODO: Remove this section if there are not any general updates.
3736

3837
## Network profiler updates
3938

40-
TODO: Remove this section if there are not any general updates.
39+
* Fixed issue where socket statistics were being reported as web sockets. - [#8061](https://github.com/flutter/devtools/pull/8061)
4140

41+
![Network profiler correctly displaying socket statistics](images/socket-profiling.png "Network profiler correctly displaying socket statistics")
4242
## Logging updates
4343

4444
TODO: Remove this section if there are not any general updates.
Loading

packages/devtools_app/test/network/network_controller_test.dart

+16-9
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,10 @@ void main() {
132132
expect(profile.length, numRequests);
133133

134134
expect(controller.matchesForSearch('jsonplaceholder').length, equals(5));
135-
expect(controller.matchesForSearch('IPv6').length, equals(2));
135+
expect(
136+
controller.matchesForSearch('2606:4700:3037::ac43').length,
137+
equals(2),
138+
);
136139
expect(controller.matchesForSearch('').length, equals(0));
137140

138141
// Search with incorrect case.
@@ -155,7 +158,7 @@ void main() {
155158
expect(matches.length, equals(5));
156159
verifyIsSearchMatch(profile, matches);
157160

158-
controller.search = 'IPv6';
161+
controller.search = '2606:4700:3037::ac43';
159162
matches = controller.searchMatches.value;
160163
expect(matches.length, equals(2));
161164
verifyIsSearchMatch(profile, matches);
@@ -184,7 +187,11 @@ void main() {
184187

185188
controller.setActiveFilter(query: 'method:get');
186189
expect(profile, hasLength(numRequests));
187-
expect(controller.filteredData.value, hasLength(6));
190+
expect(controller.filteredData.value, hasLength(4));
191+
192+
controller.setActiveFilter(query: 'method:socket');
193+
expect(profile, hasLength(numRequests));
194+
expect(controller.filteredData.value, hasLength(2));
188195

189196
controller.setActiveFilter(query: 'm:put');
190197
expect(profile, hasLength(numRequests));
@@ -200,7 +207,7 @@ void main() {
200207

201208
controller.setActiveFilter(query: 's:101');
202209
expect(profile, hasLength(numRequests));
203-
expect(controller.filteredData.value, hasLength(3));
210+
expect(controller.filteredData.value, hasLength(1));
204211

205212
controller.setActiveFilter(query: '-s:Error');
206213
expect(profile, hasLength(numRequests));
@@ -210,11 +217,11 @@ void main() {
210217
expect(profile, hasLength(numRequests));
211218
expect(controller.filteredData.value, hasLength(4));
212219

213-
controller.setActiveFilter(query: 't:ws');
220+
controller.setActiveFilter(query: 't:tcp');
214221
expect(profile, hasLength(numRequests));
215222
expect(controller.filteredData.value, hasLength(2));
216223

217-
controller.setActiveFilter(query: '-t:ws');
224+
controller.setActiveFilter(query: '-t:tcp');
218225
expect(profile, hasLength(numRequests));
219226
expect(controller.filteredData.value, hasLength(7));
220227

@@ -234,17 +241,17 @@ void main() {
234241
expect(profile, hasLength(numRequests));
235242
expect(controller.filteredData.value, hasLength(numRequests));
236243

237-
controller.setActiveFilter(query: '-t:ws,http');
244+
controller.setActiveFilter(query: '-t:tcp,http');
238245
expect(profile, hasLength(numRequests));
239246
expect(controller.filteredData.value, hasLength(4));
240247

241-
controller.setActiveFilter(query: '-t:ws,http method:put');
248+
controller.setActiveFilter(query: '-t:tcp,http method:put');
242249
expect(profile, hasLength(numRequests));
243250
expect(controller.filteredData.value, hasLength(1));
244251

245252
controller.setActiveFilter(query: '-status:error method:get');
246253
expect(profile, hasLength(numRequests));
247-
expect(controller.filteredData.value, hasLength(5));
254+
expect(controller.filteredData.value, hasLength(3));
248255

249256
controller.setActiveFilter(query: '-status:error method:get t:http');
250257
expect(profile, hasLength(numRequests));

packages/devtools_app/test/network/network_profiler_test.dart

+8-8
Original file line numberDiff line numberDiff line change
@@ -460,17 +460,17 @@ void main() {
460460
// Verify general information.
461461
expect(find.text('Request uri: '), findsOneWidget);
462462
expect(
463-
find.text('InternetAddress(\'2606:4700:3037::ac43:bd8f\', IPv6)'),
463+
find.text('[2606:4700:3037::ac43:bd8f]:443'),
464464
findsOneWidget,
465465
);
466466
expect(find.text('Method: '), findsOneWidget);
467-
expect(find.text('GET'), findsOneWidget);
467+
expect(find.text('SOCKET'), findsOneWidget);
468468
expect(find.text('Status: '), findsOneWidget);
469-
expect(find.text('101'), findsOneWidget);
469+
expect(find.text('Closed'), findsOneWidget);
470470
expect(find.text('Port: '), findsOneWidget);
471471
expect(find.text('443'), findsOneWidget);
472472
expect(find.text('Content type: '), findsOneWidget);
473-
expect(find.text('websocket'), findsOneWidget);
473+
expect(find.text('socket'), findsOneWidget);
474474
expect(find.text('Socket id: '), findsOneWidget);
475475
expect(find.text('10000'), findsOneWidget);
476476
expect(find.text('Socket type: '), findsOneWidget);
@@ -513,17 +513,17 @@ void main() {
513513
// Verify general information.
514514
expect(find.text('Request uri: '), findsOneWidget);
515515
expect(
516-
find.text('InternetAddress(\'2606:4700:3037::ac43:0000\', IPv6)'),
516+
find.text('[2606:4700:3037::ac43:0000]:80'),
517517
findsOneWidget,
518518
);
519519
expect(find.text('Method: '), findsOneWidget);
520-
expect(find.text('GET'), findsOneWidget);
520+
expect(find.text('SOCKET'), findsOneWidget);
521521
expect(find.text('Status: '), findsOneWidget);
522-
expect(find.text('101'), findsOneWidget);
522+
expect(find.text('Open'), findsOneWidget);
523523
expect(find.text('Port: '), findsOneWidget);
524524
expect(find.text('80'), findsOneWidget);
525525
expect(find.text('Content type: '), findsOneWidget);
526-
expect(find.text('websocket'), findsOneWidget);
526+
expect(find.text('socket'), findsOneWidget);
527527
expect(find.text('Socket id: '), findsOneWidget);
528528
expect(find.text('11111'), findsOneWidget);
529529
expect(find.text('Socket type: '), findsOneWidget);

packages/devtools_app/test/network/network_table_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ void main() {
5757
}
5858

5959
test('UriColumn', () {
60-
final column = UriColumn();
60+
final column = AddressColumn();
6161
for (final request in requests) {
6262
expect(column.getDisplayValue(request), request.uri.toString());
6363
}

0 commit comments

Comments
 (0)