2013-09-03 16:52:47 +00:00
|
|
|
#!/usr/bin/env python
|
|
|
|
|
|
2017-11-30 18:33:11 +00:00
|
|
|
# Copyright 2012 - 2017, New York University and the TUF contributors
|
|
|
|
|
# SPDX-License-Identifier: MIT OR Apache-2.0
|
|
|
|
|
|
2013-04-13 16:56:10 +00:00
|
|
|
"""
|
|
|
|
|
<Program Name>
|
|
|
|
|
slow_retrieval_server.py
|
|
|
|
|
|
|
|
|
|
<Author>
|
2014-04-06 01:21:10 +00:00
|
|
|
Konstantin Andrianov.
|
2013-04-13 16:56:10 +00:00
|
|
|
|
|
|
|
|
<Started>
|
2014-04-06 01:21:10 +00:00
|
|
|
March 13, 2012.
|
2013-04-13 16:56:10 +00:00
|
|
|
|
|
|
|
|
<Copyright>
|
2018-02-05 16:31:19 +00:00
|
|
|
See LICENSE-MIT OR LICENSE for licensing information.
|
2013-04-13 16:56:10 +00:00
|
|
|
|
|
|
|
|
<Purpose>
|
2014-04-06 01:21:10 +00:00
|
|
|
Server that throttles data by sending one byte at a time (specified time
|
|
|
|
|
interval 'DELAY'). The server is used in 'test_slow_retrieval_attack.py'.
|
2013-04-13 16:56:10 +00:00
|
|
|
"""
|
|
|
|
|
|
2014-04-29 18:27:34 +00:00
|
|
|
# Help with Python 3 compatibility, where the print statement is a function, an
|
|
|
|
|
# implicit relative import is invalid, and the '/' operator performs true
|
|
|
|
|
# division. Example: print 'hello world' raises a 'SyntaxError' exception.
|
|
|
|
|
from __future__ import print_function
|
|
|
|
|
from __future__ import absolute_import
|
|
|
|
|
from __future__ import division
|
|
|
|
|
from __future__ import unicode_literals
|
|
|
|
|
|
2013-03-12 18:28:13 +00:00
|
|
|
import os
|
2013-03-14 20:48:36 +00:00
|
|
|
import sys
|
2013-03-12 18:28:13 +00:00
|
|
|
import time
|
|
|
|
|
import random
|
|
|
|
|
|
2015-06-02 14:28:02 +00:00
|
|
|
import six
|
2013-03-12 18:28:13 +00:00
|
|
|
|
2013-04-13 16:56:10 +00:00
|
|
|
|
2014-04-06 01:21:10 +00:00
|
|
|
# Modify the HTTPServer class to pass the 'test_mode' argument to
|
|
|
|
|
# do_GET() function.
|
2014-04-22 19:03:42 +00:00
|
|
|
class HTTPServer_Test(six.moves.BaseHTTPServer.HTTPServer):
|
2013-08-20 07:48:29 +00:00
|
|
|
def __init__(self, server_address, Handler, test_mode):
|
2014-04-22 19:03:42 +00:00
|
|
|
six.moves.BaseHTTPServer.HTTPServer.__init__(self, server_address, Handler)
|
2013-08-20 07:48:29 +00:00
|
|
|
self.test_mode = test_mode
|
2013-04-13 16:56:10 +00:00
|
|
|
|
2013-09-03 16:52:47 +00:00
|
|
|
|
|
|
|
|
|
2013-03-12 18:28:13 +00:00
|
|
|
# HTTP request handler.
|
2014-04-22 19:03:42 +00:00
|
|
|
class Handler(six.moves.BaseHTTPServer.BaseHTTPRequestHandler):
|
2013-03-12 18:28:13 +00:00
|
|
|
|
|
|
|
|
# Overwrite do_GET.
|
|
|
|
|
def do_GET(self):
|
|
|
|
|
current_dir = os.getcwd()
|
|
|
|
|
try:
|
|
|
|
|
filepath = os.path.join(current_dir, self.path.lstrip('/'))
|
2014-01-27 18:15:03 +00:00
|
|
|
data = None
|
2014-05-28 16:11:31 +00:00
|
|
|
with open(filepath, 'r') as fileobj:
|
2014-01-27 18:15:03 +00:00
|
|
|
data = fileobj.read()
|
2017-11-30 18:33:11 +00:00
|
|
|
|
2013-03-12 18:28:13 +00:00
|
|
|
self.send_response(200)
|
|
|
|
|
self.send_header('Content-length', str(len(data)))
|
|
|
|
|
self.end_headers()
|
2017-11-30 18:33:11 +00:00
|
|
|
|
2014-04-06 01:21:10 +00:00
|
|
|
if self.server.test_mode == 'mode_1':
|
|
|
|
|
# Before sending any data, the server does nothing for a long time.
|
2017-11-30 18:33:11 +00:00
|
|
|
DELAY = 40
|
2013-04-13 16:56:10 +00:00
|
|
|
time.sleep(DELAY)
|
2013-08-20 07:48:29 +00:00
|
|
|
self.wfile.write(data)
|
2013-03-12 18:28:13 +00:00
|
|
|
|
2013-08-20 07:48:29 +00:00
|
|
|
return
|
2017-11-30 18:33:11 +00:00
|
|
|
|
2014-04-06 01:21:10 +00:00
|
|
|
# 'mode_2'
|
|
|
|
|
else:
|
2013-08-20 07:48:29 +00:00
|
|
|
DELAY = 1
|
2018-09-10 18:45:42 +00:00
|
|
|
# Throttle the file by sending a character every DELAY seconds.
|
2013-08-20 07:48:29 +00:00
|
|
|
for i in range(len(data)):
|
2014-05-28 16:11:31 +00:00
|
|
|
self.wfile.write(data[i].encode('utf-8'))
|
2013-08-20 07:48:29 +00:00
|
|
|
time.sleep(DELAY)
|
2017-11-30 18:33:11 +00:00
|
|
|
|
2013-08-20 07:48:29 +00:00
|
|
|
return
|
2013-03-12 18:28:13 +00:00
|
|
|
|
2014-04-22 19:03:42 +00:00
|
|
|
except IOError as e:
|
2013-03-12 18:28:13 +00:00
|
|
|
self.send_error(404, 'File Not Found!')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_random_port():
|
|
|
|
|
port = random.randint(30000, 45000)
|
|
|
|
|
return port
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-08-20 07:48:29 +00:00
|
|
|
def run(port, test_mode):
|
2013-03-12 18:28:13 +00:00
|
|
|
server_address = ('localhost', port)
|
2013-08-20 07:48:29 +00:00
|
|
|
httpd = HTTPServer_Test(server_address, Handler, test_mode)
|
2013-03-12 18:28:13 +00:00
|
|
|
httpd.handle_request()
|
2013-04-13 16:56:10 +00:00
|
|
|
|
2013-03-12 18:28:13 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
2013-09-03 16:52:47 +00:00
|
|
|
port = int(sys.argv[1])
|
|
|
|
|
test_mode = sys.argv[2]
|
2014-04-06 01:21:10 +00:00
|
|
|
assert test_mode in ('mode_1', 'mode_2')
|
2013-09-03 16:52:47 +00:00
|
|
|
run(port, test_mode)
|