2
0
mirror of https://github.com/inventree/inventree-app.git synced 2025-05-03 15:58:54 +00:00

Greatly improve error handling for API request functions

This commit is contained in:
Oliver 2021-07-14 08:14:40 +10:00
parent a52ae09b2b
commit b50d83f5f3

View File

@ -41,6 +41,7 @@ class InvenTreeFileService extends FileService {
Future<FileServiceResponse> get(String url, Future<FileServiceResponse> get(String url,
{Map<String, String>? headers}) async { {Map<String, String>? headers}) async {
final Uri resolved = Uri.base.resolve(url); final Uri resolved = Uri.base.resolve(url);
final HttpClientRequest req = await _client!.getUrl(resolved); final HttpClientRequest req = await _client!.getUrl(resolved);
if (headers != null) { if (headers != null) {
@ -405,12 +406,12 @@ class InvenTreeAPI {
bool checkPermission(String role, String permission) { bool checkPermission(String role, String permission) {
/* /*
* Check if the user has the given role.permission assigned * Check if the user has the given role.permission assigned
* *e
* e.g. 'part', 'change' * e.g. 'part', 'change'
*/ */
// If we do not have enough information, assume permission is allowed // If we do not have enough information, assume permission is allowed
if (roles == null || roles.isEmpty) { if (roles.isEmpty) {
return true; return true;
} }
@ -444,37 +445,25 @@ class InvenTreeAPI {
var client = createClient(true); var client = createClient(true);
HttpClientRequest? request;
try {
// Open a connection to the server // Open a connection to the server
HttpClientRequest request = await client.patchUrl(uri) request = await client.patchUrl(uri).timeout(Duration(seconds: 10));
.timeout(Duration(seconds: 10)) } on SocketException catch (error) {
.catchError((error, stackTrace) { showServerError(L10().connectionRefused, error.toString());
print("PATCH request return error"); return null;
print("URL: ${uri}"); } on TimeoutException catch (error) {
print("Error: ${error.toString()}");
var ctx = OneContext().context;
if (error is SocketException) {
showServerError(
L10().connectionRefused,
error.toString(),
);
} else if (error is TimeoutException) {
showTimeoutError(); showTimeoutError();
} else { return null;
} catch (error, stackTrace) {
showServerError( showServerError(
L10().serverError, L10().serverError,
error.toString() error.toString()
); );
sentryReportError(error, stackTrace); sentryReportError(error, stackTrace);
}
return null;
});
// Request could not be made
if (request == null) {
return null; return null;
} }
@ -488,33 +477,28 @@ class InvenTreeAPI {
request.add(utf8.encode(data)); request.add(utf8.encode(data));
HttpClientResponse response = await request.close() HttpClientResponse? response;
.timeout(Duration(seconds: 30))
.catchError((error, stackTrace) {
print("PATCH request returned error");
print("URL: ${_url}");
print("Error: ${error.toString()}");
var ctx = OneContext().context; try {
response = await request.close().timeout(Duration(seconds: 10));
if (error is SocketException) { } on SocketException catch (error) {
showServerError( showServerError(
L10().connectionRefused, L10().connectionRefused,
error.toString() error.toString()
); );
} else if (error is TimeoutException) { return null;
} on TimeoutException catch (error) {
showTimeoutError(); showTimeoutError();
} else { return null;
} catch (error, stackTrace) {
showServerError( showServerError(
L10().serverError, L10().serverError,
error.toString() error.toString()
); );
sentryReportError(error, stackTrace); sentryReportError(error, stackTrace);
}
return null; return null;
}); }
var responseData = await responseToJson(response); var responseData = await responseToJson(response);
@ -605,34 +589,31 @@ class InvenTreeAPI {
return null; return null;
} }
HttpClientRequest? request;
try {
// Open a connection to the server // Open a connection to the server
HttpClientRequest request = await client.postUrl(uri) request = await client.postUrl(uri).timeout(Duration(seconds: 10));
.timeout(Duration(seconds: 10)) } on SocketException catch (error) {
.catchError((error, stackTrace) {
print("POST request returned error");
print("URL: ${uri}");
print("Error: ${error.toString()}");
var ctx = OneContext().context;
if (error is SocketException) {
showServerError( showServerError(
L10().connectionRefused, L10().connectionRefused,
error.toString() error.toString()
); );
} else if (error is TimeoutException) { return null;
} on TimeoutException catch (error) {
showTimeoutError(); showTimeoutError();
} else { return null;
} catch (error, stackTrace) {
showServerError( showServerError(
L10().serverError, L10().serverError,
error.toString() error.toString()
); );
sentryReportError(error, stackTrace); sentryReportError(error, stackTrace);
}
return null; return null;
}); }
var data = json.encode(body); var data = json.encode(body);
@ -646,36 +627,26 @@ class InvenTreeAPI {
// Add JSON data to the request // Add JSON data to the request
request.add(utf8.encode(data)); request.add(utf8.encode(data));
HttpClientResponse response = await request.close() HttpClientResponse? response;
.timeout(Duration(seconds: 30))
.catchError((error, stackTrace) {
print("POST request returned error");
print("URL: ${_url}");
print("Error: ${error.toString()}");
var ctx = OneContext().context; try {
response = await request.close().timeout(Duration(seconds: 10));
if (error is SocketException) { } on SocketException catch (error) {
showServerError( showServerError(
L10().connectionRefused, L10().connectionRefused,
error.toString() error.toString()
); );
} else if (error is TimeoutException) { return null;
} on TimeoutException catch (error) {
showTimeoutError(); showTimeoutError();
} else { return null;
} catch (error, stackTrace) {
showServerError( showServerError(
L10().serverError, L10().serverError,
error.toString() error.toString()
); );
sentryReportError(error, stackTrace); sentryReportError(error, stackTrace);
}
return null;
});
if (response == null) {
print("null response from POST ${_url}");
return null; return null;
} }
@ -778,54 +749,19 @@ class InvenTreeAPI {
try { try {
// Open a connection // Open a connection
request = await client.getUrl(uri) request = await client.getUrl(uri).timeout(Duration(seconds: 10));
.timeout(Duration(seconds: 10)) } on TimeoutException catch (error) {
.catchError((error, stackTrace) {
print("GET request returned error");
print("URL: ${uri}");
print("Error: ${error.toString()}");
var ctx = OneContext().context;
if (error is SocketException) {
showServerError(
L10().connectionRefused,
error.toString()
);
} else if (error is TimeoutException) {
showTimeoutError(); showTimeoutError();
} else {
showServerError(
L10().serverError,
error.toString()
);
sentryReportError(error, stackTrace);
}
return null; return null;
}); } on SocketException catch (error) {
showServerError(L10().connectionRefused, error.toString());
return null;
} on Exception catch (error) {
showServerError(L10().invalidHost, L10().invalidHostDetails);
return null;
} catch (error, stackTrace) { } catch (error, stackTrace) {
if (error is FormatException) {
showServerError(
L10().invalidHost,
L10().invalidHostDetails)
;
} else if (error is SocketException) {
showServerError(
L10().connectionRefused,
error.toString()
);
} else {
showServerError(
L10().serverError,
error.toString()
);
// Report to sentry
sentryReportError(error, stackTrace); sentryReportError(error, stackTrace);
} showServerError(L10().serverError, error.toString());
return null; return null;
} }
@ -837,35 +773,29 @@ class InvenTreeAPI {
request.headers.set(HttpHeaders.contentTypeHeader, 'application/json'); request.headers.set(HttpHeaders.contentTypeHeader, 'application/json');
request.headers.set(HttpHeaders.authorizationHeader, _authorizationHeader()); request.headers.set(HttpHeaders.authorizationHeader, _authorizationHeader());
HttpClientResponse response = await request.close()
.timeout(Duration(seconds: 10))
.catchError((error, stackTrace) {
print("GET request returned error");
print("URL: ${_url}");
print("Error: ${error.toString()}");
var ctx = OneContext().context; try {
HttpClientResponse response = await request.close().timeout(Duration(seconds: 10));
if (error is SocketException) { return response;
showServerError(
L10().connectionRefused, } on TimeoutException catch (error) {
error.toString()
);
} else if (error is TimeoutException) {
showTimeoutError(); showTimeoutError();
} else { return null;
} on SocketException catch (error) {
showServerError(L10().connectionRefused, error.toString());
return null;
} catch (error, stackTrace) {
showServerError( showServerError(
L10().serverError, L10().serverError,
error.toString() error.toString()
); );
sentryReportError(error, stackTrace); sentryReportError(error, stackTrace);
}
return null; return null;
}); }
return response;
} }
dynamic responseToJson(HttpClientResponse response) async { dynamic responseToJson(HttpClientResponse response) async {