diff --git a/lib/http/init.dart b/lib/http/init.dart index 52bc80be9..d31b7b398 100644 --- a/lib/http/init.dart +++ b/lib/http/init.dart @@ -222,7 +222,7 @@ class Request { * post请求 */ Future post(url, - {data, queryParameters, options, cancelToken, extra}) async { + {data, queryParameters, options, cancelToken, isRedirect}) async { // debugPrint('post-data: $data'); Response response; try { @@ -236,6 +236,21 @@ class Request { // debugPrint('post success: ${response.data}'); return response; } on DioException catch (e) { + if (isRedirect != true && + const [301, 302, 303, 307, 308].contains(e.response?.statusCode)) { + String? redirectUrl = e.response?.headers['location']?.firstOrNull; + if (redirectUrl != null) { + return await post( + redirectUrl, + data: data, + queryParameters: queryParameters, + options: options, + cancelToken: cancelToken, + isRedirect: true, + ); + } + } + AccountManager.toast(e); Response errResponse = Response( data: { 'message': await AccountManager.dioError(e) diff --git a/lib/pages/video/detail/post_panel/post_panel.dart b/lib/pages/video/detail/post_panel/post_panel.dart index 0cf537246..6758e24a4 100644 --- a/lib/pages/video/detail/post_panel/post_panel.dart +++ b/lib/pages/video/detail/post_panel/post_panel.dart @@ -535,8 +535,7 @@ class _PostPanelState extends CommonCollapseSlidePageState { } void _onPost({String? url}) async { - Request() - .post( + Request().post( url ?? '${GStorage.blockServer}/api/skipSegments', data: { 'videoID': videoDetailController.bvid, @@ -558,10 +557,13 @@ class _PostPanelState extends CommonCollapseSlidePageState { .toList(), }, options: Options( - validateStatus: (status) => true, + validateStatus: (int? status) { + return status != null && + ((status >= 200 && status < 300) || + const [400, 403, 429, 409].contains(status)); + }, ), - ) - .then( + ).then( (res) { if (res.statusCode == 200) { Get.back(); @@ -574,15 +576,8 @@ class _PostPanelState extends CommonCollapseSlidePageState { videoDetailController.initSkip(); } } else { - if (const [301, 302, 303, 307, 308].contains(res.statusCode)) { - String? redirectUrl = res.headers['location']?.firstOrNull; - if (redirectUrl != null) { - _onPost(url: redirectUrl); - return; - } - } SmartDialog.showToast( - '提交失败: ${{ + '提交失败: ${const { 400: '参数错误', 403: '被自动审核机制拒绝', 429: '重复提交太快', diff --git a/lib/utils/accounts/account_manager/account_mgr.dart b/lib/utils/accounts/account_manager/account_mgr.dart index 4ba7061bc..298fdf5ac 100644 --- a/lib/utils/accounts/account_manager/account_mgr.dart +++ b/lib/utils/accounts/account_manager/account_mgr.dart @@ -170,7 +170,28 @@ class AccountManager extends Interceptor { } @override - void onError(DioException err, ErrorInterceptorHandler handler) { + void onError(DioException err, ErrorInterceptorHandler handler) async { + if (err.requestOptions.method != 'POST') { + toast(err); + } + if (err.response != null && + !err.response!.requestOptions.path.startsWith(HttpString.appBaseUrl)) { + _saveCookies(err.response!).then((_) => handler.next(err)).catchError( + (dynamic e, StackTrace s) { + final error = DioException( + requestOptions: err.response!.requestOptions, + error: e, + stackTrace: s, + ); + handler.next(error); + }, + ); + } else { + handler.next(err); + } + } + + static void toast(err) { const List skipShow = [ 'heartbeat', 'history/report', @@ -190,22 +211,6 @@ class AccountManager extends Interceptor { } else { dioError(err).then((res) => SmartDialog.showToast(res + url)); } - - if (err.response != null && - !err.response!.requestOptions.path.startsWith(HttpString.appBaseUrl)) { - _saveCookies(err.response!).then((_) => handler.next(err)).catchError( - (dynamic e, StackTrace s) { - final error = DioException( - requestOptions: err.response!.requestOptions, - error: e, - stackTrace: s, - ); - handler.next(error); - }, - ); - } else { - handler.next(err); - } } Future _saveCookies(Response response) async {