Skip to content

Commit 5b30e96

Browse files
committed
fix(dynamite_runtime): use content type header to deserialize response
Signed-off-by: Nikolas Rimikis <leptopoda@users.noreply.github.com>
1 parent e0dab51 commit 5b30e96

File tree

2 files changed

+24
-6
lines changed

2 files changed

+24
-6
lines changed

packages/dynamite/dynamite_runtime/lib/src/client/response.dart

+22-6
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import 'dart:convert';
2-
import 'dart:typed_data';
32

43
import 'package:built_value/serializer.dart';
54
import 'package:dynamite_runtime/http_client.dart';
65
import 'package:http/http.dart' as http;
6+
import 'package:http_parser/http_parser.dart';
7+
import 'package:logging/logging.dart';
78
import 'package:meta/meta.dart';
89

910
/// Response returned by operations of a `DynamiteClient`.
@@ -70,6 +71,8 @@ final class ResponseConverter<B, H> with Converter<http.Response, DynamiteRespon
7071
/// The serializer to convert the raw header and body into [B] and [H].
7172
final DynamiteSerializer<B, H> serializer;
7273

74+
static final Logger _logger = Logger('ResponseConverter');
75+
7376
@override
7477
DynamiteResponse<B, H> convert(http.Response input) {
7578
final rawHeaders = input.headers;
@@ -81,12 +84,25 @@ final class ResponseConverter<B, H> with Converter<http.Response, DynamiteRespon
8184

8285
final headers = _deserialize<H>(rawHeaders, serializer.serializers, serializer.headersType);
8386

84-
final rawBody = switch (serializer.bodyType) {
85-
const FullType(Uint8List) => input.bodyBytes,
86-
const FullType(String) => input.body,
87-
_ => json.decode(input.body),
87+
final contentType = rawHeaders['content-type'];
88+
MediaType? mediaType;
89+
if (contentType != null) {
90+
try {
91+
mediaType = MediaType.parse(contentType);
92+
} on FormatException catch (error, stackTrace) {
93+
_logger.warning('Could not parse $contentType', error, stackTrace);
94+
}
95+
}
96+
97+
final body = switch (mediaType) {
98+
MediaType(type: 'text') || MediaType(type: 'application', subtype: 'javascript') => input.body,
99+
MediaType(type: 'application', subtype: 'json') => _deserialize<B>(
100+
json.decode(input.body),
101+
serializer.serializers,
102+
serializer.bodyType,
103+
),
104+
_ => input.bodyBytes,
88105
};
89-
final body = _deserialize<B>(rawBody, serializer.serializers, serializer.bodyType);
90106

91107
return DynamiteResponse<B, H>(
92108
statusCode,

packages/dynamite/dynamite_runtime/pubspec.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ dependencies:
1616
built_value: ^8.9.0
1717
collection: ^1.0.0
1818
http: ^1.2.0
19+
http_parser: ^4.0.0
20+
logging: ^1.0.0
1921
meta: ^1.0.0
2022
xml: ^6.0.0
2123

0 commit comments

Comments
 (0)