func (l *Logger) End(c *yarf.Context) error {
	// If nobody sets the status code, it's a 200
	var code int
	if _, ok := c.Response.(*LoggerWriter); ok {
		code = c.Response.(*LoggerWriter).StatusCode
	}

	if code == 0 {
		code = 200
	}

	log.Printf(
		"| %s | %s | %d | %s",
		c.GetClientIP(),
		c.Request.Method,
		code,
		c.Request.URL.String(),
	)

	return nil
}
// PreDispatch performs the requests counting and handle blocks/
func (m *RateLimiter) PreDispatch(c *yarf.Context) error {
	// IP as key
	key := c.GetClientIP()

	// Count
	err := m.rl.Count(key)
	if err != nil {
		if _, ok := err.(RateLimitError); ok {
			return &YarfError{}
		}

		return err
	}

	// Set rate limit info on headers
	rate := m.rl.Get(key)
	c.Response.Header().Set("X-RateLimit-Limit", strconv.Itoa(int(rate.Limit)))
	c.Response.Header().Set("X-RateLimit-Remaining", strconv.Itoa(int(rate.Limit-rate.EventCount)))
	c.Response.Header().Set("X-RateLimit-Reset", strconv.Itoa(int(rate.Start.Add(time.Second*time.Duration(rate.Window)).Unix())))

	return nil
}