mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Use standard HTTP library to serve files (#24693)
`http.ServeFile/ServeContent` handles `If-xxx`, `Content-Length`, `Range` and `Etag` correctly After this PR, storage files (eg: avatar) could be responded with correct Content-Length.
This commit is contained in:
		@@ -6,7 +6,6 @@ package web
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path"
 | 
			
		||||
@@ -76,12 +75,6 @@ func storageHandler(storageSetting setting.Storage, prefix string, objStore stor
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			fi, err := objStore.Stat(rPath)
 | 
			
		||||
			if err == nil && httpcache.HandleTimeCache(req, w, fi) {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// If we have matched and access to release or issue
 | 
			
		||||
			fr, err := objStore.Open(rPath)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				if os.IsNotExist(err) || errors.Is(err, os.ErrNotExist) {
 | 
			
		||||
					log.Warn("Unable to find %s %s", prefix, rPath)
 | 
			
		||||
@@ -92,14 +85,15 @@ func storageHandler(storageSetting setting.Storage, prefix string, objStore stor
 | 
			
		||||
				http.Error(w, fmt.Sprintf("Error whilst opening %s %s", prefix, rPath), http.StatusInternalServerError)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			defer fr.Close()
 | 
			
		||||
 | 
			
		||||
			_, err = io.Copy(w, fr)
 | 
			
		||||
			fr, err := objStore.Open(rPath)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				log.Error("Error whilst rendering %s %s. Error: %v", prefix, rPath, err)
 | 
			
		||||
				http.Error(w, fmt.Sprintf("Error whilst rendering %s %s", prefix, rPath), http.StatusInternalServerError)
 | 
			
		||||
				log.Error("Error whilst opening %s %s. Error: %v", prefix, rPath, err)
 | 
			
		||||
				http.Error(w, fmt.Sprintf("Error whilst opening %s %s", prefix, rPath), http.StatusInternalServerError)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			defer fr.Close()
 | 
			
		||||
			httpcache.ServeContentWithCacheControl(w, req, path.Base(rPath), fi.ModTime(), fr)
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,13 +5,13 @@ package misc
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/modules/git"
 | 
			
		||||
	"code.gitea.io/gitea/modules/httpcache"
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func SSHInfo(rw http.ResponseWriter, req *http.Request) {
 | 
			
		||||
@@ -34,11 +34,8 @@ func DummyOK(w http.ResponseWriter, req *http.Request) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RobotsTxt(w http.ResponseWriter, req *http.Request) {
 | 
			
		||||
	filePath := path.Join(setting.CustomPath, "robots.txt")
 | 
			
		||||
	fi, err := os.Stat(filePath)
 | 
			
		||||
	if err == nil && httpcache.HandleTimeCache(req, w, fi) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	filePath := util.FilePathJoinAbs(setting.CustomPath, "robots.txt")
 | 
			
		||||
	httpcache.SetCacheControlInHeader(w.Header(), setting.StaticCacheTime)
 | 
			
		||||
	http.ServeFile(w, req, filePath)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user