func (q *quotaReader) Read(b []byte) (int, error) { log.Println(q.quotas.GetQuotaUsed(q.ip)) log.Println(q.quotas.limit) q.lock.Lock() defer q.lock.Unlock() if q.err { return 0, iodine.New(errors.New("Quota Met"), nil) } if q.err == false && q.quotas.IsQuotaMet(q.ip) { defer q.lock.Unlock() q.err = true hosts, _ := net.LookupAddr(uint32ToIP(q.ip).String()) log.Debug.Printf("Offending Host: %s, BandwidthUsed: %d", hosts, q.quotas.GetQuotaUsed(q.ip)) writeErrorResponse(q.w, q.req, BandWidthQuotaExceeded, q.req.URL.Path) return 0, iodine.New(errors.New("Quota Met"), nil) } n, err := q.ReadCloser.Read(b) q.quotas.Add(q.ip, int64(n)) return n, iodine.New(err, nil) }
// FileLogger returns a channel that is used to write to the logger func FileLogger(filename string) (chan<- []byte, error) { ch := make(chan []byte) file, err := os.OpenFile(filename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600) if err != nil { return nil, iodine.New(err, map[string]string{"logfile": filename}) } go func() { for message := range ch { if _, err := io.Copy(file, bytes.NewBuffer(message)); err != nil { log.Println(iodine.New(err, nil)) } } }() return ch, nil }