11/*
2- Copyright 2024 API Testing Authors.
2+ Copyright 2024-2025 API Testing Authors.
33
44Licensed under the Apache License, Version 2.0 (the "License");
55you may not use this file except in compliance with the License.
@@ -53,15 +53,17 @@ type inMemoryServer struct {
5353 ctx context.Context
5454 cancelFunc context.CancelFunc
5555 reader Reader
56+ metrics RequestMetrics
5657}
5758
58- func NewInMemoryServer (port int ) DynamicServer {
59- ctx , cancel := context .WithCancel (context . TODO () )
59+ func NewInMemoryServer (ctx context. Context , port int ) DynamicServer {
60+ ctx , cancel := context .WithCancel (ctx )
6061 return & inMemoryServer {
6162 port : port ,
6263 wg : sync.WaitGroup {},
6364 ctx : ctx ,
6465 cancelFunc : cancel ,
66+ metrics : NewNoopMetrics (),
6567 }
6668}
6769
@@ -72,6 +74,7 @@ func (s *inMemoryServer) SetupHandler(reader Reader, prefix string) (handler htt
7274 s .mux = mux .NewRouter ().PathPrefix (prefix ).Subrouter ()
7375 s .prefix = prefix
7476 handler = s .mux
77+ s .metrics .AddMetricsHandler (s .mux )
7578 err = s .Load ()
7679 return
7780}
@@ -107,22 +110,31 @@ func (s *inMemoryServer) Load() (err error) {
107110 memLogger .Info ("start to proxy" , "target" , proxy .Target )
108111 s .mux .HandleFunc (proxy .Path , func (w http.ResponseWriter , req * http.Request ) {
109112 api := fmt .Sprintf ("%s/%s" , proxy .Target , strings .TrimPrefix (req .URL .Path , s .prefix ))
113+ api , err = render .Render ("proxy api" , api , s )
114+ if err != nil {
115+ w .WriteHeader (http .StatusInternalServerError )
116+ memLogger .Error (err , "failed to render proxy api" )
117+ return
118+ }
110119 memLogger .Info ("redirect to" , "target" , api )
111120
112121 targetReq , err := http .NewRequestWithContext (req .Context (), req .Method , api , req .Body )
113122 if err != nil {
123+ w .WriteHeader (http .StatusInternalServerError )
114124 memLogger .Error (err , "failed to create proxy request" )
115125 return
116126 }
117127
118128 resp , err := http .DefaultClient .Do (targetReq )
119129 if err != nil {
130+ w .WriteHeader (http .StatusInternalServerError )
120131 memLogger .Error (err , "failed to do proxy request" )
121132 return
122133 }
123134
124135 data , err := io .ReadAll (resp .Body )
125136 if err != nil {
137+ w .WriteHeader (http .StatusInternalServerError )
126138 memLogger .Error (err , "failed to read response body" )
127139 return
128140 }
@@ -148,10 +160,15 @@ func (s *inMemoryServer) Start(reader Reader, prefix string) (err error) {
148160 return
149161}
150162
163+ func (s * inMemoryServer ) EnableMetrics () {
164+ s .metrics = NewInMemoryMetrics ()
165+ }
166+
151167func (s * inMemoryServer ) startObject (obj Object ) {
152168 // create a simple CRUD server
153169 s .mux .HandleFunc ("/" + obj .Name , func (w http.ResponseWriter , req * http.Request ) {
154170 fmt .Println ("mock server received request" , req .URL .Path )
171+ s .metrics .RecordRequest (req .URL .Path )
155172 method := req .Method
156173 w .Header ().Set (util .ContentType , util .JSON )
157174
@@ -210,6 +227,7 @@ func (s *inMemoryServer) startObject(obj Object) {
210227
211228 // handle a single object
212229 s .mux .HandleFunc (fmt .Sprintf ("/%s/{name}" , obj .Name ), func (w http.ResponseWriter , req * http.Request ) {
230+ s .metrics .RecordRequest (req .URL .Path )
213231 w .Header ().Set (util .ContentType , util .JSON )
214232 objects := s .data [obj .Name ]
215233 if objects != nil {
@@ -278,15 +296,17 @@ func (s *inMemoryServer) startItem(item Item) {
278296 headerSlices = append (headerSlices , k , v )
279297 }
280298
281- adHandler := & advanceHandler {item : & item }
299+ adHandler := & advanceHandler {item : & item , metrics : s . metrics }
282300 s .mux .HandleFunc (item .Request .Path , adHandler .handle ).Methods (strings .Split (method , "," )... ).Headers (headerSlices ... )
283301}
284302
285303type advanceHandler struct {
286- item * Item
304+ item * Item
305+ metrics RequestMetrics
287306}
288307
289308func (h * advanceHandler ) handle (w http.ResponseWriter , req * http.Request ) {
309+ h .metrics .RecordRequest (req .URL .Path )
290310 memLogger .Info ("receiving mock request" , "name" , h .item .Name , "method" , req .Method , "path" , req .URL .Path ,
291311 "encoder" , h .item .Response .Encoder )
292312
0 commit comments