mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Make repository response support HTTP range request (#24592)
Replace #20480 Replace #18448 Close #16414
This commit is contained in:
		@@ -150,6 +150,7 @@ func GetRawFileOrLFS(ctx *context.APIContext) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// FIXME: code from #19689, what if the file is large ... OOM ...
 | 
			
		||||
	buf, err := io.ReadAll(dataRc)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		_ = dataRc.Close()
 | 
			
		||||
@@ -164,7 +165,7 @@ func GetRawFileOrLFS(ctx *context.APIContext) {
 | 
			
		||||
	// Check if the blob represents a pointer
 | 
			
		||||
	pointer, _ := lfs.ReadPointer(bytes.NewReader(buf))
 | 
			
		||||
 | 
			
		||||
	// if its not a pointer just serve the data directly
 | 
			
		||||
	// if it's not a pointer, just serve the data directly
 | 
			
		||||
	if !pointer.IsValid() {
 | 
			
		||||
		// First handle caching for the blob
 | 
			
		||||
		if httpcache.HandleGenericETagTimeCache(ctx.Req, ctx.Resp, `"`+blob.ID.String()+`"`, lastModified) {
 | 
			
		||||
@@ -172,25 +173,21 @@ func GetRawFileOrLFS(ctx *context.APIContext) {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// OK not cached - serve!
 | 
			
		||||
		if err := common.ServeData(ctx.Context, ctx.Repo.TreePath, blob.Size(), bytes.NewReader(buf)); err != nil {
 | 
			
		||||
			ctx.ServerError("ServeBlob", err)
 | 
			
		||||
		}
 | 
			
		||||
		common.ServeContentByReader(ctx.Context, ctx.Repo.TreePath, blob.Size(), bytes.NewReader(buf))
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Now check if there is a meta object for this pointer
 | 
			
		||||
	// Now check if there is a MetaObject for this pointer
 | 
			
		||||
	meta, err := git_model.GetLFSMetaObjectByOid(ctx, ctx.Repo.Repository.ID, pointer.Oid)
 | 
			
		||||
 | 
			
		||||
	// If there isn't one just serve the data directly
 | 
			
		||||
	// If there isn't one, just serve the data directly
 | 
			
		||||
	if err == git_model.ErrLFSObjectNotExist {
 | 
			
		||||
		// Handle caching for the blob SHA (not the LFS object OID)
 | 
			
		||||
		if httpcache.HandleGenericETagTimeCache(ctx.Req, ctx.Resp, `"`+blob.ID.String()+`"`, lastModified) {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if err := common.ServeData(ctx.Context, ctx.Repo.TreePath, blob.Size(), bytes.NewReader(buf)); err != nil {
 | 
			
		||||
			ctx.ServerError("ServeBlob", err)
 | 
			
		||||
		}
 | 
			
		||||
		common.ServeContentByReader(ctx.Context, ctx.Repo.TreePath, blob.Size(), bytes.NewReader(buf))
 | 
			
		||||
		return
 | 
			
		||||
	} else if err != nil {
 | 
			
		||||
		ctx.ServerError("GetLFSMetaObjectByOid", err)
 | 
			
		||||
@@ -218,9 +215,7 @@ func GetRawFileOrLFS(ctx *context.APIContext) {
 | 
			
		||||
	}
 | 
			
		||||
	defer lfsDataRc.Close()
 | 
			
		||||
 | 
			
		||||
	if err := common.ServeData(ctx.Context, ctx.Repo.TreePath, meta.Size, lfsDataRc); err != nil {
 | 
			
		||||
		ctx.ServerError("ServeData", err)
 | 
			
		||||
	}
 | 
			
		||||
	common.ServeContentByReadSeeker(ctx.Context, ctx.Repo.TreePath, lastModified, lfsDataRc)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getBlobForEntry(ctx *context.APIContext) (blob *git.Blob, entry *git.TreeEntry, lastModified time.Time) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user