Skip to content

Commit d96a598

Browse files
committed
feat: add http request timeout
don't cull premium when offline
1 parent 9c6f867 commit d96a598

File tree

6 files changed

+30
-19
lines changed

6 files changed

+30
-19
lines changed

lib/api/helper.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import 'package:GitSync/global.dart';
2929
import '../constant/colors.dart';
3030
import '../constant/dimens.dart';
3131
import '../ui/dialog/submodules_found.dart' as SubmodulesFoundDialog;
32+
import 'package:http/http.dart' as http;
3233

3334
const int mergeConflictNotificationId = 1758;
3435
Map<String, Timer> debounceTimers = {};
@@ -330,3 +331,12 @@ List<int> _randomBytes(int length) {
330331
final rand = Random.secure();
331332
return List<int>.generate(length, (_) => rand.nextInt(256));
332333
}
334+
335+
Future<http.Response> httpGet(Uri url, {Map<String, String>? headers}) => http
336+
.get(url, headers: headers)
337+
.timeout(
338+
const Duration(seconds: 10),
339+
onTimeout: () {
340+
return http.Response('Error', 408);
341+
},
342+
);

lib/api/manager/auth/gitea_manager.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import 'dart:convert';
2+
import 'package:GitSync/api/helper.dart';
23
import 'package:GitSync/api/logger.dart';
34
import 'package:GitSync/constant/strings.dart';
45

56
import '../../manager/auth/git_provider_manager.dart';
67
import '../../../constant/secrets.dart';
7-
import 'package:http/http.dart' as http;
88
import 'package:oauth2_client/oauth2_client.dart';
99

