Skip to content
This repository was archived by the owner on Jun 26, 2024. It is now read-only.

Commit 87c3182

Browse files
authored
Merge pull request #18 from basemachina/dynamic-connection-check-port
Make connection check server port dynamic
2 parents c72a6f4 + bf2210c commit 87c3182

File tree

4 files changed

+60
-35
lines changed

4 files changed

+60
-35
lines changed

bridge.go

+28-30
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package bridge
33
import (
44
"context"
55
"fmt"
6+
"net"
67
"net/http"
78
"time"
89

@@ -14,17 +15,17 @@ import (
1415
)
1516

1617
const (
17-
OKPath = "/ok"
18-
OKMessage = "bridge is ready"
19-
ProxyPath = "/htproxy"
18+
OKPath = "/ok"
19+
OKMessage = "bridge is ready"
20+
ProxyPath = "/htproxy"
21+
GetCheckConnectionServerAddrPath = "/get_check_connection_server_addr"
2022
)
2123

2224
// Env stores configuration settings extract from enviromental variables
2325
// The practice getting from environmental variables comes from https://12factor.net.
2426
type Env struct {
2527
// Port is port to listen HTTP server. Default is 8080.
26-
// This value should be other than 4321. because "127.0.0.1:4321" is used in connection checking.
27-
Port string `envconfig:"PORT" default:"8080" description:"bridge を HTTP としてサーブするために利用します。4321 以外を指定してください。"`
28+
Port string `envconfig:"PORT" default:"8080" description:"bridge を HTTP としてサーブするために利用します。"`
2829

2930
// LogLevel is INFO or DEBUG. Default is "INFO".
3031
LogLevel string `envconfig:"LOG_LEVEL" default:"INFO"`
@@ -44,23 +45,23 @@ type Env struct {
4445

4546
// HTTPHandlerConfig is a config to setup bridge http handler.
4647
type HTTPHandlerConfig struct {
47-
Logger logr.Logger
48-
PublicKeyGetter auth.PublicKeyGetter
49-
RegisterUserObject auth.TenantIDGetter
50-
TenantID string
51-
Middlewares []bridgehttp.Middleware
48+
Logger logr.Logger
49+
PublicKeyGetter auth.PublicKeyGetter
50+
RegisterUserObject auth.TenantIDGetter
51+
TenantID string
52+
Middlewares []bridgehttp.Middleware
53+
CheckConnectionServerAddr string
5254
}
5355

5456
// NewHTTPHandler is a handler for handling any requests.
5557
func NewHTTPHandler(c *HTTPHandlerConfig) http.Handler {
5658
mux := http.NewServeMux()
57-
mux.HandleFunc(OKPath, func(w http.ResponseWriter, r *http.Request) {
58-
if r.Method != http.MethodGet {
59-
w.WriteHeader(http.StatusMethodNotAllowed)
60-
return
61-
}
59+
mux.HandleFunc(fmt.Sprintf("GET %s", OKPath), func(w http.ResponseWriter, r *http.Request) {
6260
w.Write([]byte(OKMessage))
6361
})
62+
mux.HandleFunc(fmt.Sprintf("GET %s", GetCheckConnectionServerAddrPath), func(w http.ResponseWriter, r *http.Request) {
63+
w.Write([]byte(c.CheckConnectionServerAddr))
64+
})
6465
middlewares := append(c.Middlewares,
6566
ctxtime.Middleware(),
6667
auth.Middleware(&auth.MiddlewareConfig{
@@ -77,20 +78,12 @@ func NewHTTPHandler(c *HTTPHandlerConfig) http.Handler {
7778
return mux
7879
}
7980

80-
// ConnectionCheckPort is used in connection check from API.
81-
const ConnectionCheckPort = "4321"
82-
8381
func NewHTTPServer(envPort string, handler http.Handler) (*http.Server, func(), error) {
84-
if envPort == ConnectionCheckPort {
85-
return nil, nil, fmt.Errorf("PORT env should be other than 4321")
86-
}
8782
srv := &http.Server{
8883
Addr: ":" + envPort,
8984
Handler: handler,
9085
}
9186

92-
ServeCheckConnectionServer()
93-
9487
return srv, func() {
9588
ctx, cancel := context.WithTimeout(
9689
context.Background(),
@@ -108,14 +101,19 @@ func NewHTTPServer(envPort string, handler http.Handler) (*http.Server, func(),
108101
// because used only the connection check from API.
109102
//
110103
// Serve with goroutine.
111-
func ServeCheckConnectionServer() {
104+
func ServeCheckConnectionServer() (addr string, err error) {
105+
ln, err := net.Listen("tcp", ":0")
106+
if err != nil {
107+
return "", fmt.Errorf("failed to listen a port for connection check: %w", err)
108+
}
109+
112110
go func() {
113-
err := http.ListenAndServe(
114-
":"+ConnectionCheckPort,
115-
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
116-
w.Write([]byte(OKMessage))
117-
}),
118-
)
111+
srv := &http.Server{Addr: addr, Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
112+
w.Write([]byte(OKMessage))
113+
})}
114+
err := srv.Serve(ln)
119115
panic(fmt.Errorf("failed to serve a server to check connection from API: %w", err))
120116
}()
117+
118+
return ln.Addr().String(), nil
121119
}

bridge_test.go

+22
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import (
1010

1111
func TestNewHTTPHandler(t *testing.T) {
1212
t.Run("ok path", func(t *testing.T) {
13+
t.Parallel()
14+
1315
h := NewHTTPHandler(&HTTPHandlerConfig{
1416
Logger: testlogr.Logger,
1517
})
@@ -24,4 +26,24 @@ func TestNewHTTPHandler(t *testing.T) {
2426
t.Fatalf("want message %q but got %q", OKMessage, got)
2527
}
2628
})
29+
30+
t.Run("get check connection server addr path", func(t *testing.T) {
31+
t.Parallel()
32+
33+
const addr = "127.0.0.1:4321"
34+
h := NewHTTPHandler(&HTTPHandlerConfig{
35+
Logger: testlogr.Logger,
36+
CheckConnectionServerAddr: addr,
37+
})
38+
req := httptest.NewRequest("GET", GetCheckConnectionServerAddrPath, nil)
39+
rec := httptest.NewRecorder()
40+
h.ServeHTTP(rec, req)
41+
42+
if rec.Code != http.StatusOK {
43+
t.Fatalf("want status code %d but got %d", http.StatusOK, rec.Code)
44+
}
45+
if got := rec.Body.String(); addr != got {
46+
t.Fatalf("want message %q but got %q", addr, got)
47+
}
48+
})
2749
}

cmd/bridge/container.go

+9-4
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,16 @@ func BridgeContainerProvider() (*Container, func(), error) {
2727
if err != nil {
2828
return nil, nil, err
2929
}
30+
checkConnectionServerAddr, err := bridge.ServeCheckConnectionServer()
31+
if err != nil {
32+
return nil, nil, err
33+
}
3034
httpHandlerConfig := &bridge.HTTPHandlerConfig{
31-
Logger: logger,
32-
PublicKeyGetter: fetchWorker,
33-
TenantID: env.TenantID,
34-
RegisterUserObject: auth.User{},
35+
Logger: logger,
36+
PublicKeyGetter: fetchWorker,
37+
TenantID: env.TenantID,
38+
RegisterUserObject: auth.User{},
39+
CheckConnectionServerAddr: checkConnectionServerAddr,
3540
}
3641
handler := bridge.NewHTTPHandler(httpHandlerConfig)
3742
server, cleanup3, err := bridge.NewHTTPServer(env.Port, handler)

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/basemachina/bridge
22

3-
go 1.21.9
3+
go 1.22.4
44

55
require (
66
github.com/go-logr/logr v1.2.2

0 commit comments

Comments
 (0)