Skip to content

Commit 87a0335

Browse files
Bind port 443 for HTTPS (#156)
1 parent 723ed63 commit 87a0335

File tree

3 files changed

+40
-16
lines changed

3 files changed

+40
-16
lines changed

internal/container/start.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ func Start(ctx context.Context, rt runtime.Runtime, sink output.Sink, opts Start
124124
containerName := c.Name()
125125
env := append(resolvedEnv,
126126
"LOCALSTACK_AUTH_TOKEN="+token,
127-
"GATEWAY_LISTEN=:4566",
127+
"GATEWAY_LISTEN=:4566,:443",
128128
"MAIN_CONTAINER_NAME="+containerName,
129129
)
130130

@@ -424,7 +424,7 @@ func hasDuplicateContainerTypes(containers []config.ContainerConfig) bool {
424424
func servicePortRange() []runtime.PortMapping {
425425
const start = 4510
426426
const end = 4559
427-
var ports []runtime.PortMapping
427+
ports := []runtime.PortMapping{{ContainerPort: "443", HostPort: "443"}}
428428
for p := start; p <= end; p++ {
429429
ps := strconv.Itoa(p)
430430
ports = append(ports, runtime.PortMapping{ContainerPort: ps, HostPort: ps})

internal/container/start_test.go

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"context"
66
"errors"
77
"io"
8-
"strconv"
98
"testing"
109

1110
"github.com/localstack/lstk/internal/log"
@@ -54,18 +53,14 @@ func TestEmitPostStartPointers_WithoutWebApp(t *testing.T) {
5453
assert.Contains(t, got, "> Tip:")
5554
}
5655

57-
func TestServicePortRange_Returns50Entries(t *testing.T) {
56+
func TestServicePortRange_ReturnsExpectedPorts(t *testing.T) {
5857
ports := servicePortRange()
5958

60-
require.Len(t, ports, 50)
61-
assert.Equal(t, "4510", ports[0].ContainerPort)
62-
assert.Equal(t, "4510", ports[0].HostPort)
63-
assert.Equal(t, "4559", ports[49].ContainerPort)
64-
assert.Equal(t, "4559", ports[49].HostPort)
65-
66-
for i, p := range ports {
67-
expected := strconv.Itoa(4510 + i)
68-
assert.Equal(t, expected, p.ContainerPort)
69-
assert.Equal(t, expected, p.HostPort)
70-
}
59+
require.Len(t, ports, 51)
60+
assert.Equal(t, "443", ports[0].ContainerPort)
61+
assert.Equal(t, "443", ports[0].HostPort)
62+
assert.Equal(t, "4510", ports[1].ContainerPort)
63+
assert.Equal(t, "4510", ports[1].HostPort)
64+
assert.Equal(t, "4559", ports[50].ContainerPort)
65+
assert.Equal(t, "4559", ports[50].HostPort)
7166
}

test/integration/start_test.go

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package integration_test
22

33
import (
44
"context"
5+
"crypto/tls"
56
"fmt"
67
"net"
8+
"net/http"
79
"os"
810
"path/filepath"
911
"strconv"
@@ -158,7 +160,7 @@ func TestStartCommandSetsUpContainerCorrectly(t *testing.T) {
158160

159161
t.Run("environment variables", func(t *testing.T) {
160162
envVars := containerEnvToMap(inspect.Config.Env)
161-
assert.Equal(t, ":4566", envVars["GATEWAY_LISTEN"])
163+
assert.Equal(t, ":4566,:443", envVars["GATEWAY_LISTEN"])
162164
assert.Equal(t, containerName, envVars["MAIN_CONTAINER_NAME"])
163165
assert.NotEmpty(t, envVars["LOCALSTACK_AUTH_TOKEN"])
164166
})
@@ -191,10 +193,37 @@ func TestStartCommandSetsUpContainerCorrectly(t *testing.T) {
191193
assert.Equal(t, "4566", mainBindings[0].HostPort)
192194
})
193195

196+
t.Run("https port", func(t *testing.T) {
197+
httpsBindings := inspect.HostConfig.PortBindings[nat.Port("443/tcp")]
198+
require.NotEmpty(t, httpsBindings, "port 443/tcp should be bound")
199+
assert.Equal(t, "443", httpsBindings[0].HostPort)
200+
})
201+
194202
t.Run("volume mount", func(t *testing.T) {
195203
assert.True(t, hasBindTarget(inspect.HostConfig.Binds, "/var/lib/localstack"),
196204
"expected volume bind mount to /var/lib/localstack, got: %v", inspect.HostConfig.Binds)
197205
})
206+
207+
t.Run("http health endpoint", func(t *testing.T) {
208+
resp, err := http.Get("http://localhost.localstack.cloud:4566/_localstack/health")
209+
require.NoError(t, err)
210+
defer resp.Body.Close()
211+
assert.Equal(t, http.StatusOK, resp.StatusCode)
212+
})
213+
214+
t.Run("https health endpoint", func(t *testing.T) {
215+
// LS certificate is not in system trust store
216+
// But cert validity is out of scope here: use InsecureSkipVerify
217+
client := &http.Client{
218+
Transport: &http.Transport{
219+
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
220+
},
221+
}
222+
resp, err := client.Get("https://localhost.localstack.cloud/_localstack/health")
223+
require.NoError(t, err)
224+
defer resp.Body.Close()
225+
assert.Equal(t, http.StatusOK, resp.StatusCode)
226+
})
198227
}
199228

200229
// containerEnvToMap converts a Docker container's []string env to a map.

0 commit comments

Comments
 (0)