1010
class GiteaManager extends GitProviderManager {
@@ -36,7 +36,7 @@ class GiteaManager extends GitProviderManager {
3636

3737
@override
3838
Future<(String, String)?> getUsernameAndEmail(String accessToken) async {
39-
final response = await http.get(
39+
final response = await httpGet(
4040
Uri.parse("https://$_domain/api/v1/user"),
4141
headers: {"Accept": "application/json", "Authorization": "token $accessToken"},
4242
);
@@ -97,7 +97,7 @@ class GiteaManager extends GitProviderManager {
9797
Function(Function()?) nextPageCallback,
9898
) async {
9999
try {
100-
final response = await http.get(Uri.parse(url), headers: {"Accept": "application/json", "Authorization": "token $accessToken"});
100+
final response = await httpGet(Uri.parse(url), headers: {"Accept": "application/json", "Authorization": "token $accessToken"});
101101

102102
if (response.statusCode == 200) {
103103
final List<dynamic> jsonArray = json.decode(response.body);

lib/api/manager/auth/github_manager.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import 'dart:convert';
2+
import 'package:GitSync/api/helper.dart';
23
import 'package:GitSync/api/logger.dart';
34
import 'package:GitSync/constant/strings.dart';
45

56
import '../../manager/auth/git_provider_manager.dart';
67
import '../../../constant/secrets.dart';
7-
import 'package:http/http.dart' as http;
88
import 'package:oauth2_client/github_oauth2_client.dart';
99
import 'package:oauth2_client/oauth2_client.dart';
1010

@@ -36,7 +36,7 @@ class GithubManager extends GitProviderManager {
3636

3737
@override
3838
Future<(String, String)?> getUsernameAndEmail(String accessToken) async {
39-
final response = await http.get(
39+
final response = await httpGet(
4040
Uri.parse("https://api.$_domain/user"),
4141
headers: {"Accept": "application/json", "Authorization": "token $accessToken"},
4242
);
@@ -45,7 +45,7 @@ class GithubManager extends GitProviderManager {
4545
final Map<String, dynamic> jsonData = json.decode(response.body);
4646
String? email = jsonData["email"];
4747
if (email == null) {
48-
final emailResp = await http.get(
48+
final emailResp = await httpGet(
4949
Uri.parse("https://api.$_domain/user/emails"),
5050
headers: {"Accept": "application/json", "Authorization": "token $accessToken"},
5151
);
@@ -110,7 +110,7 @@ class GithubManager extends GitProviderManager {
110110
Function(Function()?) nextPageCallback,
111111
) async {
112112
try {
113-
final response = await http.get(Uri.parse(url), headers: {"Accept": "application/json", "Authorization": "token $accessToken"});
113+
final response = await httpGet(Uri.parse(url), headers: {"Accept": "application/json", "Authorization": "token $accessToken"});
114114

115115
if (response.statusCode == 200) {
116116
final List<dynamic> jsonArray = json.decode(response.body);

lib/api/manager/auth/gitlab_manager.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import 'dart:convert';
2+
import 'package:GitSync/api/helper.dart';
23
import 'package:GitSync/api/logger.dart';
34
import 'package:GitSync/constant/strings.dart';
45

56
import '../../manager/auth/git_provider_manager.dart';
67
import '../../../constant/secrets.dart';
7-
import 'package:http/http.dart' as http;
88
import 'package:oauth2_client/oauth2_client.dart';
99

1010
class GitlabManager extends GitProviderManager {
@@ -40,7 +40,7 @@ class GitlabManager extends GitProviderManager {
4040

4141
@override
4242
Future<(String, String)?> getUsernameAndEmail(String accessToken) async {
43-
final response = await http.get(Uri.parse("https://$_domain/api/v4/user"), headers: {"Authorization": "Bearer $accessToken"});
43+
final response = await httpGet(Uri.parse("https://$_domain/api/v4/user"), headers: {"Authorization": "Bearer $accessToken"});
4444

4545
if (response.statusCode == 200) {
4646
final Map<String, dynamic> jsonData = json.decode(response.body);
@@ -97,7 +97,7 @@ class GitlabManager extends GitProviderManager {
9797
Function(Function()?) nextPageCallback,
9898
) async {
9999
try {
100-
final response = await http.get(Uri.parse(url), headers: {"Authorization": "Bearer $accessToken"});
100+
final response = await httpGet(Uri.parse(url), headers: {"Authorization": "Bearer $accessToken"});
101101

102102
if (response.statusCode == 200) {
103103
final List<dynamic> jsonArray = json.decode(response.body);

lib/api/manager/premium_manager.dart

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import 'package:GitSync/api/manager/settings_manager.dart';
55
import 'package:GitSync/api/manager/storage.dart';
66
import 'package:GitSync/global.dart';
77
import 'package:flutter/foundation.dart';
8-
import 'package:http/http.dart' as http;
98

109
class PremiumManager {
1110
final ValueNotifier<bool?> hasPremiumNotifier = ValueNotifier(null);
@@ -25,8 +24,6 @@ class PremiumManager {
2524

2625
Future<void> updateGitHubSponsorPremium() async {
2726
if (!await hasNetworkConnection()) {
28-
await repoManager.setBool(StorageKey.repoman_hasGHSponsorPremium, false);
29-
hasPremiumNotifier.value = await _readPremiumStatus();
3027
return;
3128
}
3229

@@ -37,24 +34,28 @@ class PremiumManager {
3734
return;
3835
}
3936

40-
final userRes = await http.get(
37+
final userRes = await httpGet(
4138
Uri.parse('https://api.github.com/user'),
4239
headers: {'Authorization': 'token $userToken', 'Accept': 'application/vnd.github.v3+json'},
4340
);
4441

45-
if (userRes.statusCode != 200) {
42+
if (userRes.statusCode != 200 && userRes.statusCode != 408) {
4643
await repoManager.setBool(StorageKey.repoman_hasGHSponsorPremium, false);
4744
hasPremiumNotifier.value = await _readPremiumStatus();
48-
return;
4945
}
5046

47+
if (userRes.statusCode != 200) return;
48+
5149
final userNodeId = jsonDecode(userRes.body)['node_id'].toString();
5250

53-
final fileRes = await http.get(Uri.parse('https://raw.githubusercontent.com/ViscousPot/sponsors-gitsync/refs/heads/main/sponsors.txt'));
51+
final fileRes = await httpGet(Uri.parse('https://raw.githubusercontent.com/ViscousPot/sponsors-gitsync/refs/heads/main/sponsors.txt'));
5452

55-
if (userNodeId.isEmpty || fileRes.statusCode != 200) {
53+
if (userNodeId.isEmpty || (fileRes.statusCode != 200 && fileRes.statusCode != 408)) {
5654
await repoManager.setBool(StorageKey.repoman_hasGHSponsorPremium, false);
5755
hasPremiumNotifier.value = await _readPremiumStatus();
56+
}
57+
58+
if (userRes.statusCode != 200) {
5859
throw Exception('Failed to load sponsors.txt: ${fileRes.statusCode}');
5960
}
6061

lib/main.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ Future<void> main() async {
9292
await RustLib.init();
9393
await requestStoragePerm(false);
9494
// Loads premiumManager initial state
95-
await premiumManager.init();
95+
initAsync(() async => await premiumManager.init());
9696

9797
runApp(const MyApp());
9898
},

0 commit comments

Comments
 (0)