Skip to content

Commit 4f20640

Browse files
authored
fix: HTTP client exception not handled properly resulting in incorrectly formatted error (#1021)
1 parent 20efcdf commit 4f20640

File tree

5 files changed

+88
-55
lines changed

5 files changed

+88
-55
lines changed

packages/dart/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## [8.0.1](https://github.com/parse-community/Parse-SDK-Flutter/compare/dart-8.0.0...dart-8.0.1) (2025-11-22)
2+
3+
### Bug Fixes
4+
5+
* Fix Http client exception not handled properly resulting in incorrectly formatted error ([#1021](https://github.com/parse-community/Parse-SDK-Flutter/pull/1021))
6+
17
## [8.0.0](https://github.com/parse-community/Parse-SDK-Flutter/compare/dart-7.0.1...dart-8.0.0) (2024-12-20)
28

39
### BREAKING CHANGES

packages/dart/lib/parse_server_sdk.dart

Lines changed: 1 addition & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'dart:typed_data';
99
import 'package:collection/collection.dart';
1010
import 'package:cross_file/cross_file.dart';
1111
import 'package:dio/dio.dart';
12+
import 'package:http/http.dart';
1213
import 'package:meta/meta.dart';
1314
import 'package:mime/mime.dart';
1415
import 'package:path/path.dart' as path;
@@ -29,111 +30,58 @@ export 'src/network/parse_dio_client.dart';
2930
export 'src/network/parse_http_client.dart';
3031

3132
part 'src/base/parse_constants.dart';
32-
3333
part 'src/data/parse_core_data.dart';
34-
3534
part 'src/data/parse_subclass_handler.dart';
36-
3735
part 'src/enums/parse_enum_api_rq.dart';
38-
3936
part 'src/network/options.dart';
40-
4137
part 'src/network/parse_client.dart';
42-
4338
part 'src/network/parse_connectivity.dart';
44-
4539
part 'src/network/parse_live_query.dart';
46-
4740
part 'src/network/parse_query.dart';
48-
4941
part 'src/objects/parse_acl.dart';
50-
5142
part 'src/objects/parse_array.dart';
52-
5343
part 'src/objects/parse_base.dart';
54-
5544
part 'src/objects/parse_cloneable.dart';
56-
5745
part 'src/objects/parse_config.dart';
58-
5946
part 'src/objects/parse_error.dart';
60-
6147
part 'src/objects/parse_exception.dart';
62-
6348
part 'src/objects/parse_file.dart';
64-
6549
part 'src/objects/parse_file_base.dart';
66-
6750
part 'src/objects/parse_file_web.dart';
68-
6951
part 'src/objects/parse_function.dart';
70-
7152
part 'src/objects/parse_geo_point.dart';
72-
7353
part 'src/objects/parse_installation.dart';
74-
7554
part 'src/objects/parse_number.dart';
76-
7755
part 'src/objects/parse_object.dart';
78-
7956
part 'src/objects/parse_operation/parse_add_operation.dart';
80-
8157
part 'src/objects/parse_operation/parse_add_relation_operation.dart';
82-
8358
part 'src/objects/parse_operation/parse_add_unique_operation.dart';
84-
8559
part 'src/objects/parse_operation/parse_increment_operation.dart';
86-
8760
part 'src/objects/parse_operation/parse_operation.dart';
88-
8961
part 'src/objects/parse_operation/parse_remove_operation.dart';
90-
9162
part 'src/objects/parse_operation/parse_remove_relation_operation.dart';
92-
9363
part 'src/objects/parse_relation.dart';
94-
9564
part 'src/objects/parse_response.dart';
96-
9765
part 'src/objects/parse_save_state_aware_child.dart';
98-
9966
part 'src/objects/parse_session.dart';
100-
10167
part 'src/objects/parse_user.dart';
102-
10368
part 'src/objects/parse_x_file.dart';
104-
10569
part 'src/objects/response/parse_error_response.dart';
106-
10770
part 'src/objects/response/parse_exception_response.dart';
108-
10971
part 'src/objects/response/parse_response_builder.dart';
110-
11172
part 'src/objects/response/parse_response_utils.dart';
112-
11373
part 'src/objects/response/parse_success_no_results.dart';
114-
11574
part 'src/storage/core_store.dart';
116-
11775
part 'src/storage/core_store_memory.dart';
118-
11976
part 'src/storage/core_store_sem_impl.dart';
120-
12177
part 'src/storage/xxtea_codec.dart';
122-
12378
part 'src/utils/parse_date_format.dart';
124-
12579
part 'src/utils/parse_decoder.dart';
126-
12780
part 'src/utils/parse_encoder.dart';
128-
12981
part 'src/utils/parse_live_list.dart';
130-
13182
part 'src/utils/parse_logger.dart';
132-
13383
part 'src/utils/parse_login_helpers.dart';
134-
13584
part 'src/utils/parse_utils.dart';
136-
13785
part 'src/utils/valuable.dart';
13886

13987
class Parse {

packages/dart/lib/src/objects/response/parse_exception_response.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ ParseResponse buildParseResponseWithException(Exception exception) {
1111
final errorMessage =
1212
errorResponse['error']?.toString() ?? exception.response?.statusMessage;
1313

14+
final String? codeString = errorResponse['code']?.toString();
1415
final errorCode =
15-
int.tryParse(errorResponse['code']) ?? exception.response?.statusCode;
16+
int.tryParse(codeString ?? '') ?? exception.response?.statusCode;
1617

1718
return ParseResponse(
1819
error: ParseError(
@@ -22,6 +23,12 @@ ParseResponse buildParseResponseWithException(Exception exception) {
2223
));
2324
}
2425

26+
if (exception is ClientException) {
27+
return ParseResponse(
28+
error: ParseError(message: exception.message, exception: exception),
29+
);
30+
}
31+
2532
return ParseResponse(
2633
error: ParseError(message: exception.toString(), exception: exception));
2734
}

packages/dart/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: parse_server_sdk
22
description: The Dart SDK to connect to Parse Server. Build your apps faster with Parse Platform, the complete application stack.
3-
version: 8.0.0
3+
version: 8.0.1
44
homepage: https://parseplatform.org
55
repository: https://github.com/parse-community/Parse-SDK-Flutter
66
issue_tracker: https://github.com/parse-community/Parse-SDK-Flutter/issues
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import 'dart:convert';
2+
3+
import 'package:dio/dio.dart';
4+
import 'package:http/http.dart' show ClientException;
5+
import 'package:parse_server_sdk/parse_server_sdk.dart';
6+
import 'package:test/test.dart';
7+
8+
void main() {
9+
group('buildParseResponseWithException', () {
10+
test('parses DioException with JSON body', () {
11+
final response = Response(
12+
requestOptions: RequestOptions(path: '/'),
13+
data: json.encode({'error': 'some error', 'code': '123'}),
14+
statusCode: 400,
15+
statusMessage: 'Bad Request',
16+
);
17+
18+
final dioException = DioException(
19+
requestOptions: response.requestOptions,
20+
response: response,
21+
);
22+
23+
final result = buildParseResponseWithException(dioException);
24+
25+
expect(result.error, isNotNull);
26+
expect(result.error!.message, 'some error');
27+
expect(result.error!.code, 123);
28+
expect(result.error!.exception, dioException);
29+
});
30+
31+
test('uses statusMessage and statusCode when body is not JSON', () {
32+
final response = Response(
33+
requestOptions: RequestOptions(path: '/'),
34+
data: 'Not a JSON body',
35+
statusCode: 404,
36+
statusMessage: 'Not Found',
37+
);
38+
39+
final dioException = DioException(
40+
requestOptions: response.requestOptions,
41+
response: response,
42+
);
43+
44+
final result = buildParseResponseWithException(dioException);
45+
46+
expect(result.error, isNotNull);
47+
expect(result.error!.message, 'Not Found');
48+
expect(result.error!.code, 404);
49+
expect(result.error!.exception, dioException);
50+
});
51+
52+
test('handles http ClientException', () {
53+
final clientEx = ClientException('no network');
54+
55+
final result = buildParseResponseWithException(clientEx);
56+
57+
expect(result.error, isNotNull);
58+
expect(result.error!.message, 'no network');
59+
expect(result.error!.exception, clientEx);
60+
});
61+
62+
test('handles generic Exception', () {
63+
final ex = Exception('generic');
64+
65+
final result = buildParseResponseWithException(ex);
66+
67+
expect(result.error, isNotNull);
68+
expect(result.error!.message, ex.toString());
69+
expect(result.error!.exception, ex);
70+
});
71+
});
72+
}

0 commit comments

Comments
 (0)