fixed stalled requests after app resume
This commit is contained in:
@@ -4,6 +4,7 @@ import 'package:http/http.dart' as http;
|
||||
|
||||
import '../../../model/endpoint_data.dart';
|
||||
import '../../errors/server_exception.dart';
|
||||
import '../../http_errors.dart';
|
||||
import '../nextcloud_ocs.dart';
|
||||
import 'autocomplete_response.dart';
|
||||
|
||||
@@ -30,7 +31,12 @@ class AutocompleteApi {
|
||||
'limit': '10',
|
||||
},
|
||||
);
|
||||
final response = await http.get(uri, headers: NextcloudOcs.headers());
|
||||
final response = (await sendGuarded(
|
||||
'Autocomplete $uri',
|
||||
() => http
|
||||
.get(uri, headers: NextcloudOcs.headers())
|
||||
.timeout(const Duration(seconds: 20)),
|
||||
))!;
|
||||
if (response.statusCode != HttpStatus.ok) {
|
||||
throw ServerException(
|
||||
statusCode: response.statusCode,
|
||||
|
||||
@@ -12,6 +12,10 @@ import '../nextcloud_ocs.dart';
|
||||
import 'talk_error.dart';
|
||||
|
||||
abstract class TalkApi<T extends ApiResponse?> {
|
||||
// package:http has no timeout of its own; a request stuck on a dead
|
||||
// connection (e.g. one started right before a suspend) would spin forever.
|
||||
static const Duration _timeout = Duration(seconds: 30);
|
||||
|
||||
String path;
|
||||
ApiParams? body;
|
||||
Map<String, String>? headers;
|
||||
@@ -35,7 +39,7 @@ abstract class TalkApi<T extends ApiResponse?> {
|
||||
|
||||
final data = await sendGuarded(
|
||||
'Talk $endpoint',
|
||||
() => request(endpoint, body, mergedHeaders),
|
||||
() => request(endpoint, body, mergedHeaders)?.timeout(_timeout),
|
||||
);
|
||||
if (data == null) {
|
||||
throw const NetworkException(
|
||||
|
||||
@@ -16,6 +16,16 @@ class MarianumConnectApi {
|
||||
|
||||
static Dio dio() => _instance;
|
||||
|
||||
/// Drops the pooled keep-alive sockets. After a suspend the OS or a NAT
|
||||
/// has usually killed them already, but dart:io only notices once a request
|
||||
/// is written into one — which then hangs until [_receiveTimeout].
|
||||
/// In-flight requests finish on the old adapter.
|
||||
static void resetConnections() {
|
||||
final stale = _instance.httpClientAdapter;
|
||||
_instance.httpClientAdapter = HttpClientAdapter();
|
||||
stale.close();
|
||||
}
|
||||
|
||||
/// A fresh dio with the standard JSON options but no interceptors — used by
|
||||
/// the auth queries (login/verify) that must bypass the bearer/demo
|
||||
/// interceptors to avoid a re-auth loop.
|
||||
|
||||
Reference in New Issue
Block a user