dio icon indicating copy to clipboard operation
dio copied to clipboard

[http2_adapter] Unhandled Exception: DioError [DioErrorType.response]: Http status error [301]

Open feicien opened this issue 3 years ago • 0 comments

Issue Info

Info Value
Platform Name dart
Platform Version 2.17.6
Dio Version 4.0.6
dio_http2_adapter Version 2.0.0
Android Studio Android Studio (version 2021.2)
Repro rate all the time (100%)

官方提供的 http2_adapter demo,我这边运行报错:

import 'package:dio/dio.dart';
import 'package:dio_http2_adapter/dio_http2_adapter.dart';

void main() async {
  var dio = Dio()
    ..options.baseUrl = 'https://google.com'
    ..interceptors.add(LogInterceptor())
    ..httpClientAdapter = Http2Adapter(
      ConnectionManager(
        idleTimeout: 10000,
        // Ignore bad certificate
        onClientCreate: (_, config) => config.onBadCertificate = (_) => true,
      ),
    );

  Response<String> response;

  response = await dio.get('/?xx=6');
  print(response.data?.length);
  print(response.redirects.length);
  print(response.data);
}

控制台日志如下:

/Users/feicien/flutter/bin/cache/dart-sdk/bin/dart --enable-asserts /Users/feicien/GitHub/dio/plugins/http2_adapter/example/example.dart
*** Request ***
uri: https://google.com/?xx=6
method: GET
responseType: ResponseType.plain
followRedirects: true
connectTimeout: 0
sendTimeout: 0
receiveTimeout: 0
receiveDataWhenStatusError: true
extra: {}
headers:

*** DioError ***:
uri: https://google.com/?xx=6
DioError [DioErrorType.response]: Http status error [301]
uri: https://google.com/?xx=6
statusCode: 301
headers:
 location: https://www.google.com/?xx=6
 content-type: text/html; charset=UTF-8
 date: Mon, 29 Aug 2022 07:43:02 GMT
 expires: Wed, 28 Sep 2022 07:43:02 GMT
 cache-control: public, max-age=2592000
 server: gws
 content-length: 225
 x-xss-protection: 0
 x-frame-options: SAMEORIGIN
 alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"


Unhandled exception:
DioError [DioErrorType.response]: Http status error [301]
Source stack:
#0      DioMixin.fetch (package:dio/src/dio_mixin.dart:488:35)
#1      DioMixin.request (package:dio/src/dio_mixin.dart:483:12)
#2      DioMixin.get (package:dio/src/dio_mixin.dart:61:12)
#3      main (file:///Users/feicien/GitHub/dio/plugins/http2_adapter/example/example.dart:18:24)
#4      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:297:19)
#5      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)

#0      DioMixin.fetch.<anonymous closure> (package:dio/src/dio_mixin.dart:643:7)
#1      _RootZone.runBinary (dart:async/zone.dart:1690:54)
#2      _FutureListener.handleError (dart:async/future_impl.dart:162:22)
#3      Future._propagateToListeners.handleError (dart:async/future_impl.dart:778:47)
#4      Future._propagateToListeners (dart:async/future_impl.dart:799:13)
#5      Future._completeError (dart:async/future_impl.dart:574:5)
#6      _SyncCompleter._completeError (dart:async/future_impl.dart:51:12)
#7      _Completer.completeError (dart:async/future_impl.dart:23:5)
#8      Future.any.onError (dart:async/future.dart:616:45)
#9      _RootZone.runBinary (dart:async/zone.dart:1690:54)
#10     _FutureListener.handleError (dart:async/future_impl.dart:162:22)
#11     Future._propagateToListeners.handleError (dart:async/future_impl.dart:778:47)
#12     Future._propagateToListeners (dart:async/future_impl.dart:799:13)
#13     Future._completeError (dart:async/future_impl.dart:574:5)
#14     Future._asyncCompleteError.<anonymous closure> (dart:async/future_impl.dart:665:7)
#15     _microtaskLoop (dart:async/schedule_microtask.dart:40:21)
#16     _startMicrotaskLoop (dart:async/schedule_microtask.dart:49:5)
#17     _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:122:13)
#18     _Timer._runTimers (dart:isolate-patch/timer_impl.dart:405:11)
#19     _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:429:5)
#20     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)

Process finished with exit code 255

debug 发现,问题出在 Http2Adapter 类中的 109 行代码:

needRedirect = list != null && _needRedirect(options, statusCode);

这时 statusCode = 301 但是 list 为 null,所有没有走后面重定位逻辑。

feicien avatar Aug 29 '22 07:08 feicien