Skip to content
This repository was archived by the owner on Mar 11, 2026. It is now read-only.

Commit 43e987d

Browse files
Merge pull request #41 from ISISComputingGroup/Ticket5280_memory_leak_webserver
Ticket5280 memory leak webserver
2 parents 37ba3c6 + 664047d commit 43e987d

1 file changed

Lines changed: 24 additions & 22 deletions

File tree

webserver.py

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
import json
66
import logging
77
import os
8-
from http.server import BaseHTTPRequestHandler, HTTPServer
9-
from socketserver import ThreadingMixIn
108
from logging.handlers import TimedRotatingFileHandler
119

10+
import tornado.ioloop
11+
import tornado.web
12+
import asyncio
13+
1214
from external_webpage.request_handler_utils import get_detailed_state_of_specific_instrument, \
1315
get_summary_details_of_all_instruments, get_instrument_and_callback
1416
from external_webpage.web_scrapper_manager import WebScrapperManager
@@ -24,22 +26,23 @@
2426
HOST, PORT = '', 60000
2527

2628

27-
class MyHandler(BaseHTTPRequestHandler):
29+
class MyHandler(tornado.web.RequestHandler):
2830
"""
2931
Handle for web calls for Json Borne
3032
"""
3133

32-
def do_GET(self):
34+
def get(self):
3335
"""
3436
This is called by BaseHTTPRequestHandler every time a client does a GET.
3537
The response is written to self.wfile
3638
"""
39+
path = self.request.uri
3740
instrument = "Not set"
3841
try:
39-
instrument, callback = get_instrument_and_callback(self.path)
42+
instrument, callback = get_instrument_and_callback(path)
4043

4144
# Debug is only needed when debugging
42-
logger.debug("Connection from " + str(self.client_address) + " looking at " + str(instrument))
45+
logger.debug("Connection from {} looking at {}".format(self.request.remote_ip, instrument))
4346

4447
with scraped_data_lock:
4548
if instrument == "ALL":
@@ -53,45 +56,44 @@ def do_GET(self):
5356
try:
5457
ans_as_json = str(json.dumps(ans))
5558
except Exception as err:
56-
raise ValueError("Unable to convert answer data to JSON: %s" % err.message)
59+
raise ValueError("Unable to convert answer data to JSON: {}".format(err))
5760

5861
response = "{}({})".format(callback, ans_as_json)
5962

60-
self.send_response(200)
61-
self.send_header('Content-type', 'text/html')
62-
self.end_headers()
63-
self.wfile.write(response.encode("utf-8"))
63+
self.set_status(200)
64+
self.set_header('Content-type', 'text/html')
65+
self.write(response.encode("utf-8"))
6466
except ValueError as e:
6567
logger.exception("Value Error when getting data from {} for {}: {}".format(
66-
self.client_address, instrument, e))
67-
self.send_response(400)
68+
self.request.remote_ip, instrument, e))
69+
self.set_status(400)
6870
except Exception as e:
6971
logger.exception("Exception when getting data from {} for {}: {}".format(
70-
self.client_address, instrument, e))
71-
self.send_response(404)
72+
self.request.remote_ip, instrument, e))
73+
self.set_status(404)
7274

7375
def log_message(self, format, *args):
7476
""" By overriding this method and doing nothing we disable writing to console
7577
for every client request. Remove this to re-enable """
7678
return
7779

7880

79-
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
80-
"""Handle requests in a separate thread."""
81-
82-
8381
if __name__ == '__main__':
8482
# It can sometime be useful to define a local instrument list to add/override the instrument list do this here
8583
# E.g. to add local instrument local_inst_list = {"localhost": "localhost"}
8684
local_inst_list = {}
8785
web_manager = WebScrapperManager(local_inst_list=local_inst_list)
8886
web_manager.start()
8987

90-
server = ThreadedHTTPServer(('', PORT), MyHandler)
88+
# As documented at https://github.com/tornadoweb/tornado/issues/2608
89+
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
9190

9291
try:
93-
while True:
94-
server.serve_forever()
92+
application = tornado.web.Application([
93+
(r"/", MyHandler),
94+
])
95+
application.listen(PORT)
96+
tornado.ioloop.IOLoop.current().start()
9597
except KeyboardInterrupt:
9698
print("Shutting down")
9799
web_manager.stop()

0 commit comments

Comments
 (0)