From f5447f3b4ca2c91a07bfdd5acad9661061b8bbd7 Mon Sep 17 00:00:00 2001 From: Jalil SA <61639983+jxlil@users.noreply.github.com> Date: Tue, 18 Apr 2023 21:31:51 -0500 Subject: [PATCH 1/7] fix: Request.from_curl() with prefixed string literals --- scrapy/utils/curl.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/scrapy/utils/curl.py b/scrapy/utils/curl.py index a2243ae2e..5e095f933 100644 --- a/scrapy/utils/curl.py +++ b/scrapy/utils/curl.py @@ -1,4 +1,5 @@ import argparse +import re import warnings from http.cookies import SimpleCookie from shlex import split @@ -7,6 +8,15 @@ from urllib.parse import urlparse from w3lib.http import basic_auth_header +class DataAction(argparse.Action): + def __call__(self, parser, namespace, values, option_string=None): + value = str(values).encode("utf-8").decode("utf-8") + if items := re.findall(r"{.+}", value): + value = items[0] + + setattr(namespace, self.dest, value) + + class CurlParser(argparse.ArgumentParser): def error(self, message): error_msg = f"There was an error parsing the curl command: {message}" @@ -17,7 +27,7 @@ curl_parser = CurlParser() curl_parser.add_argument("url") curl_parser.add_argument("-H", "--header", dest="headers", action="append") curl_parser.add_argument("-X", "--request", dest="method") -curl_parser.add_argument("-d", "--data", "--data-raw", dest="data") +curl_parser.add_argument("-d", "--data", "--data-raw", dest="data", action=DataAction) curl_parser.add_argument("-u", "--user", dest="auth") From 88c58a8c9ca6f8149779bfc92d00499a613e5fb3 Mon Sep 17 00:00:00 2001 From: Jalil SA <61639983+jxlil@users.noreply.github.com> Date: Tue, 18 Apr 2023 21:49:05 -0500 Subject: [PATCH 2/7] feat: added test_post_data_raw_with_string_prefix --- tests/test_utils_curl.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/test_utils_curl.py b/tests/test_utils_curl.py index fd4612eba..1816db29b 100644 --- a/tests/test_utils_curl.py +++ b/tests/test_utils_curl.py @@ -154,6 +154,15 @@ class CurlToRequestKwargsTest(unittest.TestCase): } self._test_command(curl_command, expected_result) + def test_post_data_raw_with_string_prefix(self): + curl_command = "curl 'https://www.example.org/' --data-raw $'{\"$filters\":\"Filter\u0021\"}'" + expected_result = { + "method": "POST", + "url": "https://www.example.org/", + "body": '{"$filters":"Filter!"}', + } + self._test_command(curl_command, expected_result) + def test_explicit_get_with_data(self): curl_command = "curl httpbin.org/anything -X GET --data asdf" expected_result = { From 69f96b9e96b1399f68cc61db0fe2d2b6cff5484d Mon Sep 17 00:00:00 2001 From: Jalil SA <61639983+jxlil@users.noreply.github.com> Date: Tue, 18 Apr 2023 22:04:34 -0500 Subject: [PATCH 3/7] fix: regex --- scrapy/utils/curl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scrapy/utils/curl.py b/scrapy/utils/curl.py index 5e095f933..b873d2bdf 100644 --- a/scrapy/utils/curl.py +++ b/scrapy/utils/curl.py @@ -11,7 +11,7 @@ from w3lib.http import basic_auth_header class DataAction(argparse.Action): def __call__(self, parser, namespace, values, option_string=None): value = str(values).encode("utf-8").decode("utf-8") - if items := re.findall(r"{.+}", value): + if items := re.findall(r"\$(.+)", value): value = items[0] setattr(namespace, self.dest, value) From 3209eac14f430f9cba522c12a615111bcabaecd5 Mon Sep 17 00:00:00 2001 From: Jalil SA <61639983+jxlil@users.noreply.github.com> Date: Tue, 18 Apr 2023 22:35:15 -0500 Subject: [PATCH 4/7] fix: checks --- scrapy/utils/curl.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/scrapy/utils/curl.py b/scrapy/utils/curl.py index b873d2bdf..ecfa292ea 100644 --- a/scrapy/utils/curl.py +++ b/scrapy/utils/curl.py @@ -11,9 +11,8 @@ from w3lib.http import basic_auth_header class DataAction(argparse.Action): def __call__(self, parser, namespace, values, option_string=None): value = str(values).encode("utf-8").decode("utf-8") - if items := re.findall(r"\$(.+)", value): - value = items[0] - + items = re.findall(r"\$(.+)", value) + value = items[0] if items else value setattr(namespace, self.dest, value) From 7e1814faf836757933afec4c7c394f43f34c3567 Mon Sep 17 00:00:00 2001 From: Jalil SA <61639983+jxlil@users.noreply.github.com> Date: Tue, 18 Apr 2023 23:36:51 -0500 Subject: [PATCH 5/7] fix: regex --- scrapy/utils/curl.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scrapy/utils/curl.py b/scrapy/utils/curl.py index ecfa292ea..9c98e4cb8 100644 --- a/scrapy/utils/curl.py +++ b/scrapy/utils/curl.py @@ -11,8 +11,7 @@ from w3lib.http import basic_auth_header class DataAction(argparse.Action): def __call__(self, parser, namespace, values, option_string=None): value = str(values).encode("utf-8").decode("utf-8") - items = re.findall(r"\$(.+)", value) - value = items[0] if items else value + value = value[1::] if re.match(r"^\$(.+)", value) else value setattr(namespace, self.dest, value) From b7ecec18099ace6ba77161302cca85c3e58a2ae7 Mon Sep 17 00:00:00 2001 From: Jalil SA Date: Wed, 19 Apr 2023 01:04:03 -0600 Subject: [PATCH 6/7] Update scrapy/utils/curl.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Adrián Chaves --- scrapy/utils/curl.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scrapy/utils/curl.py b/scrapy/utils/curl.py index 9c98e4cb8..790c26b1a 100644 --- a/scrapy/utils/curl.py +++ b/scrapy/utils/curl.py @@ -10,8 +10,9 @@ from w3lib.http import basic_auth_header class DataAction(argparse.Action): def __call__(self, parser, namespace, values, option_string=None): - value = str(values).encode("utf-8").decode("utf-8") - value = value[1::] if re.match(r"^\$(.+)", value) else value + value = str(values) + if value.startswith("$"): + value = value[1:] setattr(namespace, self.dest, value) From f69ba43f8e5b52af51119c682509167f5cf5517f Mon Sep 17 00:00:00 2001 From: Jalil SA <61639983+jxlil@users.noreply.github.com> Date: Wed, 19 Apr 2023 02:06:00 -0500 Subject: [PATCH 7/7] fix: import re --- scrapy/utils/curl.py | 1 - 1 file changed, 1 deletion(-) diff --git a/scrapy/utils/curl.py b/scrapy/utils/curl.py index 790c26b1a..f5dbbd64e 100644 --- a/scrapy/utils/curl.py +++ b/scrapy/utils/curl.py @@ -1,5 +1,4 @@ import argparse -import re import warnings from http.cookies import SimpleCookie from shlex import split