From d538b71ad0f2a0c36336a50208eaed86229e9af7 Mon Sep 17 00:00:00 2001 From: Nikolas Rimikis Date: Sun, 10 Mar 2024 19:48:24 +0100 Subject: [PATCH] refactor(neon_framework): use http_parser for http date parsing Signed-off-by: Nikolas Rimikis --- .../neon_framework/lib/src/utils/request_manager.dart | 8 ++------ packages/neon_framework/pubspec.yaml | 1 + packages/neon_framework/test/request_manager_test.dart | 5 +++-- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/neon_framework/lib/src/utils/request_manager.dart b/packages/neon_framework/lib/src/utils/request_manager.dart index ebc34ef83d5..d3b01195192 100644 --- a/packages/neon_framework/lib/src/utils/request_manager.dart +++ b/packages/neon_framework/lib/src/utils/request_manager.dart @@ -5,7 +5,7 @@ import 'package:built_value/serializer.dart'; import 'package:dynamite_runtime/http_client.dart'; import 'package:flutter/foundation.dart'; import 'package:http/http.dart' as http; -import 'package:intl/intl.dart'; +import 'package:http_parser/http_parser.dart'; import 'package:logging/logging.dart'; import 'package:meta/meta.dart'; import 'package:neon_framework/models.dart'; @@ -44,10 +44,6 @@ const kMaxTries = 3; /// Requests that take longer than this duration will be canceled. const kDefaultTimeout = Duration(seconds: 30); -/// Implements https://www.rfc-editor.org/rfc/rfc9110#name-date-time-formats -@visibleForTesting -final httpDateFormat = DateFormat('E, d MMM yyyy HH:mm:ss v', 'en_US'); - /// A singleton class that handles requests to the Nextcloud API. /// /// Requests need to be made through the [nextcloud](https://pub.dev/packages/nextcloud) @@ -369,7 +365,7 @@ class CacheParameters { /// Parse the cache parameters from HTTP response headers. factory CacheParameters.parseHeaders(Map headers) { - final expiry = headers.containsKey('expires') ? httpDateFormat.parse(headers['expires']! as String) : null; + final expiry = headers.containsKey('expires') ? parseHttpDate(headers['expires']! as String) : null; return CacheParameters( etag: headers['etag'] as String?, expires: _isExpired(expiry) ? null : expiry, diff --git a/packages/neon_framework/pubspec.yaml b/packages/neon_framework/pubspec.yaml index 7df3be7fc9d..2de7559d045 100644 --- a/packages/neon_framework/pubspec.yaml +++ b/packages/neon_framework/pubspec.yaml @@ -31,6 +31,7 @@ dependencies: flutter_zxing: ^1.0.0 go_router: ^13.0.0 http: ^1.0.0 + http_parser: ^4.0.0 image: ^4.0.0 intersperse: ^2.0.0 intl: ^0.18.0 diff --git a/packages/neon_framework/test/request_manager_test.dart b/packages/neon_framework/test/request_manager_test.dart index 6f2368961fc..2f350c66aed 100644 --- a/packages/neon_framework/test/request_manager_test.dart +++ b/packages/neon_framework/test/request_manager_test.dart @@ -8,6 +8,7 @@ import 'package:built_value/serializer.dart'; import 'package:dynamite_runtime/http_client.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:http/http.dart'; +import 'package:http_parser/http_parser.dart'; import 'package:mocktail/mocktail.dart'; import 'package:neon_framework/src/bloc/result.dart'; import 'package:neon_framework/src/utils/request_manager.dart'; @@ -681,7 +682,7 @@ void main() { test('cache ETag and Expires', () async { for (final (hours, isSet) in [(1, true), (-1, false)]) { - var newExpires = DateTime.now().add(Duration(hours: hours)); + var newExpires = DateTime.timestamp().add(Duration(hours: hours)); // Only precise to the second is allowed. newExpires = newExpires.subtract( Duration( @@ -713,7 +714,7 @@ void main() { headers: {}, rawHeaders: { 'etag': 'a', - 'expires': httpDateFormat.format(newExpires), + 'expires': formatHttpDate(newExpires), }, ), unwrap: (rawResponse) => rawResponse.body,