Fix invalid token on upload

pull/4867/head
Chocobozzz 2022-03-16 14:16:23 +01:00
parent f9915efa5e
commit 8366491890
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
1 changed files with 43 additions and 24 deletions

View File

@ -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)
}
}
}
}
}