package proxy import ( "fmt" "github.com/openziti/zrok/endpoints" "net/http" "time" "github.com/caddyserver/caddy/v2" "github.com/caddyserver/caddy/v2/caddyconfig/caddyfile" "github.com/caddyserver/caddy/v2/caddyconfig/httpcaddyfile" "github.com/caddyserver/caddy/v2/modules/caddyhttp" ) var middlewareRequests chan *endpoints.Request func init() { caddy.RegisterModule(ZrokRequestsMiddleware{}) httpcaddyfile.RegisterHandlerDirective("zrok_requests", parseCaddyfile) } type ZrokRequestsMiddleware struct{} // CaddyModule returns the Caddy module information. func (ZrokRequestsMiddleware) CaddyModule() caddy.ModuleInfo { return caddy.ModuleInfo{ ID: "http.handlers.zrok_requests", New: func() caddy.Module { return new(ZrokRequestsMiddleware) }, } } // Provision implements caddy.Provisioner. func (m *ZrokRequestsMiddleware) Provision(ctx caddy.Context) error { return nil } // Validate implements caddy.Validator. func (m ZrokRequestsMiddleware) Validate() error { return nil } // ServeHTTP implements caddyhttp.MiddlewareHandler. func (m ZrokRequestsMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyhttp.Handler) error { if middlewareRequests != nil { middlewareRequests <- &endpoints.Request{ Stamp: time.Now(), RemoteAddr: fmt.Sprintf("%v", r.Header["X-Real-Ip"]), Method: r.Method, Path: r.URL.String(), } } return next.ServeHTTP(w, r) } // UnmarshalCaddyfile implements caddyfile.Unmarshaler. func (m *ZrokRequestsMiddleware) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { return nil } // parseCaddyfile unmarshals tokens from h into a new ZrokRequestsMiddleware. func parseCaddyfile(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error) { var m ZrokRequestsMiddleware err := m.UnmarshalCaddyfile(h.Dispenser) return m, err } // Interface guards var ( _ caddy.Provisioner = (*ZrokRequestsMiddleware)(nil) _ caddy.Validator = (*ZrokRequestsMiddleware)(nil) _ caddyhttp.MiddlewareHandler = (*ZrokRequestsMiddleware)(nil) _ caddyfile.Unmarshaler = (*ZrokRequestsMiddleware)(nil) )