♻️ Refactored custom headers support into middleware
/ docker (push) Successful in 1m21s Details

This commit is contained in:
Maxim Lebedev 2024-01-27 13:47:23 +06:00
parent 7a0727aa8d
commit 715445ee5d
Signed by: toby3d
GPG Key ID: 1F14E25B7C119FC5
4 changed files with 90 additions and 35 deletions

View File

@ -77,23 +77,6 @@ func NewApp(logger *log.Logger, config *domain.Config) (*App, error) {
return
}
siteServer, err := serverer.Do(r.Context(), *s)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
for i := range siteServer.Headers {
if !siteServer.Headers[i].IsMatched(r.URL.Path) {
continue
}
for name, value := range siteServer.Headers[i].Values {
w.Header().Add(name, value)
}
}
if s.IsMultiLingual() {
head, tail := urlutil.ShiftPath(r.URL.Path)
if head == "" {
@ -132,22 +115,6 @@ func NewApp(logger *log.Logger, config *domain.Config) (*App, error) {
return
}
if siteServer, err = serverer.Do(r.Context(), *s); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
for i := range siteServer.Headers {
if !siteServer.Headers[i].IsMatched(r.URL.Path) {
continue
}
for name, value := range siteServer.Headers[i].Values {
w.Header().Add(name, value)
}
}
p, err := pager.Do(r.Context(), lang, r.URL.Path)
if err != nil {
if !errors.Is(err, page.ErrNotExist) {
@ -216,6 +183,10 @@ func NewApp(logger *log.Logger, config *domain.Config) (*App, error) {
Siter: siter,
Serverer: serverer,
}),
middleware.Header(middleware.HeaderConfig{
Siter: siter,
Serverer: serverer,
}),
}
return &App{server: &http.Server{

View File

@ -0,0 +1,17 @@
package domain
type Headers []Header
func (h Headers) Match(p string) []Header {
result := make(Headers, 0, len(h))
for i := range h {
if !h[i].IsMatched(p) {
continue
}
result = append(result, h[i])
}
return result
}

View File

@ -1,13 +1,13 @@
package domain
type Server struct {
Headers []Header
Headers Headers
Redirects Redirects
}
func NewServer() *Server {
return &Server{
Headers: make([]Header, 0),
Headers: make(Headers, 0),
Redirects: make(Redirects, 0),
}
}

View File

@ -0,0 +1,67 @@
package middleware
import (
"net/http"
"source.toby3d.me/toby3d/home/internal/domain"
"source.toby3d.me/toby3d/home/internal/server"
"source.toby3d.me/toby3d/home/internal/site"
"source.toby3d.me/toby3d/home/internal/urlutil"
)
type HeaderConfig struct {
Skipper Skipper
Siter site.UseCase
Serverer server.UseCase
}
func Header(config HeaderConfig) Interceptor {
if config.Skipper == nil {
config.Skipper = DefaultSkipper
}
if config.Siter == nil {
panic("middleware: header: Siter is nil")
}
if config.Serverer == nil {
panic("middleware: header: Serverer is nil")
}
return func(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
if config.Skipper(r) {
next(w, r)
return
}
lang, path := domain.LanguageUnd, r.URL.Path
if head, tail := urlutil.ShiftPath(r.URL.Path); head != "" {
if lang = domain.NewLanguage(head); lang != domain.LanguageUnd {
path = tail
}
}
site, err := config.Siter.Do(r.Context(), lang)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
server, err := config.Serverer.Do(r.Context(), *site)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
for _, header := range server.Headers.Match(path) {
for k, v := range header.Values {
w.Header().Add(k, v)
}
}
next(w, r)
}
}