dio
dio copied to clipboard
[http2_adapter] Unhandled Exception: DioError [DioErrorType.response]: Http status error [301]
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,所有没有走后面重定位逻辑。