From 83664918901564830f3b7d1bd9879411a1b857a8 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Wed, 16 Mar 2022 14:16:23 +0100 Subject: Fix invalid token on upload --- .../video-add-components/video-upload.component.ts | 67 ++++++++++++++-------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/client/src/app/+videos/+video-edit/video-add-components/video-upload.component.ts b/client/src/app/+videos/+video-edit/video-add-components/video-upload.component.ts index c4438d777..ec858c8a8 100644 --- a/client/src/app/+videos/+video-edit/video-add-components/video-upload.component.ts +++ b/client/src/app/+videos/+video-edit/video-add-components/video-upload.component.ts @@ -50,10 +50,11 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy // So that it can be accessed in the template protected readonly BASE_VIDEO_UPLOAD_URL = VideoService.BASE_VIDEO_URL + '/upload-resumable' - private uploadxOptions: UploadxOptions private isUpdatingVideo = false private fileToUpload: File + private alreadyRefreshedToken = false + constructor ( protected formValidatorService: FormValidatorService, protected loadingBar: LoadingBarService, @@ -68,26 +69,6 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy private resumableUploadService: UploadxService ) { super() - - // FIXME: https://github.com/Chocobozzz/PeerTube/issues/4382#issuecomment-915854167 - const chunkSize = isIOS() - ? 0 - : undefined // Auto chunk size - - this.uploadxOptions = { - endpoint: this.BASE_VIDEO_UPLOAD_URL, - multiple: false, - token: this.authService.getAccessToken(), - uploaderClass: UploaderXFormData, - chunkSize, - retryConfig: { - maxAttempts: 30, // maximum attempts for 503 codes, otherwise set to 6, see below - maxDelay: 120_000, // 2 min - shouldRetry: (code: number, attempts: number) => { - return code === HttpStatusCode.SERVICE_UNAVAILABLE_503 || ((code < 400 || code > 500) && attempts < 6) - } - } - } } get videoExtensions () { @@ -135,6 +116,12 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy onUploadVideoOngoing (state: UploadState) { switch (state.status) { case 'error': { + if (!this.alreadyRefreshedToken && state.response.status === HttpStatusCode.UNAUTHORIZED_401) { + this.alreadyRefreshedToken = true + + return this.refereshTokenAndRetryUpload() + } + const error = state.response?.error || 'Unknow error' this.handleUploadError({ @@ -281,9 +268,9 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy } this.resumableUploadService.handleFiles(file, { - ...this.uploadxOptions, - metadata, - maxChunkSize: this.serverConfig.client.videos.resumableUpload.maxChunkSize + ...this.getUploadxOptions(), + + metadata }) this.isUploadingVideo = true @@ -378,4 +365,36 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy return name } + + private refereshTokenAndRetryUpload () { + this.authService.refreshAccessToken() + .subscribe(() => this.retryUpload()) + } + + private getUploadxOptions (): UploadxOptions { + // FIXME: https://github.com/Chocobozzz/PeerTube/issues/4382#issuecomment-915854167 + const chunkSize = isIOS() + ? 0 + : undefined // Auto chunk size + + return { + endpoint: this.BASE_VIDEO_UPLOAD_URL, + multiple: false, + + maxChunkSize: this.serverConfig.client.videos.resumableUpload.maxChunkSize, + chunkSize, + + token: this.authService.getAccessToken(), + + uploaderClass: UploaderXFormData, + + retryConfig: { + maxAttempts: 30, // maximum attempts for 503 codes, otherwise set to 6, see below + maxDelay: 120_000, // 2 min + shouldRetry: (code: number, attempts: number) => { + return code === HttpStatusCode.SERVICE_UNAVAILABLE_503 || ((code < 400 || code > 500) && attempts < 6) + } + } + } + } } -- cgit v1.2.3