diff --git a/proxy/healthcheck.py b/proxy/healthcheck.py index 689f244..d3e5b43 100755 --- a/proxy/healthcheck.py +++ b/proxy/healthcheck.py @@ -6,6 +6,6 @@ def init_healthcheck(app): def healthcheck(): """Health check route to monitor service status""" try: - return Response("Works normally", status=200) + return Response("healthy", status=200) except Exception as e: return f"Error: {e}", 500 diff --git a/proxy/rss_proxy.py b/proxy/rss_proxy.py index d06bd1a..d3c8e08 100755 --- a/proxy/rss_proxy.py +++ b/proxy/rss_proxy.py @@ -3,62 +3,58 @@ import os import requests import redis import xml.etree.ElementTree as ET -from flask import Flask, request, Response +from flask import request, Response -app = Flask(__name__) PROXY_URL = os.getenv("PROXY_URL") REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379/0") -CACHE_TTL = int(os.getenv("CACHE_TTL", 3600)) # По умолчанию 1 час +CACHE_TTL = int(os.getenv("CACHE_TTL", 3600)) rdb = redis.from_url(REDIS_URL) -@app.route("/proxy") -def proxy(): - """Proxy RSS feed with per-item caching.""" - raw_query = request.query_string.decode() - if raw_query.startswith("url="): - url = urllib.parse.unquote(raw_query[4:]) - else: - return "Missing URL", 400 +def init_proxy(app): + @app.route("/proxy") + def proxy(): + """Proxy RSS feed with per-item caching.""" + raw_query = request.query_string.decode() + if raw_query.startswith("url="): + url = urllib.parse.unquote(raw_query[4:]) + else: + return "Missing URL", 400 - try: - # Получаем ленту - proxies = {"http": PROXY_URL, "https": PROXY_URL} if PROXY_URL else None - r = requests.get(url, timeout=10, proxies=proxies) - r.encoding = "windows-1251" if "windows-1251" in r.headers.get("content-type", "").lower() else r.apparent_encoding - xml_data = r.text.replace('', '') + try: + # Получаем ленту + proxies = {"http": PROXY_URL, "https": PROXY_URL} if PROXY_URL else None + r = requests.get(url, timeout=10, proxies=proxies) + r.encoding = "windows-1251" if "windows-1251" in r.headers.get("content-type", "").lower() else r.apparent_encoding + xml_data = r.text.replace('', '') - # Разбираем XML - root = ET.fromstring(xml_data) - items = root.findall(".//item") + # Разбираем XML + root = ET.fromstring(xml_data) + items = root.findall(".//item") - cached_items = [] - new_items = [] + cached_items = [] + new_items = [] - for item in items: - guid = item.find("guid").text if item.find("guid") is not None else None - if guid: - cache_key = f"rss:item:{guid}" - cached_item = rdb.get(cache_key) + for item in items: + guid = item.find("guid").text if item.find("guid") is not None else None + if guid: + cache_key = f"rss:item:{guid}" + cached_item = rdb.get(cache_key) - if cached_item: - cached_items.append(cached_item.decode()) - else: - item_str = ET.tostring(item, encoding="unicode") - rdb.setex(cache_key, CACHE_TTL, item_str) - new_items.append(item_str) + if cached_item: + cached_items.append(cached_item.decode()) + else: + item_str = ET.tostring(item, encoding="unicode") + rdb.setex(cache_key, CACHE_TTL, item_str) + new_items.append(item_str) - # Собираем финальный RSS - final_items = cached_items + new_items - response_xml = f'{"".join(final_items)}' + # Собираем финальный RSS + final_items = cached_items + new_items + response_xml = f'{"".join(final_items)}' - return Response(response_xml, content_type="application/xml; charset=utf-8") + return Response(response_xml, content_type="application/xml; charset=utf-8") - except Exception as e: - return f"Error: {e}", 500 - - -if __name__ == "__main__": - app.run(host="0.0.0.0", port=5050) + except Exception as e: + return f"Error: {e}", 500 diff --git a/tests/test_app.py b/tests/test_app.py index 5367773..8c7f51d 100644 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -15,7 +15,7 @@ class FlaskTestCase(unittest.TestCase): """Check health endpoint.""" response = self.app.get('/health') self.assertEqual(response.status_code, 200) - self.assertEqual(response.data, b'Works normally') + self.assertEqual(response.data, b'healthy') @patch("proxy.rss_proxy.requests.get") def test_proxy_success(self, mock_get):