From 7034e0f619d1bbae26bf78530819ad98ec4a8458 Mon Sep 17 00:00:00 2001 From: undefined Date: Tue, 13 Aug 2024 04:30:00 +0000 Subject: [PATCH] fix multiline body --- src/dtos.py | 1 + src/flaresolverr_service.py | 69 ++++++++++++++++++++++++------------- src/utils.py | 5 ++- 3 files changed, 50 insertions(+), 25 deletions(-) diff --git a/src/dtos.py b/src/dtos.py index 1e9aace..6a3682e 100644 --- a/src/dtos.py +++ b/src/dtos.py @@ -41,6 +41,7 @@ class V1RequestBase(object): url: str = None postData: str = None returnOnlyCookies: bool = None + referer: str = None download: bool = None # deprecated v2.0.0, not used returnRawHtml: bool = None # deprecated v2.0.0, not used diff --git a/src/flaresolverr_service.py b/src/flaresolverr_service.py index cfc2088..14f6e61 100644 --- a/src/flaresolverr_service.py +++ b/src/flaresolverr_service.py @@ -2,8 +2,9 @@ import logging import platform import sys import time +import json +import base64 from datetime import timedelta -from html import escape from urllib.parse import unquote, quote from func_timeout import FunctionTimedOut, func_timeout @@ -423,33 +424,53 @@ def _evil_logic(req: V1RequestBase, driver: WebDriver, method: str) -> Challenge def _post_request(req: V1RequestBase, driver: WebDriver): - post_form = f'
' - query_string = req.postData if req.postData[0] != '?' else req.postData[1:] - pairs = query_string.split('&') - for pair in pairs: - parts = pair.split('=') - # noinspection PyBroadException - try: - name = unquote(parts[0]) - except Exception: - name = parts[0] - if name == 'submit': - continue - # noinspection PyBroadException - try: - value = unquote(parts[1]) - except Exception: - value = parts[1] - post_form += f'
' - post_form += '
' + payload = dict() + try: + payload = json.loads(req.postData) + except json.JSONDecodeError: + query_string = req.postData if req.postData[0] != '?' else req.postData[1:] + pairs = query_string.split('&') + for pair in pairs: + parts = pair.split('=') + # noinspection PyBroadException + try: + name = unquote(parts[0]) + except Exception: + name = parts[0] + if name == 'submit': + continue + # noinspection PyBroadException + try: + value = unquote(parts[1]) + except Exception: + value = parts[1] + payload[name] = value + data = json.dumps({ "payload": payload, "referer": req.referer or '', "url": req.url }).replace('<', '\\<').replace('>', '\\>') html_content = f""" - {post_form} - +
+ """ - driver.get("data:text/html;charset=utf-8,{html_content}".format(html_content=html_content)) + b64_content = base64.b64encode(html_content.encode('utf-8')).decode('ascii') + driver.get("data:text/html;base64,{b64_content}".format(b64_content=b64_content)) driver.start_session() - driver.start_session() # required to bypass Cloudflare + driver.start_session() # required to bypass Cloudflare \ No newline at end of file diff --git a/src/utils.py b/src/utils.py index a5bd1ef..74ebb32 100644 --- a/src/utils.py +++ b/src/utils.py @@ -145,6 +145,9 @@ def get_webdriver(proxy: dict = None) -> WebDriver: # https://peter.sh/experiments/chromium-command-line-switches/#use-gl options.add_argument('--use-gl=swiftshader') + if (os.environ.get('DISABLE_WEB_SECURITY', None) is not None): + options.add_argument('--disable-web-security') + language = os.environ.get('LANG', None) if language is not None: options.add_argument('--accept-lang=%s' % language) @@ -168,7 +171,7 @@ def get_webdriver(proxy: dict = None) -> WebDriver: if get_config_headless(): if os.name == 'nt': windows_headless = True - else: + elif not os.environ.get('DISPLAY', '') and not os.environ.get('WAYLAND_DISPLAY', ''): start_xvfb_display() # For normal headless mode: # options.add_argument('--headless')