implement bandwidth throttling, fixes #189

This commit is contained in:
j 2016-01-18 21:15:59 +05:30
commit 9f3374a7dc
3 changed files with 76 additions and 27 deletions

View file

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
from datetime import datetime
from socketserver import ThreadingMixIn
from threading import Thread
import base64
@ -12,6 +11,7 @@ import json
import os
import socket
import socketserver
import time
from Crypto.PublicKey import RSA
from Crypto.Util.asn1 import DerSequence
@ -70,6 +70,7 @@ class TLSTCPServer(socketserver.TCPServer):
pass
class NodeServer(ThreadingMixIn, TLSTCPServer):
_running = True
allow_reuse_address = True
@ -151,19 +152,18 @@ class Handler(http.server.SimpleHTTPRequestHandler):
self.send_header('X-Node-Protocol', settings.NODE_PROTOCOL)
self.send_header('Content-Length', str(os.path.getsize(path)))
self.end_headers()
ct = datetime.utcnow()
chunk_size = 16*1024
with open(path, 'rb') as f:
size = 0
while 1:
data = f.read(16384)
data = f.read(chunk_size)
if not data:
break
size += len(data)
self.wfile.write(data)
if state.bandwidth:
since_ct = (datetime.utcnow() - ct).total_seconds()
state.bandwidth.upload(size/since_ct)
size = 0
while not state.bandwidth.upload(chunk_size) and self.server._running:
time.sleep(0.1)
else:
self.send_response(200, 'OK')
self.send_header('Content-type', 'text/plain')
@ -278,6 +278,7 @@ class Server(Thread):
def stop(self):
if self.http_server:
self.http_server._running = False
self.http_server.shutdown()
self.http_server.socket.close()
return Thread.join(self)