From 35c26d93870aa49ea8efd9a43c81e2fc528f714a Mon Sep 17 00:00:00 2001 From: HipsterCat Date: Mon, 29 Oct 2018 21:53:15 +0100 Subject: [PATCH] Fixes for absolute links --- web/templates/setup.html | 2 +- web/templates/template.html | 3 +++ web/views.py | 42 +++++++++++++++++++++++++++++++++++-- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/web/templates/setup.html b/web/templates/setup.html index 9704d8b..d55179e 100644 --- a/web/templates/setup.html +++ b/web/templates/setup.html @@ -73,7 +73,7 @@ var iframeWnd = $($("iframe")[0].contentWindow); // disable a links - $("iframe").contents().find("a").attr("href", "#"); + //$("iframe").contents().find("a").attr("href", "#"); iframeWnd.on('click', function(event) { selectedElement = $(event.target).getPath(); diff --git a/web/templates/template.html b/web/templates/template.html index 21ce0ba..e0b9832 100644 --- a/web/templates/template.html +++ b/web/templates/template.html @@ -40,6 +40,9 @@ + diff --git a/web/views.py b/web/views.py index c7ca238..f1379b8 100644 --- a/web/views.py +++ b/web/views.py @@ -3,15 +3,53 @@ from django.http import HttpResponse from .utils import * from .models import Feed from django.db.models import ObjectDoesNotExist +from bs4 import BeautifulSoup # Create your views here. def iframe(request, url): + content_type = False try: - html = requests.get(url).text + req = requests.get(url) + html = req.content + bs = False + + content_type = req.headers["Content-Type"] if "Content-Type" in req.headers else False + + if not content_type or content_type.startswith("text/html"): + bs = BeautifulSoup(html, 'html.parser') + base_scheme = url.split("://")[0] + base_url = url.split("//")[-1].split("/")[0].split('?')[0] + + # fixes + # fix click links + all_a = bs.find_all("a") + for a in all_a: + a["href"] = "javascript:void(0)" + + # fix absolute CSS + all_links = bs.find_all("link", {"href": True}) + for link in all_links: + if link["href"].startswith("/"): + link["href"] = "/iframe/" + base_scheme + "://" + base_url + link["href"] + + # fix absolute javascript + all_scripts = bs.find_all("script", {"src": True}) + for script in all_scripts: + if script.get("src").startswith("/"): + script["src"] = "/iframe/" + base_scheme + "://" + base_url + script["src"] + + # fix absolute images + all_imgs = bs.find_all("img", {"src": True}) + for img in all_imgs: + if img.get("src").startswith("/"): + img["src"] = "/iframe/" + base_scheme + "://" + base_url + img["src"] + final_html = str(bs) if bs else html + html = final_html + except Exception as e: html = str(e) - return HttpResponse(html) + return HttpResponse(html, content_type=content_type) def dummy(request): return HttpResponse("toto")