mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	Make repository response support HTTP range request (#24592)
Replace #20480 Replace #18448 Close #16414
This commit is contained in:
		
							
								
								
									
										43
									
								
								routers/common/serve.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								routers/common/serve.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| // Copyright 2021 The Gitea Authors. All rights reserved. | ||||
| // SPDX-License-Identifier: MIT | ||||
|  | ||||
| package common | ||||
|  | ||||
| import ( | ||||
| 	"io" | ||||
| 	"time" | ||||
|  | ||||
| 	"code.gitea.io/gitea/modules/context" | ||||
| 	"code.gitea.io/gitea/modules/git" | ||||
| 	"code.gitea.io/gitea/modules/httpcache" | ||||
| 	"code.gitea.io/gitea/modules/httplib" | ||||
| 	"code.gitea.io/gitea/modules/log" | ||||
| ) | ||||
|  | ||||
| // ServeBlob download a git.Blob | ||||
| func ServeBlob(ctx *context.Context, blob *git.Blob, lastModified time.Time) error { | ||||
| 	if httpcache.HandleGenericETagTimeCache(ctx.Req, ctx.Resp, `"`+blob.ID.String()+`"`, lastModified) { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	dataRc, err := blob.DataAsync() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer func() { | ||||
| 		if err = dataRc.Close(); err != nil { | ||||
| 			log.Error("ServeBlob: Close: %v", err) | ||||
| 		} | ||||
| 	}() | ||||
|  | ||||
| 	httplib.ServeContentByReader(ctx.Req, ctx.Resp, ctx.Repo.TreePath, blob.Size(), dataRc) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func ServeContentByReader(ctx *context.Context, filePath string, size int64, reader io.Reader) { | ||||
| 	httplib.ServeContentByReader(ctx.Req, ctx.Resp, filePath, size, reader) | ||||
| } | ||||
|  | ||||
| func ServeContentByReadSeeker(ctx *context.Context, filePath string, modTime time.Time, reader io.ReadSeeker) { | ||||
| 	httplib.ServeContentByReadSeeker(ctx.Req, ctx.Resp, filePath, modTime, reader) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user