From b254784bb3199acb93a2cf468eae7bee683405c9 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 19 Jul 2021 10:00:20 +1000 Subject: [PATCH 1/4] Catch for response.data potentially being null --- lib/api.dart | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/api.dart b/lib/api.dart index 04d4a42d..5266b2f4 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -23,7 +23,7 @@ import 'package:http/http.dart' as http; */ class APIResponse { - APIResponse({this.url = "", this.method = "", this.statusCode = -1, this.data}); + APIResponse({this.url = "", this.method = "", this.statusCode = -1, this.data = const {}}); int statusCode = -1; @@ -31,7 +31,7 @@ class APIResponse { String method = ""; - dynamic data; + dynamic data = {}; // Request is "valid" if a statusCode was returned bool isValid() => statusCode >= 0; @@ -653,7 +653,7 @@ class InvenTreeAPI { HttpClientResponse? _response = await request.close().timeout(Duration(seconds: 10)); response.statusCode = _response.statusCode; - response.data = await responseToJson(_response); + response.data = await responseToJson(_response) ?? {}; // Expected status code not returned if ((statusCode != null) && (statusCode != _response.statusCode)) { @@ -698,7 +698,7 @@ class InvenTreeAPI { try { var data = json.decode(body); - return data; + return data ?? {}; } on FormatException { print("JSON format exception!"); @@ -717,7 +717,9 @@ class InvenTreeAPI { L10().formatException, L10().formatExceptionJson + ":\n${body}" ); - return null; + + // Return an empty map + return {}; } } From 31ed4c6a7b9d295563f5e05462a33ddaa65e2fec Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 19 Jul 2021 10:41:34 +1000 Subject: [PATCH 2/4] Handle error code 50x --- lib/api.dart | 42 +++++++++++++++++++++++------------------ lib/l10n | 2 +- lib/widget/dialogs.dart | 18 ++++++++++++++++++ 3 files changed, 43 insertions(+), 19 deletions(-) diff --git a/lib/api.dart b/lib/api.dart index 5266b2f4..ac629848 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -653,26 +653,32 @@ class InvenTreeAPI { HttpClientResponse? _response = await request.close().timeout(Duration(seconds: 10)); response.statusCode = _response.statusCode; - response.data = await responseToJson(_response) ?? {}; - // Expected status code not returned - if ((statusCode != null) && (statusCode != _response.statusCode)) { - showStatusCodeError(_response.statusCode); - } - - // Report any server errors + // If the server returns a server error code, alert the user if (_response.statusCode >= 500) { - sentryReportMessage( - "Server error", - context: { - "url": request.uri.toString(), - "method": request.method, - "statusCode": _response.statusCode.toString(), - "requestHeaders": request.headers.toString(), - "responseHeaders": _response.headers.toString(), - "responseData": response.data.toString(), - } - ); + showStatusCodeError(_response.statusCode); + } else { + response.data = await responseToJson(_response) ?? {}; + + // Expected status code not returned + if ((statusCode != null) && (statusCode != _response.statusCode)) { + showStatusCodeError(_response.statusCode); + } + + // Report any server errors + if (_response.statusCode >= 500) { + sentryReportMessage( + "Server error", + context: { + "url": request.uri.toString(), + "method": request.method, + "statusCode": _response.statusCode.toString(), + "requestHeaders": request.headers.toString(), + "responseHeaders": _response.headers.toString(), + "responseData": response.data.toString(), + } + ); + } } } on SocketException catch (error) { diff --git a/lib/l10n b/lib/l10n index 9cc07cdb..84f6ed3f 160000 --- a/lib/l10n +++ b/lib/l10n @@ -1 +1 @@ -Subproject commit 9cc07cdb0ec0012abcec827fc776d7c5473bb75e +Subproject commit 84f6ed3faf63cbf371016e134196400e5f822759 diff --git a/lib/widget/dialogs.dart b/lib/widget/dialogs.dart index 4490329e..9876b641 100644 --- a/lib/widget/dialogs.dart +++ b/lib/widget/dialogs.dart @@ -152,6 +152,24 @@ Future showStatusCodeError(int status, {int expected = 200}) async { case 429: msg = L10().response429; break; + case 500: + msg = L10().response500; + break; + case 501: + msg = L10().response501; + break; + case 502: + msg = L10().response502; + break; + case 503: + msg = L10().response503; + break; + case 504: + msg = L10().response504; + break; + case 505: + msg = L10().response505; + break; default: break; } From bf7a0e72bf748111b913c3cdf9f4b9157dbfa3cc Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 19 Jul 2021 11:18:42 +1000 Subject: [PATCH 3/4] Cleanup --- lib/api.dart | 2 +- lib/widget/dialogs.dart | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/api.dart b/lib/api.dart index ac629848..1bbcbf0f 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -34,7 +34,7 @@ class APIResponse { dynamic data = {}; // Request is "valid" if a statusCode was returned - bool isValid() => statusCode >= 0; + bool isValid() => (statusCode >= 0) && (statusCode < 500); } diff --git a/lib/widget/dialogs.dart b/lib/widget/dialogs.dart index 9876b641..8b0a6156 100644 --- a/lib/widget/dialogs.dart +++ b/lib/widget/dialogs.dart @@ -128,10 +128,10 @@ Future showServerError(String title, String description) async { ); } -Future showStatusCodeError(int status, {int expected = 200}) async { +Future showStatusCodeError(int status) async { String msg = L10().responseInvalid; - String extra = "Server responded with status code ${status}"; + String extra = "${L10().statusCode}: ${status}"; switch (status) { case 400: From f4253913015c3fb44532aafb37b7630fffffe68a Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 19 Jul 2021 11:21:14 +1000 Subject: [PATCH 4/4] v0.2.9 - Update release notes --- assets/release_notes.md | 6 ++++++ ios/Flutter/flutter_export_environment.sh | 4 ++-- pubspec.yaml | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/assets/release_notes.md b/assets/release_notes.md index 8e511fab..60448e9b 100644 --- a/assets/release_notes.md +++ b/assets/release_notes.md @@ -1,6 +1,12 @@ ## InvenTree App Release Notes --- +### 0.2.9 - July 2021 +--- + +- Handle 50x responses from server +- Improved reporting of error messages + ### 0.2.8 - July 2021 --- diff --git a/ios/Flutter/flutter_export_environment.sh b/ios/Flutter/flutter_export_environment.sh index 9597aff1..cc5e66dc 100644 --- a/ios/Flutter/flutter_export_environment.sh +++ b/ios/Flutter/flutter_export_environment.sh @@ -6,8 +6,8 @@ export "COCOAPODS_PARALLEL_CODE_SIGN=true" export "FLUTTER_TARGET=lib\main.dart" export "FLUTTER_BUILD_DIR=build" export "SYMROOT=${SOURCE_ROOT}/../build\ios" -export "FLUTTER_BUILD_NAME=0.2.8" -export "FLUTTER_BUILD_NUMBER=16" +export "FLUTTER_BUILD_NAME=0.2.9" +export "FLUTTER_BUILD_NUMBER=17" export "DART_OBFUSCATION=false" export "TRACK_WIDGET_CREATION=false" export "TREE_SHAKE_ICONS=false" diff --git a/pubspec.yaml b/pubspec.yaml index 0d94a7a7..4b76b81b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,7 +7,7 @@ description: InvenTree stock management # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.2.8+16 +version: 0.2.9+17 environment: sdk: ">=2.12.0 <3.0.0"