router.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package router
  2. import (
  3. "net/http"
  4. "aws-sts-mock/internal/handler"
  5. )
  6. // Router handles HTTP routing
  7. type Router struct {
  8. s3Handler *handler.S3Handler
  9. stsHandler *handler.STSHandler
  10. healthHandler *handler.HealthHandler
  11. sigv4Middleware func(http.HandlerFunc) http.HandlerFunc
  12. }
  13. // New creates a new router
  14. func New(
  15. s3Handler *handler.S3Handler,
  16. stsHandler *handler.STSHandler,
  17. healthHandler *handler.HealthHandler,
  18. sigv4Middleware func(http.HandlerFunc) http.HandlerFunc,
  19. ) http.Handler {
  20. r := &Router{
  21. s3Handler: s3Handler,
  22. stsHandler: stsHandler,
  23. healthHandler: healthHandler,
  24. sigv4Middleware: sigv4Middleware,
  25. }
  26. mux := http.NewServeMux()
  27. // Health check endpoint - without SigV4 validation
  28. mux.HandleFunc("/health", r.healthHandler.Handle)
  29. // Main handler with SigV4 validation
  30. mux.HandleFunc("/", r.sigv4Middleware(r.handleRequest))
  31. return mux
  32. }
  33. // handleRequest routes requests to appropriate handlers
  34. func (r *Router) handleRequest(w http.ResponseWriter, req *http.Request) {
  35. // STS requests have Action parameter
  36. if req.Method == "POST" && req.FormValue("Action") != "" {
  37. r.stsHandler.Handle(w, req)
  38. return
  39. }
  40. // Otherwise, treat as S3 request
  41. r.s3Handler.Handle(w, req)
  42. }