Skip to content

Commit 14a181e

Browse files
committed
perf(dynamite_runtime,nextcloud): BytesStreamExtension add stream based xml decoding
Signed-off-by: Nikolas Rimikis <leptopoda@users.noreply.github.com>
1 parent c5f54ea commit 14a181e

File tree

4 files changed

+20
-5
lines changed

4 files changed

+20
-5
lines changed

packages/dynamite/dynamite_runtime/lib/src/dynamite_client.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class DynamiteRawResponse<B, H> {
7676
_rawBody = switch (bodyType) {
7777
const FullType(Uint8List) => await response.bytes,
7878
const FullType(String) => await response.string,
79-
_ => await response.json,
79+
_ => await response.jsonBody,
8080
};
8181
_rawHeaders = response.responseHeaders;
8282

packages/dynamite/dynamite_runtime/lib/src/http_extensions.dart

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,18 @@ import 'dart:convert';
33
import 'dart:typed_data';
44

55
import 'package:universal_io/io.dart';
6+
import 'package:xml/xml.dart';
7+
import 'package:xml/xml_events.dart';
68

79
/// A stream of bytes.
810
///
911
/// Usually a `Stream<Uint8List>`.
1012
typedef BytesStream = Stream<List<int>>;
1113

12-
final _utf8JsonDecoder = utf8.decoder.fuse(json.decoder);
14+
final _xmlConverter =
15+
utf8.decoder.fuse(XmlEventDecoder()).fuse(const XmlNormalizeEvents()).fuse(const XmlNodeDecoder());
16+
17+
final _jsonBytesConverter = utf8.decoder.fuse(json.decoder);
1318

1419
/// Extension on byte streams that enable efficient transformations.
1520
extension BytesStreamExtension on BytesStream {
@@ -26,7 +31,16 @@ extension BytesStreamExtension on BytesStream {
2631
Future<String> get string => transform(utf8.decoder).join();
2732

2833
/// Converts the stream into a JSON using the [utf8] encoding.
29-
Future<Object?> get json => transform(_utf8JsonDecoder).first;
34+
Future<Object?> get jsonBody => transform(_jsonBytesConverter).first;
35+
36+
/// Converts the stream into XML using the [utf8] encoding.
37+
Future<XmlElement> get xmlBody async {
38+
final element = await transform(_xmlConverter)
39+
.expand((final events) => events)
40+
.firstWhere((final element) => element is XmlElement);
41+
42+
return element as XmlElement;
43+
}
3044
}
3145

3246
/// Extension on a http responses.

packages/dynamite/dynamite_runtime/pubspec.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ environment:
88
dependencies:
99
built_collection: ^5.0.0
1010
built_value: ^8.0.1
11+
collection: ^1.0.0
1112
cookie_jar: ^4.0.7
1213
meta: ^1.0.0
1314
universal_io: ^2.0.0
15+
xml: ^6.0.0
1416

1517
dev_dependencies:
1618
build_runner: ^2.4.6

packages/nextcloud/lib/src/webdav/client.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import 'package:nextcloud/src/webdav/path_uri.dart';
88
import 'package:nextcloud/src/webdav/props.dart';
99
import 'package:nextcloud/src/webdav/webdav.dart';
1010
import 'package:universal_io/io.dart';
11-
import 'package:xml/xml.dart' as xml;
1211

1312
/// Base path used on the server
1413
final webdavBase = PathUri.parse('/remote.php/webdav');
@@ -74,7 +73,7 @@ class WebDavClient {
7473
}
7574

7675
Future<WebDavMultistatus> _parseResponse(final HttpClientResponse response) async =>
77-
WebDavMultistatus.fromXmlElement(xml.XmlDocument.parse(await response.string).rootElement);
76+
WebDavMultistatus.fromXmlElement(await response.xmlBody);
7877

7978
Map<String, String> _getUploadHeaders({
8079
required final DateTime? lastModified,

0 commit comments

Comments
 (0)