Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ enum NetworkEventKeys {
httpOnly,
secure,
reasonPhrase,
encoding,
}

class NetworkEventDefaults {
Expand Down
45 changes: 34 additions & 11 deletions packages/devtools_app/lib/src/screens/network/har_data_entry.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
// found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd.

import 'dart:convert';
import 'dart:typed_data';

import '../../screens/network/utils/http_utils.dart';
import '../../shared/http/http_request_data.dart';
import '../../shared/primitives/utils.dart';
import 'constants.dart';

/// A class representing a single entry in the HTTP Archive (HAR) format.
Expand Down Expand Up @@ -119,6 +119,11 @@ class HarDataEntry {
};
}).toList();

final encodedRequest = e.encodedRequest;
final encodedResponse = e.encodedResponse;
final decodedRequest = _decodeBytes(encodedRequest);
final decodedResponse = _decodeBytes(encodedResponse);

return <String, Object?>{
NetworkEventKeys.startedDateTime.name: e.startTimestamp
.toUtc()
Expand All @@ -134,12 +139,12 @@ class HarDataEntry {
NetworkEventKeys.queryString.name: queryString,
NetworkEventKeys.postData.name: <String, Object?>{
NetworkEventKeys.mimeType.name: e.contentType,
NetworkEventKeys.text.name: e.requestBody,
NetworkEventKeys.text.name: decodedRequest,
},
NetworkEventKeys.headersSize.name: calculateHeadersSize(
e.requestHeaders,
),
NetworkEventKeys.bodySize.name: _calculateBodySize(e.requestBody),
NetworkEventKeys.bodySize.name: _calculateBodySize(encodedRequest),
},
// Response
NetworkEventKeys.response.name: <String, Object?>{
Expand All @@ -151,15 +156,17 @@ class HarDataEntry {
NetworkEventKeys.cookies.name: responseCookies,
NetworkEventKeys.headers.name: responseHeaders,
NetworkEventKeys.content.name: <String, Object?>{
NetworkEventKeys.size.name: e.responseBody?.length,
NetworkEventKeys.size.name: encodedResponse?.length ?? 0,
NetworkEventKeys.mimeType.name: e.type,
NetworkEventKeys.text.name: e.responseBody,
NetworkEventKeys.text.name: decodedResponse,
if (_isBinary(encodedResponse))
NetworkEventKeys.encoding.name: 'base64',
},
NetworkEventKeys.redirectURL.name: '',
NetworkEventKeys.headersSize.name: calculateHeadersSize(
e.responseHeaders,
),
NetworkEventKeys.bodySize.name: _calculateBodySize(e.responseBody),
NetworkEventKeys.bodySize.name: _calculateBodySize(encodedResponse),
},
// Cache
NetworkEventKeys.cache.name: <String, Object?>{},
Expand Down Expand Up @@ -194,6 +201,25 @@ class HarDataEntry {
return request;
}

static String? _decodeBytes(Uint8List? bytes) {
if (bytes == null) return null;
try {
return utf8.decode(bytes);
} catch (_) {
return base64Encode(bytes);
}
}

static bool _isBinary(Uint8List? bytes) {
if (bytes == null) return false;
try {
utf8.decode(bytes);
return false;
} catch (_) {
return true;
}
}

static Map<String, Object?> _convertHeadersListToMap(
List<Object?> serializedHeaders,
) {
Expand Down Expand Up @@ -271,9 +297,6 @@ class HarDataEntry {
}
}

int _calculateBodySize(String? requestBody) {
if (requestBody.isNullOrEmpty) {
return 0;
}
return utf8.encode(requestBody!).length;
int _calculateBodySize(Uint8List? body) {
return body?.length ?? 0;
}
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,23 @@ class DartIOHttpRequestData extends NetworkRequest {
);
_request = updated;
final fullRequest = _request as HttpProfileRequest;
_responseBody = utf8.decode(fullRequest.responseBody!);
_requestBody = utf8.decode(fullRequest.requestBody!);
if (fullRequest.responseBody != null) {
try {
_responseBody = utf8.decode(fullRequest.responseBody!);
} catch (_) {
_responseBody =
'[Binary data (${fullRequest.responseBody!.length} bytes)]';
}
}

if (fullRequest.requestBody != null) {
try {
_requestBody = utf8.decode(fullRequest.requestBody!);
} catch (_) {
_requestBody =
'[Binary data (${fullRequest.requestBody!.length} bytes)]';
}
}
notifyListeners();
}
} finally {
Expand Down Expand Up @@ -303,7 +318,9 @@ class DartIOHttpRequestData extends NetworkRequest {
_responseBody = utf8.decode(fullRequest.responseBody!);
return _responseBody;
} on FormatException {
return '<binary data>';
_responseBody =
'[Binary data (${fullRequest.responseBody!.length} bytes)]';
return _responseBody;
}
}

Expand All @@ -313,6 +330,12 @@ class DartIOHttpRequestData extends NetworkRequest {
return fullRequest.responseBody;
}

Uint8List? get encodedRequest {
if (_request is! HttpProfileRequest) return null;
final fullRequest = _request as HttpProfileRequest;
return fullRequest.requestBody;
}

String? _responseBody;

String? get requestBody {
Expand All @@ -329,7 +352,8 @@ class DartIOHttpRequestData extends NetworkRequest {
_requestBody = utf8.decode(fullRequest.requestBody!);
return _requestBody;
} on FormatException {
return '<binary data>';
_requestBody = '[Binary data (${fullRequest.requestBody!.length} bytes)]';
return _requestBody;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ TODO: Remove this section if there are not any updates.

## Network profiler updates

TODO: Remove this section if there are not any updates.
- Fix crash in the Network tab when viewing binary multipart request or response bodies (#9978)

## Logging updates

Expand Down
Loading