Skip to content

Commit 524e4f5

Browse files
authored
feat(http): introduce middleware for audit logs and authentication checks (157)
Introduce wrapper middleware to intercept http requests --- Rename middleware to http
1 parent ebe0ba9 commit 524e4f5

File tree

3 files changed

+66
-1
lines changed

3 files changed

+66
-1
lines changed

pkg/http/http.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package http
2+
3+
import (
4+
"bufio"
5+
"net"
6+
"net/http"
7+
"time"
8+
9+
"k8s.io/klog/v2"
10+
)
11+
12+
func RequestMiddleware(next http.Handler) http.Handler {
13+
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
14+
start := time.Now()
15+
16+
lrw := &loggingResponseWriter{
17+
ResponseWriter: w,
18+
statusCode: http.StatusOK,
19+
}
20+
21+
next.ServeHTTP(lrw, r)
22+
23+
duration := time.Since(start)
24+
klog.V(5).Infof("%s %s %d %v", r.Method, r.URL.Path, lrw.statusCode, duration)
25+
})
26+
}
27+
28+
type loggingResponseWriter struct {
29+
http.ResponseWriter
30+
statusCode int
31+
headerWritten bool
32+
}
33+
34+
func (lrw *loggingResponseWriter) WriteHeader(code int) {
35+
if !lrw.headerWritten {
36+
lrw.statusCode = code
37+
lrw.headerWritten = true
38+
lrw.ResponseWriter.WriteHeader(code)
39+
}
40+
}
41+
42+
func (lrw *loggingResponseWriter) Write(b []byte) (int, error) {
43+
if !lrw.headerWritten {
44+
lrw.statusCode = http.StatusOK
45+
lrw.headerWritten = true
46+
}
47+
return lrw.ResponseWriter.Write(b)
48+
}
49+
50+
func (lrw *loggingResponseWriter) Flush() {
51+
if flusher, ok := lrw.ResponseWriter.(http.Flusher); ok {
52+
flusher.Flush()
53+
}
54+
}
55+
56+
func (lrw *loggingResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
57+
if hijacker, ok := lrw.ResponseWriter.(http.Hijacker); ok {
58+
return hijacker.Hijack()
59+
}
60+
return nil, nil, http.ErrNotSupported
61+
}

pkg/kubernetes-mcp-server/cmd/root.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"k8s.io/kubectl/pkg/util/templates"
1919

2020
"github.com/manusa/kubernetes-mcp-server/pkg/config"
21+
internalhttp "github.com/manusa/kubernetes-mcp-server/pkg/http"
2122
"github.com/manusa/kubernetes-mcp-server/pkg/mcp"
2223
"github.com/manusa/kubernetes-mcp-server/pkg/output"
2324
"github.com/manusa/kubernetes-mcp-server/pkg/version"
@@ -206,9 +207,11 @@ func (m *MCPServerOptions) Run() error {
206207

207208
if m.StaticConfig.Port != "" {
208209
mux := http.NewServeMux()
210+
wrappedMux := internalhttp.RequestMiddleware(mux)
211+
209212
httpServer := &http.Server{
210213
Addr: ":" + m.StaticConfig.Port,
211-
Handler: mux,
214+
Handler: wrappedMux,
212215
}
213216

214217
sseServer := mcpServer.ServeSse(m.SSEBaseUrl, httpServer)

pkg/mcp/mcp.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ func (s *Server) ServeHTTP(httpServer *http.Server) *server.StreamableHTTPServer
9898
options := []server.StreamableHTTPOption{
9999
server.WithHTTPContextFunc(contextFunc),
100100
server.WithStreamableHTTPServer(httpServer),
101+
server.WithStateLess(true),
101102
}
102103
return server.NewStreamableHTTPServer(s.server, options...)
103104
}

0 commit comments

Comments
 (0)