Skip to content

Commit 67b04c9

Browse files
committed
Ignore ports for custom domain
1 parent 2f795e3 commit 67b04c9

File tree

3 files changed

+107
-8
lines changed

3 files changed

+107
-8
lines changed

internal/config/app_domain.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package config
22

33
type AppDomainConfig struct {
4-
Domain string `json:"domain" pageship:"required,max=200,hostname_port,lowercase"`
4+
Domain string `json:"domain" pageship:"required,max=200,hostname_rfc1123,lowercase"`
55
Site string `json:"site" pageship:"required,dnsLabel"`
66
}

internal/handler/site/handler.go

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func NewHandler(ctx context.Context, logger *zap.Logger, domainResolver domain.R
4848
middlewares: conf.Middlewares,
4949
}
5050

51-
cache, err := cache.NewCache(cacheSize, cacheTTL, h.doResolve)
51+
cache, err := cache.NewCache(cacheSize, cacheTTL, h.doResolveHandler)
5252
if err != nil {
5353
return nil, fmt.Errorf("setup cache: %w", err)
5454
}
@@ -57,13 +57,17 @@ func NewHandler(ctx context.Context, logger *zap.Logger, domainResolver domain.R
5757
return h, nil
5858
}
5959

60-
func (h *Handler) resolveSite(hostname string) (*SiteHandler, error) {
61-
return h.cache.Load(hostname)
60+
func (h *Handler) resolveHandler(host string) (*SiteHandler, error) {
61+
return h.cache.Load(host)
6262
}
6363

64-
func (h *Handler) doResolve(hostname string) (*SiteHandler, error) {
65-
matchedID, ok := h.hostPattern.MatchString(hostname)
64+
func (h *Handler) ResolveSite(host string) (*site.Descriptor, error) {
65+
matchedID, ok := h.hostPattern.MatchString(host)
6666
if !ok {
67+
hostname, _, err := net.SplitHostPort(host)
68+
if err != nil {
69+
hostname = host
70+
}
6771
id, err := h.domainResolver.Resolve(h.ctx, hostname)
6872
if errors.Is(err, domain.ErrDomainNotFound) {
6973
return nil, site.ErrSiteNotFound
@@ -78,6 +82,15 @@ func (h *Handler) doResolve(hostname string) (*SiteHandler, error) {
7882
return nil, err
7983
}
8084

85+
return desc, nil
86+
}
87+
88+
func (h *Handler) doResolveHandler(host string) (*SiteHandler, error) {
89+
desc, err := h.ResolveSite(host)
90+
if err != nil {
91+
return nil, err
92+
}
93+
8194
return NewSiteHandler(desc, h.middlewares), nil
8295
}
8396

@@ -89,7 +102,7 @@ func (h *Handler) CheckValidDomain(hostname string) error {
89102
if h.siteResolver.IsWildcard() {
90103
return nil
91104
}
92-
_, err := h.resolveSite(hostname)
105+
_, err := h.ResolveSite(hostname)
93106
return err
94107
}
95108

@@ -112,7 +125,7 @@ func (h *Handler) checkAuthz(r *http.Request, handler *SiteHandler) error {
112125
}
113126

114127
func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
115-
handler, err := h.resolveSite(r.Host)
128+
handler, err := h.resolveHandler(r.Host)
116129
if errors.Is(err, site.ErrSiteNotFound) {
117130
http.NotFound(w, r)
118131
return
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package site_test
2+
3+
import (
4+
"context"
5+
"errors"
6+
"testing"
7+
8+
"github.com/oursky/pageship/internal/domain"
9+
sitehandler "github.com/oursky/pageship/internal/handler/site"
10+
"github.com/oursky/pageship/internal/site"
11+
"github.com/stretchr/testify/assert"
12+
"go.uber.org/zap"
13+
)
14+
15+
type mockDomainResolver struct {
16+
domains map[string]string
17+
}
18+
19+
func (*mockDomainResolver) Kind() string { return "mock" }
20+
21+
func (r *mockDomainResolver) Resolve(ctx context.Context, hostname string) (string, error) {
22+
if id, ok := r.domains[hostname]; ok {
23+
return id, nil
24+
}
25+
return "", domain.ErrDomainNotFound
26+
}
27+
28+
type mockSiteResolver struct {
29+
wildcard bool
30+
sites map[string]string
31+
}
32+
33+
func (r *mockSiteResolver) IsWildcard() bool { return r.wildcard }
34+
35+
func (*mockSiteResolver) Kind() string { return "mock" }
36+
37+
func (r *mockSiteResolver) Resolve(ctx context.Context, matchedID string) (*site.Descriptor, error) {
38+
if id, ok := r.sites[matchedID]; ok {
39+
return &site.Descriptor{ID: id}, nil
40+
}
41+
return nil, site.ErrSiteNotFound
42+
}
43+
44+
func TestHandleResolution(t *testing.T) {
45+
hostPattern := "http://*.pageship.local"
46+
domainResolver := &mockDomainResolver{
47+
domains: map[string]string{
48+
"example.com": "example",
49+
"dev.example.com": "dev.example",
50+
},
51+
}
52+
siteResolver := &mockSiteResolver{
53+
sites: map[string]string{
54+
"example": "example/main",
55+
"dev.example": "example/dev",
56+
"test": "test/main",
57+
"dev.test": "test/dev",
58+
},
59+
}
60+
61+
handler, err := sitehandler.NewHandler(context.Background(), zap.NewNop(),
62+
domainResolver, siteResolver, sitehandler.HandlerConfig{HostPattern: hostPattern})
63+
assert.NoError(t, err)
64+
65+
resolve := func(host string) any {
66+
desc, err := handler.ResolveSite(host)
67+
if errors.Is(err, site.ErrSiteNotFound) {
68+
return nil
69+
} else if err != nil {
70+
panic(err)
71+
}
72+
return desc
73+
}
74+
75+
assert.Equal(t, resolve("example.com"), &site.Descriptor{ID: "example/main"})
76+
assert.Equal(t, resolve("example.com:8001"), &site.Descriptor{ID: "example/main"})
77+
assert.Equal(t, resolve("dev.example.com"), &site.Descriptor{ID: "example/dev"})
78+
assert.Equal(t, resolve("example.local"), nil)
79+
80+
assert.Equal(t, resolve("test.pageship.local"), &site.Descriptor{ID: "test/main"})
81+
assert.Equal(t, resolve("dev.test.pageship.local"), &site.Descriptor{ID: "test/dev"})
82+
assert.Equal(t, resolve("dev.test.pageship.local:8001"), &site.Descriptor{ID: "test/dev"})
83+
assert.Equal(t, resolve("staging.test.pageship.local"), nil)
84+
assert.Equal(t, resolve("pageship.local"), nil)
85+
assert.Equal(t, resolve("main.pageship.local"), nil)
86+
}

0 commit comments

Comments
 (0)