补充实现细节
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -60,4 +60,5 @@ fabric.properties
|
||||
# Built Visual Studio Code Extensions
|
||||
*.vsix
|
||||
|
||||
config-local.yaml
|
||||
config-local.yaml
|
||||
gitea-pages
|
||||
10
Makefile
10
Makefile
@@ -1,3 +1,11 @@
|
||||
fmt:
|
||||
@(test -f "$(GOPATH)/bin/gofumpt" || go install mvdan.cc/gofumpt@latest) && \
|
||||
"$(GOPATH)/bin/gofumpt" -l -w .
|
||||
"$(GOPATH)/bin/gofumpt" -l -w .
|
||||
|
||||
gitea-pages: $(shell find . -type f -name "*.go" ) go.mod go.sum
|
||||
@CGO_ENABLED=0 go build -o $@ .
|
||||
|
||||
.PHONY: debug
|
||||
|
||||
debug: gitea-pages
|
||||
@./gitea-pages -conf config-local.yaml -debug
|
||||
@@ -12,8 +12,6 @@ type Config struct {
|
||||
Auth ConfigAuth `yaml:"auth"` // 后端认证配置
|
||||
|
||||
Cache ConfigCache `yaml:"cache"` // 缓存配置
|
||||
|
||||
Storage string `yaml:"storage"` // 持久化配置
|
||||
}
|
||||
|
||||
type ConfigAuth struct {
|
||||
@@ -24,6 +22,7 @@ type ConfigAuth struct {
|
||||
}
|
||||
|
||||
type ConfigCache struct {
|
||||
ttl time.Duration `yaml:"ttl"` // 缓存时间
|
||||
length int `yaml:"length"` // 最大文件大小
|
||||
ttl time.Duration `yaml:"ttl"` // 缓存时间
|
||||
singleSize int `yaml:"single_size"` // 单个文件最大大小
|
||||
maxSize int `yaml:"max_size"` // 最大文件大小
|
||||
}
|
||||
|
||||
59
main.go
59
main.go
@@ -1,4 +1,61 @@
|
||||
package main
|
||||
|
||||
func main() {
|
||||
import (
|
||||
"flag"
|
||||
"log"
|
||||
"log/slog"
|
||||
"net/http"
|
||||
"os"
|
||||
|
||||
"code.d7z.net/d7z-project/gitea-pages/pkg"
|
||||
"code.d7z.net/d7z-project/gitea-pages/pkg/providers"
|
||||
|
||||
"gopkg.in/yaml.v3"
|
||||
)
|
||||
|
||||
var (
|
||||
configPath = "config-local.yaml"
|
||||
debug = false
|
||||
config = &Config{}
|
||||
)
|
||||
|
||||
func init() {
|
||||
flag.StringVar(&configPath, "conf", configPath, "config file path")
|
||||
flag.BoolVar(&debug, "debug", debug, "debug mode")
|
||||
}
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
debugInject()
|
||||
loadConf()
|
||||
gitea, err := providers.NewGitea(config.Auth.Server, config.Auth.Token)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
server := pkg.NewPageServer(gitea, pkg.DefaultOptions(config.Domain))
|
||||
mux := http.NewServeMux()
|
||||
mux.Handle("/", server)
|
||||
defer server.Close()
|
||||
_ = http.ListenAndServe(config.Bind, mux)
|
||||
}
|
||||
|
||||
func debugInject() {
|
||||
programLevel := new(slog.LevelVar)
|
||||
programLevel.Set(slog.LevelDebug)
|
||||
if debug {
|
||||
h := slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: programLevel})
|
||||
slog.SetDefault(slog.New(h))
|
||||
}
|
||||
slog.Debug("debug mode")
|
||||
}
|
||||
|
||||
func loadConf() {
|
||||
file, err := os.ReadFile(configPath)
|
||||
if err != nil {
|
||||
log.Fatalf("read config file failed: %v", err)
|
||||
}
|
||||
err = yaml.Unmarshal(file, &config)
|
||||
if err != nil {
|
||||
log.Fatalf("parse config file failed: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package core
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
@@ -41,6 +42,7 @@ func (p *PageDomain) ParseDomainMeta(domain, path, branch string) (*PageDomainCo
|
||||
|
||||
rel := &PageDomainContent{}
|
||||
if !strings.HasSuffix(domain, "."+p.baseDomain) {
|
||||
slog.Debug("Page Domain does not end with ."+p.baseDomain, "domain", domain)
|
||||
return nil, os.ErrNotExist
|
||||
}
|
||||
|
||||
|
||||
@@ -57,21 +57,21 @@ func NewPageServer(backend core.Backend, options ServerOptions) *Server {
|
||||
}
|
||||
|
||||
func (s *Server) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
|
||||
meta, err := s.meta.ParseDomainMeta(request.Method, request.RequestURI, request.URL.Query().Get("branch"))
|
||||
meta, err := s.meta.ParseDomainMeta(request.Host, request.RequestURI, request.URL.Query().Get("branch"))
|
||||
if err != nil {
|
||||
if errors.Is(err, os.ErrNotExist) {
|
||||
s.writeError(writer, err)
|
||||
} else {
|
||||
s.writeNotfoundError(writer, request.RequestURI)
|
||||
} else {
|
||||
s.writeError(writer, err)
|
||||
}
|
||||
return
|
||||
}
|
||||
result, err := s.reader.Open(meta.Owner, meta.Repo, meta.CommitID, meta.Path)
|
||||
if err != nil {
|
||||
if errors.Is(err, os.ErrNotExist) {
|
||||
s.writeError(writer, err)
|
||||
} else {
|
||||
s.writeNotfoundError(writer, request.RequestURI)
|
||||
} else {
|
||||
s.writeError(writer, err)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ type Cache interface {
|
||||
var ErrCacheOutOfMemory = errors.New("内容无法被缓存,超过最大限定值")
|
||||
|
||||
// TODO: 优化锁结构
|
||||
// 复杂场景请使用其他缓存服务
|
||||
|
||||
type CacheMemory struct {
|
||||
l sync.RWMutex
|
||||
|
||||
Reference in New Issue
Block a user