Source code for microraiden.proxy.resources.proxy_url

from microraiden.proxy.resources.expensive import Expensive
from bs4 import BeautifulSoup
import os
import requests
import logging
from flask import Response, stream_with_context, request

from microraiden.constants import MICRORAIDEN_DIR

log = logging.getLogger(__name__)


[docs]class PaywalledProxyUrl(Expensive): """Proxified paywall - if payment is sucessful, it fetches a content from a remote server""" def __init__(self, domain=None, *args, **kwargs): super().__init__(*args, **kwargs) self.paywall_html, self.paywall_header = self.extract_paywall_body( os.path.join(MICRORAIDEN_DIR, 'microraiden/webui/index.html') ) self.domain = domain
[docs] def extract_paywall_body(self, path): # extract body of the paywall page and transform it into a div we'll be # using later with open(path) as fp: soup = BeautifulSoup(fp, 'html.parser') b = soup.body b['id'] = "overlay" b.name = "div" h = [el for el in soup.head if el.name in ('script', 'style') or (el.name == 'link' and 'stylesheet' in el['rel'])] return b, h
[docs] def get(self, url, *args, **kwargs): req = requests.get(self.domain + url, stream=True, params=request.args) return Response(stream_with_context(req.iter_content()), content_type=req.headers['content-type'])
[docs] def get_paywall(self, url: str): data = self.get(url) if 'text/html' not in data.headers.get('Content-Type'): return super().get_paywall(url) soup = BeautifulSoup(data.data.decode(), 'html.parser') # merge js and css elements for tag in reversed(self.paywall_header): soup.head.insert(0, tag) # inject div that generates the paywall soup.body.insert(0, self.paywall_html) return str(soup)