Skip to content

Commit c5a718f

Browse files
committed
BUG/MINOR: version: make config version middleware to write after request
1 parent 88c5c2c commit c5a718f

File tree

1 file changed

+50
-19
lines changed

1 file changed

+50
-19
lines changed

adapters/adapters.go

+50-19
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,11 @@ import (
2323
"strings"
2424

2525
clientnative "github.com/haproxytech/client-native/v4"
26+
"github.com/haproxytech/client-native/v4/configuration"
2627
"github.com/haproxytech/client-native/v4/models"
2728
"github.com/haproxytech/dataplaneapi/log"
2829
)
2930

30-
var configVersion string
31-
32-
func ConfigVersion() string {
33-
return configVersion
34-
}
35-
3631
// Adapter is just a wrapper over http handler function
3732
type Adapter func(http.Handler) http.Handler
3833

@@ -125,6 +120,32 @@ func ApacheLogMiddleware(logger *log.ACLLogger) Adapter {
125120
}
126121
}
127122

123+
type serverWriter struct {
124+
w http.ResponseWriter
125+
client configuration.Configuration
126+
transactionID string
127+
wroteHeader bool
128+
}
129+
130+
func (s serverWriter) WriteHeader(code int) {
131+
if !s.wroteHeader {
132+
version, err := fetchConfgVersion(s.client, s.transactionID)
133+
if err == nil {
134+
s.w.Header().Set("Configuration-Version", version)
135+
}
136+
s.wroteHeader = true //nolint:staticcheck
137+
}
138+
s.w.WriteHeader(code)
139+
}
140+
141+
func (s serverWriter) Write(b []byte) (int, error) {
142+
return s.w.Write(b)
143+
}
144+
145+
func (s serverWriter) Header() http.Header {
146+
return s.w.Header()
147+
}
148+
128149
func ConfigVersionMiddleware(client clientnative.HAProxyClient) Adapter {
129150
return func(h http.Handler) http.Handler {
130151
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
@@ -134,20 +155,30 @@ func ConfigVersionMiddleware(client clientnative.HAProxyClient) Adapter {
134155
if err != nil {
135156
http.Error(w, err.Error(), http.StatusNotImplemented)
136157
}
137-
var v int64
138-
if tID == "" {
139-
v, err = configuration.GetConfigurationVersion("")
140-
} else {
141-
tr, _ := configuration.GetTransaction(tID)
142-
if tr != nil && tr.Status == models.TransactionStatusInProgress {
143-
v, err = configuration.GetConfigurationVersion(tr.ID)
144-
}
158+
sw := serverWriter{
159+
w: w,
160+
client: configuration,
161+
transactionID: tID,
162+
wroteHeader: false,
145163
}
146-
if err == nil {
147-
configVersion = strconv.FormatInt(v, 10)
148-
w.Header().Add("Configuration-Version", configVersion)
149-
}
150-
h.ServeHTTP(w, r)
164+
h.ServeHTTP(sw, r)
151165
})
152166
}
153167
}
168+
169+
func fetchConfgVersion(client configuration.Configuration, transactionID string) (string, error) {
170+
var v int64
171+
var err error
172+
if transactionID == "" {
173+
v, err = client.GetConfigurationVersion("")
174+
} else {
175+
tr, _ := client.GetTransaction(transactionID)
176+
if tr != nil && tr.Status == models.TransactionStatusInProgress {
177+
v, err = client.GetConfigurationVersion(tr.ID)
178+
}
179+
}
180+
if err == nil {
181+
return strconv.FormatInt(v, 10), nil
182+
}
183+
return "", err
184+
}

0 commit comments

Comments
 (0)