Esempio n. 1
0
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)
}
Esempio n. 2
0
// 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
}