Skip to content

Commit

Permalink
Migrate DevTools server to use package:http (#6712)
Browse files Browse the repository at this point in the history
  • Loading branch information
kenzieschmoll committed Nov 11, 2023
1 parent 17de972 commit 9a9c066
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 66 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be found
// in the LICENSE file.

// TODO(kenz): delete this file in a follow up PR since we not longer need
// a conditional import for the server after migrating to `package:http`.

// Avoid unused parameters does not understand conditional imports.
// ignore_for_file: avoid-unused-parameters
import 'dart:async';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,33 @@

import 'dart:async';
import 'dart:convert';
// TODO(jacobr): this should use package:http instead of dart:html.
// ignore: avoid_web_libraries_in_flutter, as designed
import 'dart:html';

import 'package:collection/collection.dart';
import 'package:devtools_shared/devtools_deeplink.dart';
import 'package:devtools_shared/devtools_extensions.dart';
import 'package:devtools_shared/devtools_shared.dart';
import 'package:flutter/foundation.dart';
import 'package:http/http.dart';
import 'package:logging/logging.dart';

import '../../development_helpers.dart';
import '../../primitives/utils.dart';

final _log = Logger('_server_web');

// Code to check if DevTools server is available, will only be true in release
// mode, debug mode will be set to false.
bool get isDevToolsServerAvailable => !isDebugBuild();
// The DevTools server is only available in release mode right now.
// TODO(kenz): design a way to run the DevTools server and DevTools app together
// in debug mode.
bool get isDevToolsServerAvailable => kReleaseMode;

/// Helper to catch any server request which could fail.
///
/// Returns HttpRequest or null (if server failure).
Future<HttpRequest?> request(String url) async {
HttpRequest? response;
Future<Response?> request(String url) async {
Response? response;

try {
response = await HttpRequest.request(url, method: 'POST');
response = await post(Uri.parse(url));
} catch (_) {}

return response;
Expand All @@ -43,8 +43,8 @@ Future<bool> isFirstRun() async {

if (isDevToolsServerAvailable) {
final resp = await request(apiGetDevToolsFirstRun);
if (resp?.status == HttpStatus.ok) {
firstRun = json.decode(resp!.responseText!);
if (resp?.statusCode == 200) {
firstRun = json.decode(resp!.body);
} else {
logWarning(resp, apiGetDevToolsFirstRun);
}
Expand All @@ -59,8 +59,8 @@ Future<bool> isAnalyticsEnabled() async {
bool enabled = false;
if (isDevToolsServerAvailable) {
final resp = await request(apiGetDevToolsEnabled);
if (resp?.status == HttpStatus.ok) {
enabled = json.decode(resp!.responseText!);
if (resp?.statusOk ?? false) {
enabled = json.decode(resp!.body);
} else {
logWarning(resp, apiGetDevToolsEnabled);
}
Expand All @@ -78,11 +78,11 @@ Future<bool> setAnalyticsEnabled([bool value = true]) async {
'$apiSetDevToolsEnabled'
'?$devToolsEnabledPropertyName=$value',
);
if (resp?.status == HttpStatus.ok) {
assert(json.decode(resp!.responseText!) == value);
if (resp?.statusOk ?? false) {
assert(json.decode(resp!.body) == value);
return true;
} else {
logWarning(resp, apiSetDevToolsEnabled, resp?.responseText);
logWarning(resp, apiSetDevToolsEnabled, resp?.body);
}
}
return false;
Expand All @@ -103,10 +103,10 @@ Future<bool> _isFlutterGAEnabled() async {

if (isDevToolsServerAvailable) {
final resp = await request(apiGetFlutterGAEnabled);
if (resp?.status == HttpStatus.ok) {
if (resp?.statusOk ?? false) {
// A return value of 'null' implies Flutter tool has never been run so
// return false for Flutter GA enabled.
final responseValue = json.decode(resp!.responseText!);
final responseValue = json.decode(resp!.body);
enabled = responseValue ?? false;
} else {
logWarning(resp, apiGetFlutterGAEnabled);
Expand All @@ -129,8 +129,8 @@ Future<String> flutterGAClientID() async {
// is false, we don't want to be the first to create a ~/.flutter file.
if (await _isFlutterGAEnabled()) {
final resp = await request(apiGetFlutterGAClientId);
if (resp?.status == HttpStatus.ok) {
clientId = json.decode(resp!.responseText!);
if (resp?.statusOk ?? false) {
clientId = json.decode(resp!.body);
if (clientId.isEmpty) {
// Requested value of 'null' (Flutter tool never ran). Server request
// apiGetFlutterGAClientId should not happen because the
Expand Down Expand Up @@ -160,7 +160,7 @@ Future<bool> setActiveSurvey(String value) async {
'$apiSetActiveSurvey'
'?$activeSurveyName=$value',
);
if (resp?.status == HttpStatus.ok && json.decode(resp!.responseText!)) {
if ((resp?.statusOk ?? false) && json.decode(resp!.body)) {
return true;
} else {
logWarning(resp, apiSetActiveSurvey);
Expand All @@ -179,8 +179,8 @@ Future<bool> surveyActionTaken() async {

if (isDevToolsServerAvailable) {
final resp = await request(apiGetSurveyActionTaken);
if (resp?.status == HttpStatus.ok) {
surveyActionTaken = json.decode(resp!.responseText!);
if (resp?.statusOk ?? false) {
surveyActionTaken = json.decode(resp!.body);
} else {
logWarning(resp, apiGetSurveyActionTaken);
}
Expand All @@ -200,8 +200,8 @@ Future<void> setSurveyActionTaken() async {
'$apiSetSurveyActionTaken'
'?$surveyActionTakenPropertyName=true',
);
if (resp?.status != HttpStatus.ok || !json.decode(resp!.responseText!)) {
logWarning(resp, apiSetSurveyActionTaken, resp?.responseText);
if (resp == null || !resp.statusOk || !json.decode(resp.body)) {
logWarning(resp, apiSetSurveyActionTaken, resp?.body);
}
}
}
Expand All @@ -216,8 +216,8 @@ Future<int> surveyShownCount() async {

if (isDevToolsServerAvailable) {
final resp = await request(apiGetSurveyShownCount);
if (resp?.status == HttpStatus.ok) {
surveyShownCount = json.decode(resp!.responseText!);
if (resp?.statusOk ?? false) {
surveyShownCount = json.decode(resp!.body);
} else {
logWarning(resp, apiGetSurveyShownCount);
}
Expand All @@ -237,8 +237,8 @@ Future<int> incrementSurveyShownCount() async {

if (isDevToolsServerAvailable) {
final resp = await request(apiIncrementSurveyShownCount);
if (resp?.status == HttpStatus.ok) {
surveyShownCount = json.decode(resp!.responseText!);
if (resp?.statusOk ?? false) {
surveyShownCount = json.decode(resp!.body);
} else {
logWarning(resp, apiIncrementSurveyShownCount);
}
Expand All @@ -253,8 +253,8 @@ Future<String> getLastShownReleaseNotesVersion() async {
String version = '';
if (isDevToolsServerAvailable) {
final resp = await request(apiGetLastReleaseNotesVersion);
if (resp?.status == HttpStatus.ok) {
version = json.decode(resp!.responseText!);
if (resp?.statusOk ?? false) {
version = json.decode(resp!.body);
} else {
logWarning(resp, apiGetLastReleaseNotesVersion);
}
Expand All @@ -271,10 +271,8 @@ Future<void> setLastShownReleaseNotesVersion(String version) async {
'$apiSetLastReleaseNotesVersion'
'?$lastReleaseNotesVersionPropertyName=$version',
);
if (resp == null ||
resp.status != HttpStatus.ok ||
!json.decode(resp.responseText!)) {
logWarning(resp, apiSetLastReleaseNotesVersion, resp?.responseText);
if (resp == null || !resp.statusOk || !json.decode(resp.body)) {
logWarning(resp, apiSetLastReleaseNotesVersion, resp?.body);
}
}
}
Expand All @@ -285,8 +283,8 @@ Future<void> setLastShownReleaseNotesVersion(String version) async {
Future<void> resetDevToolsFile() async {
if (isDevToolsServerAvailable) {
final resp = await request(apiResetDevTools);
if (resp?.status == HttpStatus.ok) {
assert(json.decode(resp!.responseText!));
if (resp?.statusOk ?? false) {
assert(json.decode(resp!.body));
} else {
logWarning(resp, apiResetDevTools);
}
Expand Down Expand Up @@ -317,7 +315,7 @@ Future<DevToolsJsonFile?> requestFile({
if (isDevToolsServerAvailable) {
final url = Uri(path: api, queryParameters: {fileKey: filePath});
final resp = await request(url.toString());
if (resp?.status == HttpStatus.ok) {
if (resp?.statusOk ?? false) {
return _devToolsJsonFileFromResponse(resp!, filePath);
} else {
logWarning(resp, api);
Expand All @@ -327,10 +325,10 @@ Future<DevToolsJsonFile?> requestFile({
}

DevToolsJsonFile _devToolsJsonFileFromResponse(
HttpRequest resp,
Response resp,
String filePath,
) {
final data = json.decode(resp.response);
final data = json.decode(resp.body);
final lastModified = data['lastModifiedTime'];
final lastModifiedTime =
lastModified != null ? DateTime.parse(lastModified) : DateTime.now();
Expand All @@ -353,8 +351,8 @@ Future<List<DevToolsExtensionConfig>> refreshAvailableExtensions(
queryParameters: {ExtensionsApi.extensionRootPathPropertyName: rootPath},
);
final resp = await request(uri.toString());
if (resp?.status == HttpStatus.ok) {
final parsedResult = json.decode(resp!.responseText!);
if (resp?.statusOk ?? false) {
final parsedResult = json.decode(resp!.body);
final extensionsAsJson =
(parsedResult[ExtensionsApi.extensionsResultPropertyName]!
as List<Object?>)
Expand Down Expand Up @@ -403,8 +401,8 @@ Future<ExtensionEnabledState> extensionEnabledState({
},
);
final resp = await request(uri.toString());
if (resp?.status == HttpStatus.ok) {
final parsedResult = json.decode(resp!.responseText!);
if (resp?.statusOk ?? false) {
final parsedResult = json.decode(resp!.body);
return ExtensionEnabledState.from(parsedResult);
} else {
logWarning(resp, ExtensionsApi.apiExtensionEnabledState);
Expand All @@ -428,8 +426,8 @@ Future<List<String>> requestAndroidBuildVariants(String path) async {
},
);
final resp = await request(uri.toString());
if (resp?.status == HttpStatus.ok) {
return json.decode(resp!.responseText!);
if (resp?.statusOk ?? false) {
return json.decode(resp!.body);
} else {
logWarning(resp, DeeplinkApi.androidBuildVariants);
}
Expand All @@ -450,8 +448,8 @@ Future<AppLinkSettings> requestAndroidAppLinkSettings(
},
);
final resp = await request(uri.toString());
if (resp?.status == HttpStatus.ok) {
return AppLinkSettings.fromJson(resp!.responseText!);
if (resp?.statusOk ?? false) {
return AppLinkSettings.fromJson(resp!.body);
} else {
logWarning(resp, DeeplinkApi.androidAppLinkSettings);
}
Expand All @@ -468,8 +466,8 @@ Future<XcodeBuildOptions> requestIosBuildOptions(String path) async {
},
);
final resp = await request(uri.toString());
if (resp?.status == HttpStatus.ok) {
return XcodeBuildOptions.fromJson(resp!.responseText!);
if (resp?.statusOk ?? false) {
return XcodeBuildOptions.fromJson(resp!.body);
} else {
logWarning(resp, DeeplinkApi.iosBuildOptions);
}
Expand All @@ -492,18 +490,22 @@ Future<UniversalLinkSettings> requestIosUniversalLinkSettings(
},
);
final resp = await request(uri.toString());
if (resp?.status == HttpStatus.ok) {
return UniversalLinkSettings.fromJson(resp!.responseText!);
if (resp?.statusOk ?? false) {
return UniversalLinkSettings.fromJson(resp!.body);
} else {
logWarning(resp, DeeplinkApi.iosUniversalLinkSettings);
}
}
return UniversalLinkSettings.empty;
}

void logWarning(HttpRequest? response, String apiType, [String? respText]) {
void logWarning(Response? response, String apiType, [String? respText]) {
_log.warning(
'HttpRequest $apiType failed status = ${response?.status}'
'HttpRequest $apiType failed status = ${response?.statusCode}'
'${respText != null ? ', responseText = $respText' : ''}',
);
}

extension ResponseExtension on Response {
bool get statusOk => statusCode == 200;
}
11 changes: 0 additions & 11 deletions packages/devtools_app/lib/src/shared/primitives/utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -619,17 +619,6 @@ String formatDateTime(DateTime time) {
return DateFormat('H:mm:ss.S').format(time);
}

bool isDebugBuild() {
bool debugBuild = false;
assert(
(() {
debugBuild = true;
return true;
})(),
);
return debugBuild;
}

/// Divides [numerator] by [denominator], not returning infinite, NaN, or null
/// quotients.
///
Expand Down
2 changes: 1 addition & 1 deletion packages/devtools_app/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ dependencies:
flutter_riverpod: 2.0.0-dev.9
flutter_web_plugins:
sdk: flutter
http: ^0.13.4
http: ^1.1.0
image: ^3.0.2
intl: ^0.18.0
js: ^0.6.1+1
Expand Down

0 comments on commit 9a9c066

Please sign in to comment.