В настоящее время я разрабатываю сервер загрузки в Go. Мне нужно ограничить скорость загрузки пользователей до 100 КБ/с.Как ограничить скорость загрузки с помощью Go?
Это был мой код:
func serveFile(w http.ResponseWriter, r *http.Request) {
fileID := r.URL.Query().Get("fileID")
if len(fileID) != 0 {
w.Header().Set("Content-Disposition", "attachment; filename=filename.txt")
w.Header().Set("Content-Type", r.Header.Get("Content-Type"))
w.Header().Set("Content-Length", r.Header.Get("Content-Length"))
file, err := os.Open(fmt.Sprintf("../../bin/files/test.txt"))
defer file.Close()
if err != nil {
http.NotFound(w, r)
return
}
io.Copy(w, file)
} else {
io.WriteString(w, "Invalid request.")
}
}
Тогда я нашел пакет на GitHub и мой код стал следующим:
func serveFile(w http.ResponseWriter, r *http.Request) {
fileID := r.URL.Query().Get("fileID")
if len(fileID) != 0 {
w.Header().Set("Content-Disposition", "attachment; filename=Wiki.png")
w.Header().Set("Content-Type", r.Header.Get("Content-Type"))
w.Header().Set("Content-Length", r.Header.Get("Content-Length"))
file, err := os.Open(fmt.Sprintf("../../bin/files/test.txt"))
defer file.Close()
if err != nil {
http.NotFound(w, r)
return
}
bucket := ratelimit.NewBucketWithRate(100*1024, 100*1024)
reader := bufio.NewReader(file)
io.Copy(w, ratelimit.Reader(reader, bucket))
} else {
io.WriteString(w, "Invalid request.")
}
}
Но я получаю эту ошибку:
Corrupted Content Error
The page you are trying to view cannot be shown because an error in the data transmission was detected.
Вот мой код на игровой площадке Go: http://play.golang.org/p/ulgXQl4eQO
Я не знаю, что пакет, но я бы ограничить писатель, а не читатель. Кроме того, заголовки Content-Type и Content-Length не должны копироваться из запроса, а задаваться типом файла и длиной файла. также вы читаете текстовый файл и записываете его как png. –
@Not_a_Golfer это https://github.com/juju/ratelimit, хотя я предпочитаю https://github.com/aybabtme/iocontrol – VonC