Skip to content

Commit 08fb53f

Browse files
authored
feat: added run tls method (#53)
1 parent 5df6147 commit 08fb53f

File tree

5 files changed

+124
-7
lines changed

5 files changed

+124
-7
lines changed

Diff for: kid.go

+27-7
Original file line numberDiff line numberDiff line change
@@ -77,20 +77,29 @@ func New() *Kid {
7777
// Run runs HTTP server.
7878
//
7979
// Specifying an address is optional. Default address is :2376.
80-
func (k *Kid) Run(address ...string) error {
81-
addr := resolveAddress(address, runtime.GOOS)
80+
func (k *Kid) Run(addrs ...string) error {
81+
address := k.setUpServer(addrs)
8282

8383
k.printDebug(os.Stdout, "Kid version %s\n", Version)
84-
k.printDebug(os.Stdout, "Starting server at %s\n", addr)
84+
k.printDebug(os.Stdout, "Starting server at %s\n", address)
8585
k.printDebug(os.Stdout, "Quit the server with CONTROL-C\n")
8686

87-
k.mutex.Lock()
88-
k.server = &http.Server{Addr: addr, Handler: k}
89-
k.mutex.Unlock()
90-
9187
return k.server.ListenAndServe()
9288
}
9389

90+
// Run runs HTTPS server.
91+
//
92+
// Specifying an address is optional. Default address is :2376.
93+
func (k *Kid) RunTLS(certFile, keyFile string, addrs ...string) error {
94+
address := k.setUpServer(addrs)
95+
96+
k.printDebug(os.Stdout, "Kid version %s\n", Version)
97+
k.printDebug(os.Stdout, "Starting TLS server at %s\n", address)
98+
k.printDebug(os.Stdout, "Quit the server with CONTROL-C\n")
99+
100+
return k.server.ListenAndServeTLS(certFile, keyFile)
101+
}
102+
94103
// Shutdown gracefully shuts down the server without interrupting any active connections.
95104
func (k *Kid) Shutdown(ctx context.Context) error {
96105
k.mutex.Lock()
@@ -267,6 +276,17 @@ func (k *Kid) ApplyOptions(opts ...Option) {
267276
}
268277
}
269278

279+
// setupServer sets up the server.
280+
func (k *Kid) setUpServer(addrs []string) string {
281+
address := resolveAddress(addrs, runtime.GOOS)
282+
283+
k.mutex.Lock()
284+
defer k.mutex.Unlock()
285+
286+
k.server = &http.Server{Addr: address, Handler: k}
287+
return address
288+
}
289+
270290
// printDebug prints logs only in debug mode.
271291
func (k *Kid) printDebug(w io.Writer, format string, values ...any) {
272292
if k.Debug() {

Diff for: kid_test.go

+43
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package kid
33
import (
44
"bytes"
55
"context"
6+
"crypto/tls"
67
"fmt"
78
"io"
89
"net/http"
@@ -447,6 +448,39 @@ func TestKid_Run(t *testing.T) {
447448
assert.Equal(t, "{\"message\":\"healthy\"}\n", string(body))
448449
}
449450

451+
func TestKid_RunTLS(t *testing.T) {
452+
k := New()
453+
454+
k.Get("/", func(c *Context) {
455+
c.JSON(http.StatusOK, Map{"message": "healthy"})
456+
})
457+
458+
go func() {
459+
err := k.RunTLS("./testdata/certs/localhost.crt", "./testdata/certs/localhost.key", ":8686")
460+
assert.NoError(t, err)
461+
}()
462+
463+
// Wait for the server to start
464+
time.Sleep(5 * time.Millisecond)
465+
466+
client := &http.Client{
467+
Transport: &http.Transport{
468+
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
469+
},
470+
}
471+
472+
resp, err := client.Get("https://localhost:8686")
473+
assert.NoError(t, err)
474+
475+
defer resp.Body.Close()
476+
477+
body, err := io.ReadAll(resp.Body)
478+
assert.NoError(t, err)
479+
assert.Equal(t, http.StatusOK, resp.StatusCode)
480+
assert.Equal(t, "application/json", resp.Header.Get("Content-Type"))
481+
assert.Equal(t, "{\"message\":\"healthy\"}\n", string(body))
482+
}
483+
450484
func TestKid_Shutdown(t *testing.T) {
451485
k := New()
452486

@@ -461,6 +495,15 @@ func TestKid_Shutdown(t *testing.T) {
461495
assert.NoError(t, k.Shutdown(context.Background()))
462496
}
463497

498+
func TestKid_setUpServer(t *testing.T) {
499+
k := New()
500+
501+
address := k.setUpServer([]string{":2377"})
502+
503+
assert.NotNil(t, k.server)
504+
assert.Equal(t, ":2377", address)
505+
}
506+
464507
func TestKid_Static(t *testing.T) {
465508
k := New()
466509

Diff for: testdata/certs/README.md

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Generate new certs using this command:
2+
```
3+
openssl req -x509 -out localhost.crt -keyout localhost.key -days 9999 \
4+
-newkey rsa:2048 -nodes -sha256 \
5+
-subj '/CN=localhost' -extensions EXT -config <( \
6+
printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")
7+
```

Diff for: testdata/certs/localhost.crt

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDETCCAfmgAwIBAgIUOoxYk6MjSdK8TWQR0Fzm2ziQWCQwDQYJKoZIhvcNAQEL
3+
BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MCAXDTIzMTAxMzIzNTkxMVoYDzIwNTEw
4+
MjI3MjM1OTExWjAUMRIwEAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEB
5+
AQUAA4IBDwAwggEKAoIBAQDX7pwPNBWBa2B4vX0YkEP22MpGUiYOi0y30FnCEYZI
6+
kZRBPcYdU7q9ojKV5qyWPYivgqehFcDdH4b2o8sGYYk+ZAmX4i3FGvwzIymCO9DX
7+
wOKiP5bLvBTRvY3I7NswgGbd/X7hVEZgYQLEJE8menV7cTmINtK+Kr5LA7W8wURv
8+
Z3UIlBZdOHeR8QxdBrQ/PT13BLPtqxO6AuylP6gsq7rvqMvwgk0iouPyquqhmAy3
9+
xh7KPpVzw268cNHFaE5launFKHnZ6TiskzddS/CsQYMthr/K1zmLMm810GSUkNRb
10+
8MVtf+w5sqsE/2g5kgpNsX9w4RoG+JfHvkAbL14DeGslAgMBAAGjWTBXMBQGA1Ud
11+
EQQNMAuCCWxvY2FsaG9zdDALBgNVHQ8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUH
12+
AwEwHQYDVR0OBBYEFE7pmc57y/WqzIkTdw95gVjwht1mMA0GCSqGSIb3DQEBCwUA
13+
A4IBAQC3kd5M9mj5wUDpcI3gPe585LaOXbhBBHx5j4v3TJPUwq8eshWYGnBEbcma
14+
jRk/QH5BJMrdC1x5wb2UAJuFgpFBH6EZJXBiivhHAD0vxKc85T7Ee4Vamgxoi6UY
15+
opiUdkhSbrm3gNZEGX1Zpt73YxjoAiqFlFcNfCrAyPFaSQTX6PPsRcSr/vgUdeW6
16+
LuxGtR20ry+XY2fixButx+n+F52vhyKiqLEjEYCXmYLuYeaFZeCFkfIR1HdOVpU6
17+
2q1ovLNhCNNJ4oV+uGjc0fN3wDIbAiX+kTKOPOYzyXavug38y/Yy1cXZzZUJa9Jq
18+
kZQ7WstTDwzkQ7OcnLz16NhUEEHb
19+
-----END CERTIFICATE-----

Diff for: testdata/certs/localhost.key

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDX7pwPNBWBa2B4
3+
vX0YkEP22MpGUiYOi0y30FnCEYZIkZRBPcYdU7q9ojKV5qyWPYivgqehFcDdH4b2
4+
o8sGYYk+ZAmX4i3FGvwzIymCO9DXwOKiP5bLvBTRvY3I7NswgGbd/X7hVEZgYQLE
5+
JE8menV7cTmINtK+Kr5LA7W8wURvZ3UIlBZdOHeR8QxdBrQ/PT13BLPtqxO6Auyl
6+
P6gsq7rvqMvwgk0iouPyquqhmAy3xh7KPpVzw268cNHFaE5launFKHnZ6Tiskzdd
7+
S/CsQYMthr/K1zmLMm810GSUkNRb8MVtf+w5sqsE/2g5kgpNsX9w4RoG+JfHvkAb
8+
L14DeGslAgMBAAECggEADIvwxXFhToPOtzVLb4HycQVnu25Kh83QR13z2TLreov6
9+
8U+Fk26qCxrBlbQxkwlAR/JviwyYiECstugNg/Fm6Bkn9YtO3YUT4mTIpKiVGfQ7
10+
NvI68Nuc2hMJigM5OTg8welY1f7vl+oLHxp8/t9etC2ACkolNKeHJxSwGqegMljV
11+
POPQzpGST4kVFu1CQNlummmPusSVGMzba0r1F76UsH+5eSdPegNKu53bQXHY8bRW
12+
NarAFe3XX8H3dUC5hwVIJAucf7xUJ1wjIKx7m1IlAVAayuq6d2hIfHEVsdrH2+Eb
13+
GpSq077BsHbnEyb/74bzQQQeie3NQzWFRCf9I370AQKBgQDztUhWhiILnvtyPbrw
14+
BGyxm+RI9dRksj1sqdYUzJ13JfTZfHEAmbkH1plbk1SXYcqsBIFA109kDPZb9sN8
15+
af4k1szzsGu1S0q/WaGAqSfElLk1oDeSp4O2w5q7Wt1XbyqKmf8YFSHtnqP53o1P
16+
uipDCEz0iy0f048B+eI4eVbXXQKBgQDi0q/wFVByVBNopIQoY/qIXuFZd4x5bL/W
17+
j2uzdmWhbfpErhlS5k6mZskHksLCit7zLO9/lzbpgJkrGnamb6xJrqShXZpLMwLs
18+
ZZMGE2LdjsdZBa5ZTOjPytfwBPaZhOlBkee5wx1INWBNaSGQMBt8aSidAn6diG81
19+
8zvZeS8OaQKBgFdjTckY1+Rq4acZU4r1SzR0vesbm0lwUG5CiC11IZGz3pSN9sdM
20+
V/jjjqIztkWCH3aHNwHVMvahX0Wiun5GU4dKLrvDKxwbH3Z14V+NSGFJIxCDnunL
21+
f4NtqHI+JthPWGXSypIMIdpe5FWY4/sOulDHDTEzJr8e0UzYGbI+cFFRAoGAGefQ
22+
Ok5k4rnhgZkQkwBgM8UKXcp+m7uk6V92AIgsMVS7Oa7cq5AsOWsR2LCVV9y+e+2M
23+
6PifR+ntFHQwSvAEMGIm4VssbRxFYDR1p0L9jqpo8Czq7b4P9POI2BvpAj2g2mFM
24+
ovW62W1nM1Anii1EZmAoSE5poZpcgT/nfP4PNskCgYEApaab6ild/555vPjacniI
25+
Eor8QdvRHXXyKgpfK9U0npI+JxFgCW7A5JVnnDKrSRvTRWL2Nb1+e5yyZuKY0gSJ
26+
Bdlg16F6gxHVP9AUoYExf7xZJYQcbn3RG+z7bDcjeD5A+dJvLG4bs6YsDRooojvp
27+
kKDphAOwspt5QCQeAKTB1lc=
28+
-----END PRIVATE KEY-----

0 commit comments

Comments
 (0)