Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions packages/dart/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
## [8.0.1](https://github.com/parse-community/Parse-SDK-Flutter/compare/dart-8.0.0...dart-8.0.1) (2025-11-22)

### Bug Fixes

* Fix Http client exception not handled properly resulting in incorrectly formatted error ([#1021](https://github.com/parse-community/Parse-SDK-Flutter/pull/1021))

## [8.0.0](https://github.com/parse-community/Parse-SDK-Flutter/compare/dart-7.0.1...dart-8.0.0) (2024-12-20)

### BREAKING CHANGES
Expand Down
54 changes: 1 addition & 53 deletions packages/dart/lib/parse_server_sdk.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import 'dart:typed_data';
import 'package:collection/collection.dart';
import 'package:cross_file/cross_file.dart';
import 'package:dio/dio.dart';
import 'package:http/http.dart';
import 'package:meta/meta.dart';
import 'package:mime/mime.dart';
import 'package:path/path.dart' as path;
Expand All @@ -29,111 +30,58 @@ export 'src/network/parse_dio_client.dart';
export 'src/network/parse_http_client.dart';

part 'src/base/parse_constants.dart';

part 'src/data/parse_core_data.dart';

part 'src/data/parse_subclass_handler.dart';

part 'src/enums/parse_enum_api_rq.dart';

part 'src/network/options.dart';

part 'src/network/parse_client.dart';

part 'src/network/parse_connectivity.dart';

part 'src/network/parse_live_query.dart';

part 'src/network/parse_query.dart';

part 'src/objects/parse_acl.dart';

part 'src/objects/parse_array.dart';

part 'src/objects/parse_base.dart';

part 'src/objects/parse_cloneable.dart';

part 'src/objects/parse_config.dart';

part 'src/objects/parse_error.dart';

part 'src/objects/parse_exception.dart';

part 'src/objects/parse_file.dart';

part 'src/objects/parse_file_base.dart';

part 'src/objects/parse_file_web.dart';

part 'src/objects/parse_function.dart';

part 'src/objects/parse_geo_point.dart';

part 'src/objects/parse_installation.dart';

part 'src/objects/parse_number.dart';

part 'src/objects/parse_object.dart';

part 'src/objects/parse_operation/parse_add_operation.dart';

part 'src/objects/parse_operation/parse_add_relation_operation.dart';

part 'src/objects/parse_operation/parse_add_unique_operation.dart';

part 'src/objects/parse_operation/parse_increment_operation.dart';

part 'src/objects/parse_operation/parse_operation.dart';

part 'src/objects/parse_operation/parse_remove_operation.dart';

part 'src/objects/parse_operation/parse_remove_relation_operation.dart';

part 'src/objects/parse_relation.dart';

part 'src/objects/parse_response.dart';

part 'src/objects/parse_save_state_aware_child.dart';

part 'src/objects/parse_session.dart';

part 'src/objects/parse_user.dart';

part 'src/objects/parse_x_file.dart';

part 'src/objects/response/parse_error_response.dart';

part 'src/objects/response/parse_exception_response.dart';

part 'src/objects/response/parse_response_builder.dart';

part 'src/objects/response/parse_response_utils.dart';

part 'src/objects/response/parse_success_no_results.dart';

part 'src/storage/core_store.dart';

part 'src/storage/core_store_memory.dart';

part 'src/storage/core_store_sem_impl.dart';

part 'src/storage/xxtea_codec.dart';

part 'src/utils/parse_date_format.dart';

part 'src/utils/parse_decoder.dart';

part 'src/utils/parse_encoder.dart';

part 'src/utils/parse_live_list.dart';

part 'src/utils/parse_logger.dart';

part 'src/utils/parse_login_helpers.dart';

part 'src/utils/parse_utils.dart';

part 'src/utils/valuable.dart';

class Parse {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@ ParseResponse buildParseResponseWithException(Exception exception) {
final errorMessage =
errorResponse['error']?.toString() ?? exception.response?.statusMessage;

final String? codeString = errorResponse['code']?.toString();
final errorCode =
int.tryParse(errorResponse['code']) ?? exception.response?.statusCode;
int.tryParse(codeString ?? '') ?? exception.response?.statusCode;

return ParseResponse(
error: ParseError(
Expand All @@ -22,6 +23,12 @@ ParseResponse buildParseResponseWithException(Exception exception) {
));
}

if (exception is ClientException) {
return ParseResponse(
error: ParseError(message: exception.message, exception: exception),
);
}

return ParseResponse(
error: ParseError(message: exception.toString(), exception: exception));
}
2 changes: 1 addition & 1 deletion packages/dart/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: parse_server_sdk
description: The Dart SDK to connect to Parse Server. Build your apps faster with Parse Platform, the complete application stack.
version: 8.0.0
version: 8.0.1
homepage: https://parseplatform.org
repository: https://github.com/parse-community/Parse-SDK-Flutter
issue_tracker: https://github.com/parse-community/Parse-SDK-Flutter/issues
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import 'dart:convert';

import 'package:dio/dio.dart';
import 'package:http/http.dart' show ClientException;
import 'package:parse_server_sdk/parse_server_sdk.dart';
import 'package:test/test.dart';

void main() {
group('buildParseResponseWithException', () {
test('parses DioException with JSON body', () {
final response = Response(
requestOptions: RequestOptions(path: '/'),
data: json.encode({'error': 'some error', 'code': '123'}),
statusCode: 400,
statusMessage: 'Bad Request',
);

final dioException = DioException(
requestOptions: response.requestOptions,
response: response,
);

final result = buildParseResponseWithException(dioException);

expect(result.error, isNotNull);
expect(result.error!.message, 'some error');
expect(result.error!.code, 123);
expect(result.error!.exception, dioException);
});

test('uses statusMessage and statusCode when body is not JSON', () {
final response = Response(
requestOptions: RequestOptions(path: '/'),
data: 'Not a JSON body',
statusCode: 404,
statusMessage: 'Not Found',
);

final dioException = DioException(
requestOptions: response.requestOptions,
response: response,
);

final result = buildParseResponseWithException(dioException);

expect(result.error, isNotNull);
expect(result.error!.message, 'Not Found');
expect(result.error!.code, 404);
expect(result.error!.exception, dioException);
});

test('handles http ClientException', () {
final clientEx = ClientException('no network');

final result = buildParseResponseWithException(clientEx);

expect(result.error, isNotNull);
expect(result.error!.message, 'no network');
expect(result.error!.exception, clientEx);
});

test('handles generic Exception', () {
final ex = Exception('generic');

final result = buildParseResponseWithException(ex);

expect(result.error, isNotNull);
expect(result.error!.message, ex.toString());
expect(result.error!.exception, ex);
});
});
}