diff options
Diffstat (limited to 'meta/lib/oeqa/utils/httpserver.py')
-rw-r--r-- | meta/lib/oeqa/utils/httpserver.py | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/meta/lib/oeqa/utils/httpserver.py b/meta/lib/oeqa/utils/httpserver.py index 58d3c3b3f8..80752c1377 100644 --- a/meta/lib/oeqa/utils/httpserver.py +++ b/meta/lib/oeqa/utils/httpserver.py | |||
@@ -1,11 +1,13 @@ | |||
1 | # | 1 | # |
2 | # Copyright OpenEmbedded Contributors | ||
3 | # | ||
2 | # SPDX-License-Identifier: MIT | 4 | # SPDX-License-Identifier: MIT |
3 | # | 5 | # |
4 | 6 | ||
5 | import http.server | 7 | import http.server |
8 | import logging | ||
6 | import multiprocessing | 9 | import multiprocessing |
7 | import os | 10 | import os |
8 | import traceback | ||
9 | import signal | 11 | import signal |
10 | from socketserver import ThreadingMixIn | 12 | from socketserver import ThreadingMixIn |
11 | 13 | ||
@@ -13,20 +15,24 @@ class HTTPServer(ThreadingMixIn, http.server.HTTPServer): | |||
13 | 15 | ||
14 | def server_start(self, root_dir, logger): | 16 | def server_start(self, root_dir, logger): |
15 | os.chdir(root_dir) | 17 | os.chdir(root_dir) |
18 | self.logger = logger | ||
16 | self.serve_forever() | 19 | self.serve_forever() |
17 | 20 | ||
18 | class HTTPRequestHandler(http.server.SimpleHTTPRequestHandler): | 21 | class HTTPRequestHandler(http.server.SimpleHTTPRequestHandler): |
19 | 22 | ||
20 | def log_message(self, format_str, *args): | 23 | def log_message(self, format_str, *args): |
21 | pass | 24 | self.server.logger.info(format_str, *args) |
22 | 25 | ||
23 | class HTTPService(object): | 26 | class HTTPService: |
24 | 27 | ||
25 | def __init__(self, root_dir, host='', port=0, logger=None): | 28 | def __init__(self, root_dir, host='', port=0, logger=None): |
26 | self.root_dir = root_dir | 29 | self.root_dir = root_dir |
27 | self.host = host | 30 | self.host = host |
28 | self.port = port | 31 | self.port = port |
29 | self.logger = logger | 32 | if logger: |
33 | self.logger = logger.getChild("HTTPService") | ||
34 | else: | ||
35 | self.logger = logging.getLogger("HTTPService") | ||
30 | 36 | ||
31 | def start(self): | 37 | def start(self): |
32 | if not os.path.exists(self.root_dir): | 38 | if not os.path.exists(self.root_dir): |
@@ -38,6 +44,12 @@ class HTTPService(object): | |||
38 | self.port = self.server.server_port | 44 | self.port = self.server.server_port |
39 | self.process = multiprocessing.Process(target=self.server.server_start, args=[self.root_dir, self.logger]) | 45 | self.process = multiprocessing.Process(target=self.server.server_start, args=[self.root_dir, self.logger]) |
40 | 46 | ||
47 | def handle_error(self, request, client_address): | ||
48 | import traceback | ||
49 | exception = traceback.format_exc() | ||
50 | self.logger.warn("Exception when handling %s: %s" % (request, exception)) | ||
51 | self.server.handle_error = handle_error | ||
52 | |||
41 | # The signal handler from testimage.bbclass can cause deadlocks here | 53 | # The signal handler from testimage.bbclass can cause deadlocks here |
42 | # if the HTTPServer is terminated before it can restore the standard | 54 | # if the HTTPServer is terminated before it can restore the standard |
43 | #signal behaviour | 55 | #signal behaviour |
@@ -47,7 +59,7 @@ class HTTPService(object): | |||
47 | signal.signal(signal.SIGTERM, orig) | 59 | signal.signal(signal.SIGTERM, orig) |
48 | 60 | ||
49 | if self.logger: | 61 | if self.logger: |
50 | self.logger.info("Started HTTPService on %s:%s" % (self.host, self.port)) | 62 | self.logger.info("Started HTTPService for %s on %s:%s" % (self.root_dir, self.host, self.port)) |
51 | 63 | ||
52 | 64 | ||
53 | def stop(self): | 65 | def stop(self): |
@@ -59,3 +71,10 @@ class HTTPService(object): | |||
59 | if self.logger: | 71 | if self.logger: |
60 | self.logger.info("Stopped HTTPService on %s:%s" % (self.host, self.port)) | 72 | self.logger.info("Stopped HTTPService on %s:%s" % (self.host, self.port)) |
61 | 73 | ||
74 | if __name__ == "__main__": | ||
75 | import sys, logging | ||
76 | |||
77 | logger = logging.getLogger(__name__) | ||
78 | logging.basicConfig(level=logging.DEBUG) | ||
79 | httpd = HTTPService(sys.argv[1], port=8888, logger=logger) | ||
80 | httpd.start() | ||