diff --git a/cgi-bin/init.py b/cgi-bin/init.py index ae521a3..2e69adb 100644 --- a/cgi-bin/init.py +++ b/cgi-bin/init.py @@ -1,20 +1,40 @@ #!/usr/bin/env python3 """ -Dit script wordt gebruikt om de methodes in de scraper aan te roepen via JavaScript. Zo kan dit toch nog redelijk -onafhankelijk gebeuren en kan er gemakkelijker ge-debugged worden. -De bestandsextensie werd aangepast om te kunnen debuggen op zowel Windows als Linux. +Dit script wordt gebruikt om de methodes in de scraper aan te roepen via CLI of CGI. +De bestandsextensie werd behouden voor achterwaartse compatibiliteit. """ -import cgi import json +import sys +import os +from urllib.parse import parse_qs, unquote +sys.path.insert(0, os.path.dirname(__file__)) from scraper import run -parameters = cgi.FieldStorage() -data = json.loads(parameters.getvalue('data')) -antwoord = run(data['taal'], data['start'], data['einde']) -print("Content-Type: application/json") -print() # Lege lijn na headers -print(json.dumps(antwoord)) +def get_input_data(): + query_string = os.environ.get('QUERY_STRING', '') + if query_string: + params = parse_qs(query_string) + if 'data' in params: + return json.loads(unquote(params['data'][0])) + + # Fallback to stdin or args + if len(sys.argv) > 1: + return json.loads(sys.argv[1]) + + return {'taal': 'en', 'start': 'Special:Random', 'einde': 'Philosophy'} + + +if __name__ == '__main__': + try: + data = get_input_data() + antwoord = run(data.get('taal', 'en'), data.get('start', 'Special:Random'), data.get('einde', 'Philosophy')) + except Exception as err: + antwoord = {'error': f"Fout bij verwerken: {str(err)}"} + + print("Content-Type: application/json") + print() # Lege lijn na headers + print(json.dumps(antwoord)) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..bfc5e8e --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +requests>=2.28.0 +beautifulsoup4>=4.11.0 +urllib3>=1.26.0 diff --git a/server.py b/server.py new file mode 100644 index 0000000..ca34a33 --- /dev/null +++ b/server.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python3 +""" +Python standard library HTTP server replacing legacy CGI execution. +Serves static frontend files and provides JSON API endpoint for scraper paths. +""" + +import http.server +import json +import os +import sys +from urllib.parse import parse_qs, urlparse, unquote + +# Add cgi-bin directory to sys.path so scraper can be imported cleanly +sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'cgi-bin')) +from scraper import run + + +class PhikipathiaHandler(http.server.SimpleHTTPRequestHandler): + def do_GET(self): + parsed_url = urlparse(self.path) + + # Handle API endpoints: /cgi-bin/init.py or /api/find-path + if parsed_url.path in ['/cgi-bin/init.py', '/api/find-path']: + query_params = parse_qs(parsed_url.query) + + taal = 'en' + start = 'Special:Random' + einde = 'Philosophy' + + if 'data' in query_params: + try: + data_raw = unquote(query_params['data'][0]) + data_json = json.loads(data_raw) + taal = data_json.get('taal', taal) + start = data_json.get('start', start) + einde = data_json.get('einde', einde) + except Exception as err: + self.send_json({'error': f"Fout bij verwerken van request parameters: {str(err)}"}, status=400) + return + else: + taal = query_params.get('taal', [taal])[0] + start = query_params.get('start', [start])[0] + einde = query_params.get('einde', [einde])[0] + + try: + antwoord = run(taal, start, einde) + self.send_json(antwoord) + except Exception as e: + self.send_json({'error': f"Interne serverfout: {str(e)}"}, status=500) + return + + # Default: serve static files (index.html, style.css, index.js, images) + super().do_GET() + + def send_json(self, data, status=200): + body = json.dumps(data).encode('utf-8') + self.send_response(status) + self.send_header('Content-Type', 'application/json; charset=utf-8') + self.send_header('Content-Length', str(len(body))) + self.send_header('Access-Control-Allow-Origin', '*') + self.send_header('X-Content-Type-Options', 'nosniff') + self.send_header('X-Frame-Options', 'SAMEORIGIN') + self.end_headers() + self.wfile.write(body) + + def log_message(self, format, *args): + # Clean logging format + sys.stderr.write(f"[{self.log_date_time_string()}] {format % args}\n") + + +def main(): + port = int(os.environ.get('PORT', 8000)) + server_address = ('', port) + httpd = http.server.HTTPServer(server_address, PhikipathiaHandler) + print(f"Phikipathia server active on http://localhost:{port}") + try: + httpd.serve_forever() + except KeyboardInterrupt: + print("\nServer shutting down.") + httpd.server_close() + + +if __name__ == '__main__': + main()