// Demonstrates request ID propagation between server and client. // The server assigns a request ID to incoming requests, and the client // middleware forwards it to downstream services via X-Request-Id header. package main import ( "fmt" "log" "log/slog" "net/http" "git.codelab.vc/pkg/httpx" "git.codelab.vc/pkg/httpx/middleware" "git.codelab.vc/pkg/httpx/server" ) func main() { logger := slog.Default() // Client that propagates request IDs from context. client := httpx.New( httpx.WithBaseURL("http://localhost:9090"), httpx.WithMiddleware( middleware.RequestID(), // Picks up ID from context, sets X-Request-Id. ), ) defer client.Close() r := server.NewRouter() r.HandleFunc("GET /proxy", func(w http.ResponseWriter, r *http.Request) { // The request ID is in r.Context() thanks to server.RequestID(). id := server.RequestIDFromContext(r.Context()) logger.Info("handling request", "request_id", id) // Client automatically forwards the request ID to downstream. resp, err := client.Get(r.Context(), "/downstream") if err != nil { server.WriteError(w, http.StatusBadGateway, fmt.Sprintf("downstream error: %v", err)) return } defer resp.Close() body, _ := resp.String() server.WriteJSON(w, http.StatusOK, map[string]string{ "request_id": id, "downstream_response": body, }) }) // Server with RequestID middleware that assigns IDs to incoming requests. srv := server.New(r, server.Defaults(logger)...) log.Fatal(srv.ListenAndServe()) }