Skip to content

Since cookie_manager 2.1.1 there is a empty cookie header attached #1730

Closed
@bobekos

Description

@bobekos

Package

dio

Version

5.0.0

Output of flutter doctor -v

[✓] Flutter (Channel stable, 3.7.6, on macOS 12.5.1 21G83 darwin-x64, locale de-DE)
    • Flutter version 3.7.6 on channel stable at /Users/...
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 12cb4eb7a0 (9 days ago), 2023-03-01 10:29:26 -0800
    • Engine revision ada363ee93
    • Dart version 2.19.3
    • DevTools version 2.20.1

[✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0-rc1)
    • Android SDK at /Users/...
    • Platform android-33, build-tools 34.0.0-rc1
    • ANDROID_HOME = /Users/...
    • Java binary at: /Users/...
    • Java version OpenJDK Runtime Environment (build 17.0.5+0-17.0.5b653.25-9484017)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 14.2)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Build 14C18
    • CocoaPods version 1.11.3

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[!] Android Studio
    • Android Studio at /Users/...
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    ✗ Unable to find bundled Java version.
    • Try updating or re-installing Android Studio.

[✓] Android Studio
    • Android Studio at /Users/...
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 17.0.5+0-17.0.5b653.25-9484017)

[!] Android Studio
    • Android Studio at /Users/...
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    ✗ Unable to find bundled Java version.
    • Try updating or re-installing Android Studio.

[✓] IntelliJ IDEA Community Edition (version 2020.2.2)
    • IntelliJ at /Users/...
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart

[✓] VS Code (version 1.70.2)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension can be installed from:
      🔨 https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter

[✓] Connected device (3 available)
    • SM X200 (mobile) • R9YRC0DVQTK • android-arm64  • Android 13 (API 33)
    • macOS (desktop)  • macos       • darwin-x64     • macOS 12.5.1 21G83 darwin-x64
    • Chrome (web)     • chrome      • web-javascript • Google Chrome 111.0.5563.64

[✓] HTTP Host Availability
    • All required HTTP hosts are available

! Doctor found issues in 2 categories.

Dart Version

2.19.3

Steps to Reproduce

Create default dio instance and attach a cookiemanager to it:

final dio = Dio();
dio.interceptors.add(CookieManager(CookieJar()));

//now just request a default response
final response = await dio.get('http://clients3.google.com/generate_204');

In the response you will see there is a empty cookie header attached:

*** Request ***
uri: http://clients3.google.com/generate_204
method: GET
responseType: ResponseType.json
followRedirects: true
persistentConnection: true
connectTimeout: null
sendTimeout: null
receiveTimeout: null
receiveDataWhenStatusError: true
extra: {}
headers:
 cookie: 
data:
null

Now imagine we have some interceptor to catch invalid session token (renew them) and then just proceed with the original request. But we can't because dio.fetch throws -> HttpException: Failed to parse header value []:

final dio = Dio();
dio.interceptors.add(CookieManager(CookieJar()));

//now just request a default response
final success = await dio.get('http://clients3.google.com/generate_204');

//fetch the request again:
final failed = await dio.fetch(response.requestOptions);

/*
*** DioError ***:
uri: http://clients3.google.com/generate_204
DioError [unknown]: null
Error: HttpException: Failed to parse header value []

package:dio/src/dio_mixin.dart 530:7     DioMixin.fetch.<fn>
===== asynchronous gap ===========================
dart:async                               Future.catchError
package:dio/src/dio_mixin.dart 523:8     DioMixin.fetch
test/main/api_provider_test.dart 146:33  main.<fn>
===== asynchronous gap ===========================
dart:async                               _CustomZone.registerUnaryCallback
test/main/api_provider_test.dart 145:22  main.<fn>

DioError [unknown]: null
Error: HttpException: Failed to parse header value []

*/

Expected Result

The response should be success on both methods.

Actual Result

We got an exception because the cookie header can't be parsed. In Dio Versions < 5.0.0 there are no problems with that.

Stacktrack:

*** DioError ***:
uri: http://clients3.google.com/generate_204
DioError [unknown]: null
Error: HttpException: Failed to parse header value []

package:dio/src/dio_mixin.dart 530:7     DioMixin.fetch.<fn>
===== asynchronous gap ===========================
dart:async                               Future.catchError
package:dio/src/dio_mixin.dart 523:8     DioMixin.fetch
test/main/api_provider_test.dart 146:33  main.<fn>
===== asynchronous gap ===========================
dart:async                               _CustomZone.registerUnaryCallback
test/main/api_provider_test.dart 145:22  main.<fn>

DioError [unknown]: null
Error: HttpException: Failed to parse header value []
#0      _Cookie._parseSetCookieValue (dart:_http/http_headers.dart:1054:7)
#1      new _Cookie.fromSetCookieValue (dart:_http/http_headers.dart:982:5)
#2      new Cookie.fromSetCookieValue (dart:_http:795:20)
#3      CookieManager.onRequest.<anonymous closure>.<anonymous closure> (package:dio_cookie_manager/src/cookie_mgr.dart:42:32)
#4      MappedListIterable.elementAt (dart:_internal/iterable.dart:415:31)
#5      ListIterator.moveNext (dart:_internal/iterable.dart:344:26)
#6      CookieManager.onRequest.<anonymous closure> (package:dio_cookie_manager/src/cookie_mgr.dart:40:28)
#7      StackZoneSpecification._registerUnaryCallback.<anonymous closure>.<anonymous closure> (package:stack_trace/src/stack_zone_specification.dart:124:36)
#8      StackZoneSpecification._run (package:stack_trace/src/stack_zone_specification.dart:204:15)
#9      StackZoneSpecification._registerUnaryCallback.<anonymous closure> (package:stack_trace/src/stack_zone_specification.dart:124:24)
#10     _rootRunUnary (dart:async/zone.dart:1406:47)
#11     _CustomZone.runUnary (dart:async/zone.dart:1307:19)
<asynchronous suspension>

Metadata

Metadata

Assignees

No one assigned

    Labels

    b: regressionWorked before but not nowfixedp: cookie_managerTargeting `cookie_manager` packages: bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions