mirror of
https://github.com/coder/coder.git
synced 2025-07-09 11:45:56 +00:00
fix: fix app hostname returning port number (#5441)
This commit is contained in:
@ -61,6 +61,7 @@ type Options struct {
|
||||
AccessURL *url.URL
|
||||
// AppHostname should be the wildcard hostname to use for workspace
|
||||
// applications INCLUDING the asterisk, (optional) suffix and leading dot.
|
||||
// It will use the same scheme and port number as the access URL.
|
||||
// E.g. "*.apps.coder.com" or "*-apps.coder.com".
|
||||
AppHostname string
|
||||
// AppHostnameRegex contains the regex version of options.AppHostname as
|
||||
|
@ -78,6 +78,10 @@ import (
|
||||
)
|
||||
|
||||
type Options struct {
|
||||
// AccessURL denotes a custom access URL. By default we use the httptest
|
||||
// server's URL. Setting this may result in unexpected behavior (especially
|
||||
// with running agents).
|
||||
AccessURL *url.URL
|
||||
AppHostname string
|
||||
AWSCertificates awsidentity.Certificates
|
||||
Authorizer rbac.Authorizer
|
||||
@ -144,7 +148,7 @@ func newWithCloser(t *testing.T, options *Options) (*codersdk.Client, io.Closer)
|
||||
return client, closer
|
||||
}
|
||||
|
||||
func NewOptions(t *testing.T, options *Options) (func(http.Handler), context.CancelFunc, *coderd.Options) {
|
||||
func NewOptions(t *testing.T, options *Options) (func(http.Handler), context.CancelFunc, *url.URL, *coderd.Options) {
|
||||
if options == nil {
|
||||
options = &Options{}
|
||||
}
|
||||
@ -214,6 +218,11 @@ func NewOptions(t *testing.T, options *Options) (func(http.Handler), context.Can
|
||||
derpPort, err := strconv.Atoi(serverURL.Port())
|
||||
require.NoError(t, err)
|
||||
|
||||
accessURL := options.AccessURL
|
||||
if accessURL == nil {
|
||||
accessURL = serverURL
|
||||
}
|
||||
|
||||
stunAddr, stunCleanup := stuntest.ServeWithPacketListener(t, nettype.Std{})
|
||||
t.Cleanup(stunCleanup)
|
||||
|
||||
@ -236,12 +245,12 @@ func NewOptions(t *testing.T, options *Options) (func(http.Handler), context.Can
|
||||
mutex.Lock()
|
||||
defer mutex.Unlock()
|
||||
handler = h
|
||||
}, cancelFunc, &coderd.Options{
|
||||
}, cancelFunc, serverURL, &coderd.Options{
|
||||
AgentConnectionUpdateFrequency: 150 * time.Millisecond,
|
||||
// Force a long disconnection timeout to ensure
|
||||
// agents are not marked as disconnected during slow tests.
|
||||
AgentInactiveDisconnectTimeout: testutil.WaitShort,
|
||||
AccessURL: serverURL,
|
||||
AccessURL: accessURL,
|
||||
AppHostname: options.AppHostname,
|
||||
AppHostnameRegex: appHostnameRegex,
|
||||
Logger: slogtest.Make(t, nil).Leveled(slog.LevelDebug),
|
||||
@ -298,7 +307,7 @@ func NewWithAPI(t *testing.T, options *Options) (*codersdk.Client, io.Closer, *c
|
||||
if options == nil {
|
||||
options = &Options{}
|
||||
}
|
||||
setHandler, cancelFunc, newOptions := NewOptions(t, options)
|
||||
setHandler, cancelFunc, serverURL, newOptions := NewOptions(t, options)
|
||||
// We set the handler after server creation for the access URL.
|
||||
coderAPI := coderd.New(newOptions)
|
||||
setHandler(coderAPI.RootHandler)
|
||||
@ -306,7 +315,7 @@ func NewWithAPI(t *testing.T, options *Options) (*codersdk.Client, io.Closer, *c
|
||||
if options.IncludeProvisionerDaemon {
|
||||
provisionerCloser = NewProvisionerDaemon(t, coderAPI)
|
||||
}
|
||||
client := codersdk.New(coderAPI.AccessURL)
|
||||
client := codersdk.New(serverURL)
|
||||
t.Cleanup(func() {
|
||||
cancelFunc()
|
||||
_ = provisionerCloser.Close()
|
||||
|
@ -58,7 +58,7 @@ var nonCanonicalHeaders = map[string]string{
|
||||
|
||||
func (api *API) appHost(rw http.ResponseWriter, r *http.Request) {
|
||||
host := api.AppHostname
|
||||
if api.AccessURL.Port() != "" {
|
||||
if host != "" && api.AccessURL.Port() != "" {
|
||||
host += fmt.Sprintf(":%s", api.AccessURL.Port())
|
||||
}
|
||||
|
||||
|
@ -47,17 +47,48 @@ const (
|
||||
func TestGetAppHost(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
cases := []string{"", proxyTestSubdomainRaw}
|
||||
cases := []struct {
|
||||
name string
|
||||
accessURL string
|
||||
appHostname string
|
||||
expected string
|
||||
}{
|
||||
{
|
||||
name: "OK",
|
||||
accessURL: "https://test.coder.com",
|
||||
appHostname: "*.test.coder.com",
|
||||
expected: "*.test.coder.com",
|
||||
},
|
||||
{
|
||||
name: "None",
|
||||
accessURL: "https://test.coder.com",
|
||||
appHostname: "",
|
||||
expected: "",
|
||||
},
|
||||
{
|
||||
name: "OKWithPort",
|
||||
accessURL: "https://test.coder.com:8443",
|
||||
appHostname: "*.test.coder.com",
|
||||
expected: "*.test.coder.com:8443",
|
||||
},
|
||||
{
|
||||
name: "OKWithSuffix",
|
||||
accessURL: "https://test.coder.com:8443",
|
||||
appHostname: "*--suffix.test.coder.com",
|
||||
expected: "*--suffix.test.coder.com:8443",
|
||||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
c := c
|
||||
name := c
|
||||
if name == "" {
|
||||
name = "Empty"
|
||||
}
|
||||
t.Run(name, func(t *testing.T) {
|
||||
t.Run(c.name, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
accessURL, err := url.Parse(c.accessURL)
|
||||
require.NoError(t, err)
|
||||
|
||||
client := coderdtest.New(t, &coderdtest.Options{
|
||||
AppHostname: c,
|
||||
AccessURL: accessURL,
|
||||
AppHostname: c.appHostname,
|
||||
})
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
|
||||
@ -71,8 +102,7 @@ func TestGetAppHost(t *testing.T) {
|
||||
_ = coderdtest.CreateFirstUser(t, client)
|
||||
host, err = client.GetAppHost(ctx)
|
||||
require.NoError(t, err)
|
||||
domain := strings.Split(host.Host, ":")[0]
|
||||
require.Equal(t, c, domain)
|
||||
require.Equal(t, c.expected, host.Host)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user