补充实现细节

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

1
.gitignore vendored
View File

@@ -61,3 +61,4 @@ fabric.properties
*.vsix *.vsix
config-local.yaml config-local.yaml
gitea-pages

View File

@@ -1,3 +1,11 @@
fmt: fmt:
@(test -f "$(GOPATH)/bin/gofumpt" || go install mvdan.cc/gofumpt@latest) && \ @(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"` // 后端认证配置 Auth ConfigAuth `yaml:"auth"` // 后端认证配置
Cache ConfigCache `yaml:"cache"` // 缓存配置 Cache ConfigCache `yaml:"cache"` // 缓存配置
Storage string `yaml:"storage"` // 持久化配置
} }
type ConfigAuth struct { type ConfigAuth struct {
@@ -25,5 +23,6 @@ type ConfigAuth struct {
type ConfigCache struct { type ConfigCache struct {
ttl time.Duration `yaml:"ttl"` // 缓存时间 ttl time.Duration `yaml:"ttl"` // 缓存时间
length int `yaml:"length"` // 最大文件大小 singleSize int `yaml:"single_size"` // 单个文件最大大小
maxSize int `yaml:"max_size"` // 最大文件大小
} }

59
main.go
View File

@@ -1,4 +1,61 @@
package main 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 ( import (
"errors" "errors"
"fmt" "fmt"
"log/slog"
"os" "os"
"strings" "strings"
) )
@@ -41,6 +42,7 @@ func (p *PageDomain) ParseDomainMeta(domain, path, branch string) (*PageDomainCo
rel := &PageDomainContent{} rel := &PageDomainContent{}
if !strings.HasSuffix(domain, "."+p.baseDomain) { if !strings.HasSuffix(domain, "."+p.baseDomain) {
slog.Debug("Page Domain does not end with ."+p.baseDomain, "domain", domain)
return nil, os.ErrNotExist 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) { 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 err != nil {
if errors.Is(err, os.ErrNotExist) { if errors.Is(err, os.ErrNotExist) {
s.writeError(writer, err)
} else {
s.writeNotfoundError(writer, request.RequestURI) s.writeNotfoundError(writer, request.RequestURI)
} else {
s.writeError(writer, err)
} }
return return
} }
result, err := s.reader.Open(meta.Owner, meta.Repo, meta.CommitID, meta.Path) result, err := s.reader.Open(meta.Owner, meta.Repo, meta.CommitID, meta.Path)
if err != nil { if err != nil {
if errors.Is(err, os.ErrNotExist) { if errors.Is(err, os.ErrNotExist) {
s.writeError(writer, err)
} else {
s.writeNotfoundError(writer, request.RequestURI) s.writeNotfoundError(writer, request.RequestURI)
} else {
s.writeError(writer, err)
} }
return return
} }

View File

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