mirror of https://github.com/go-gitea/gitea.git
repo: archive: make GET endpoint synchronous again
If the request isn't complete, this endpoint will now submit the request and wait for completion using the new API. This may still be susceptible to timeouts for larger repos, but other endpoints now exist that the web interface will use to negotiate its way through larger archive processes.
This commit is contained in:
parent
d134c3f3ce
commit
ee6f508799
|
@ -480,23 +480,19 @@ func Download(ctx *context.Context) {
|
||||||
aReq := archiver_service.DeriveRequestFrom(ctx, uri)
|
aReq := archiver_service.DeriveRequestFrom(ctx, uri)
|
||||||
|
|
||||||
downloadName := ctx.Repo.Repository.Name + "-" + aReq.GetArchiveName()
|
downloadName := ctx.Repo.Repository.Name + "-" + aReq.GetArchiveName()
|
||||||
|
if !aReq.IsComplete() {
|
||||||
|
aReq = archiver_service.ArchiveRepository(aReq)
|
||||||
|
archiver_service.LockQueue()
|
||||||
|
for !aReq.IsComplete() {
|
||||||
|
archiver_service.WaitForCompletion()
|
||||||
|
}
|
||||||
|
archiver_service.UnlockQueue()
|
||||||
|
}
|
||||||
|
|
||||||
if aReq.IsComplete() {
|
if aReq.IsComplete() {
|
||||||
ctx.ServeFile(aReq.GetArchivePath(), downloadName)
|
ctx.ServeFile(aReq.GetArchivePath(), downloadName)
|
||||||
} else {
|
} else {
|
||||||
// We'll wait up to two seconds for the request to be satisfied, before we just return
|
ctx.Error(404)
|
||||||
// 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.")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -513,7 +509,7 @@ func InitiateDownload(ctx *context.Context) {
|
||||||
|
|
||||||
complete := aReq.IsComplete()
|
complete := aReq.IsComplete()
|
||||||
if !complete {
|
if !complete {
|
||||||
archiver_service.ArchiveRepository(aReq)
|
aReq = archiver_service.ArchiveRepository(aReq)
|
||||||
// As with the standard Download, we'll wait up to two seconds for the request
|
// 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
|
// 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
|
// request, only indicate the current status. If we did manage to complete the request
|
||||||
|
|
Loading…
Reference in New Issue