repo: Download: restore some semblance of previous behavior
When archival was made async, the GET endpoint was only useful if a previous POST had initiated the download. This commit restores the previous behavior, to an extent; we'll now submit the archive request there and return a "202 Accepted" to indicate that it's processing if we didn't manage to complete the request within ~2 seconds of submission. This lets a client directly GET the archive, and gives them some indication that they may attempt to GET it again at a later time.
This commit is contained in:
parent
67d491ba7c
commit
c134aef340
1 changed files with 29 additions and 2 deletions
|
@ -9,6 +9,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"code.gitea.io/gitea/models"
|
"code.gitea.io/gitea/models"
|
||||||
"code.gitea.io/gitea/modules/auth"
|
"code.gitea.io/gitea/modules/auth"
|
||||||
|
@ -478,10 +479,24 @@ func Download(ctx *context.Context) {
|
||||||
uri := ctx.Params("*")
|
uri := ctx.Params("*")
|
||||||
aReq := archiver_service.DeriveRequestFrom(ctx, uri)
|
aReq := archiver_service.DeriveRequestFrom(ctx, uri)
|
||||||
|
|
||||||
|
downloadName := ctx.Repo.Repository.Name + "-" + aReq.GetArchiveName()
|
||||||
if aReq.IsComplete() {
|
if aReq.IsComplete() {
|
||||||
ctx.ServeFile(aReq.GetArchivePath(), ctx.Repo.Repository.Name+"-"+aReq.GetArchiveName())
|
ctx.ServeFile(aReq.GetArchivePath(), downloadName)
|
||||||
} else {
|
} else {
|
||||||
ctx.Error(404)
|
// We'll wait up to two seconds for the request to be satisfied, before we just return
|
||||||
|
// a 200 Accepted to indicate that we're processing.
|
||||||
|
archiver_service.ArchiveRepository(aReq)
|
||||||
|
timeout := time.Now().Add(2 * time.Second)
|
||||||
|
for {
|
||||||
|
if aReq.IsComplete() || time.Now().After(timeout) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if aReq.IsComplete() {
|
||||||
|
ctx.ServeFile(aReq.GetArchivePath(), downloadName)
|
||||||
|
} else {
|
||||||
|
ctx.Error(202, "Request accepted, processing archive.")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -499,6 +514,18 @@ func InitiateDownload(ctx *context.Context) {
|
||||||
complete := aReq.IsComplete()
|
complete := aReq.IsComplete()
|
||||||
if !complete {
|
if !complete {
|
||||||
archiver_service.ArchiveRepository(aReq)
|
archiver_service.ArchiveRepository(aReq)
|
||||||
|
// As with the standard Download, we'll wait up to two seconds for the request
|
||||||
|
// to be completed. The difference is that we'll never download the file from a POST
|
||||||
|
// request, only indicate the current status. If we did manage to complete the request
|
||||||
|
// in this timeframe, the download will proceed with no further overhead.
|
||||||
|
timeout := time.Now().Add(2 * time.Second)
|
||||||
|
for {
|
||||||
|
if aReq.IsComplete() || time.Now().After(timeout) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
complete = aReq.IsComplete()
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.JSON(200, map[string]interface{}{
|
ctx.JSON(200, map[string]interface{}{
|
||||||
|
|
Loading…
Reference in a new issue