2016-11-29 17:26:36 +01:00
// Copyright 2016 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
2021-08-24 11:47:09 -05:00
//go:build bindata
2016-11-29 17:26:36 +01:00
package public
import (
2020-12-24 12:25:17 +08:00
"bytes"
"io"
2020-11-13 20:51:07 +08:00
"net/http"
2020-12-24 12:25:17 +08:00
"os"
"path/filepath"
"time"
2022-01-07 10:33:17 +08:00
"code.gitea.io/gitea/modules/timeutil"
2016-11-29 17:26:36 +01:00
)
2022-01-10 04:32:37 -05:00
// GlobalModTime provide a global mod time for embedded asset files
2022-01-07 10:33:17 +08:00
func GlobalModTime ( filename string ) time . Time {
return timeutil . GetExecutableModTime ( )
}
2021-05-30 18:25:11 +08:00
func fileSystem ( dir string ) http . FileSystem {
return Assets
2016-11-29 17:26:36 +01:00
}
2020-02-01 23:17:44 -03:00
func Asset ( name string ) ( [ ] byte , error ) {
f , err := Assets . Open ( "/" + name )
if err != nil {
return nil , err
}
defer f . Close ( )
2021-09-22 13:38:34 +08:00
return io . ReadAll ( f )
2020-02-01 23:17:44 -03:00
}
func AssetNames ( ) [ ] string {
realFS := Assets . ( vfsgen۰ FS )
2022-01-20 18:46:10 +01:00
results := make ( [ ] string , 0 , len ( realFS ) )
2020-02-01 23:17:44 -03:00
for k := range realFS {
results = append ( results , k [ 1 : ] )
}
return results
}
func AssetIsDir ( name string ) ( bool , error ) {
if f , err := Assets . Open ( "/" + name ) ; err != nil {
return false , err
} else {
defer f . Close ( )
if fi , err := f . Stat ( ) ; err != nil {
return false , err
} else {
return fi . IsDir ( ) , nil
}
}
}
2020-12-24 12:25:17 +08:00
2021-05-30 18:25:11 +08:00
// serveContent serve http content
func serveContent ( w http . ResponseWriter , req * http . Request , fi os . FileInfo , modtime time . Time , content io . ReadSeeker ) {
2020-12-24 12:25:17 +08:00
encodings := parseAcceptEncoding ( req . Header . Get ( "Accept-Encoding" ) )
if encodings [ "gzip" ] {
if cf , ok := fi . ( * vfsgen۰ CompressedFileInfo ) ; ok {
2022-01-23 20:19:49 +08:00
rdGzip := bytes . NewReader ( cf . GzipBytes ( ) )
// all static files are managed by Gitea, so we can make sure every file has the correct ext name
// then we can get the correct Content-Type, we do not need to do http.DetectContentType on the decompressed data
mimeType := detectWellKnownMimeType ( filepath . Ext ( fi . Name ( ) ) )
if mimeType == "" {
mimeType = "application/octet-stream"
2020-12-24 12:25:17 +08:00
}
2022-01-23 20:19:49 +08:00
w . Header ( ) . Set ( "Content-Type" , mimeType )
w . Header ( ) . Set ( "Content-Encoding" , "gzip" )
http . ServeContent ( w , req , fi . Name ( ) , modtime , rdGzip )
2020-12-24 12:25:17 +08:00
return
}
}
http . ServeContent ( w , req , fi . Name ( ) , modtime , content )
return
}