diff --git a/setup.py b/setup.py index eb3f66d..14f55f3 100755 --- a/setup.py +++ b/setup.py @@ -51,7 +51,7 @@ except: setuptools.setup( name='warcprox', - version='2.1b1.dev58', + version='2.1b1.dev59', description='WARC writing MITM HTTP/S proxy', url='https://github.com/internetarchive/warcprox', author='Noah Levitt', diff --git a/tests/test_warcprox.py b/tests/test_warcprox.py index e6312f7..a11e3ec 100755 --- a/tests/test_warcprox.py +++ b/tests/test_warcprox.py @@ -1279,6 +1279,18 @@ def test_dedup_ok_flag( assert results[0]['filename'] == results[1]['filename'] assert results[0]['offset'] < results[1]['offset'] +def test_status_api(warcprox_): + url = 'http://localhost:%s/status' % warcprox_.proxy.server_port + response = requests.get(url) + assert response.status_code == 200 + response_dict = json.loads(response.content.decode('ascii')) + assert response_dict.keys() == { + 'role', 'version', 'host', 'address', 'port', 'pid', 'load', + 'queue_size'} + assert response_dict['role'] == 'warcprox' + assert response_dict['version'] == warcprox.__version__ + assert response_dict['port'] == warcprox_.proxy.server_port + if __name__ == '__main__': pytest.main() diff --git a/warcprox/warcproxy.py b/warcprox/warcproxy.py index bc99bd7..16f4413 100644 --- a/warcprox/warcproxy.py +++ b/warcprox/warcproxy.py @@ -45,6 +45,7 @@ import warcprox import datetime import ipaddress import urlcanon +import os class WarcProxyHandler(warcprox.mitmproxy.MitmProxyHandler): ''' @@ -198,6 +199,29 @@ class WarcProxyHandler(warcprox.mitmproxy.MitmProxyHandler): return recorded_url + def do_GET(self): + if self.path == '/status' and self.command == 'GET': + status_info = { + 'role': 'warcprox', + 'version': warcprox.__version__, + 'host': socket.gethostname(), + 'address': self.connection.getsockname()[0], + 'port': self.connection.getsockname()[1], + 'load': 1.0 * self.server.recorded_url_q.qsize() / ( + self.server.recorded_url_q.maxsize or 100), + 'queue_size': self.server.recorded_url_q.qsize(), + 'pid': os.getpid(), + } + payload = json.dumps( + status_info, indent=2).encode('utf-8') + b'\n' + self.send_response(200, 'OK') + self.send_header('Content-type', 'application/json') + self.send_header('Content-Length', len(payload)) + self.end_headers() + self.wfile.write(payload) + else: + self.do_COMMAND() + # deprecated def do_PUTMETA(self): '''