implement bandwidth throttling, fixes #189
This commit is contained in:
parent
defbbf290f
commit
9f3374a7dc
3 changed files with 76 additions and 27 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue