补充实现细节

This commit is contained in:
dragon
2025-01-07 17:30:47 +08:00
parent 0172dceaa8
commit b617127a8b
7 changed files with 80 additions and 12 deletions

3
.gitignore vendored
View File

@@ -60,4 +60,5 @@ fabric.properties
# Built Visual Studio Code Extensions
*.vsix
config-local.yaml
config-local.yaml
gitea-pages

View File

@@ -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

View File

@@ -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
View File

@@ -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)
}
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -27,6 +27,7 @@ type Cache interface {
var ErrCacheOutOfMemory = errors.New("内容无法被缓存,超过最大限定值")
// TODO: 优化锁结构
// 复杂场景请使用其他缓存服务
type CacheMemory struct {
l sync.RWMutex