kopia lustrzana https://github.com/dgtlmoon/changedetection.io
2747-dont-check-paused-on-edit
rodzic
e84de7e8f4
commit
e8b82c47ca
|
@ -10,5 +10,6 @@ dist
|
||||||
venv
|
venv
|
||||||
test-datastore/*
|
test-datastore/*
|
||||||
test-datastore
|
test-datastore
|
||||||
|
test-memory.log
|
||||||
*.egg-info*
|
*.egg-info*
|
||||||
.vscode/settings.json
|
.vscode/settings.json
|
||||||
|
|
|
@ -515,6 +515,7 @@ class processor_text_json_diff_form(commonSettingsForm):
|
||||||
if not super().validate():
|
if not super().validate():
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
from changedetectionio.safe_jinja import render as jinja_render
|
||||||
result = True
|
result = True
|
||||||
|
|
||||||
# Fail form validation when a body is set for a GET
|
# Fail form validation when a body is set for a GET
|
||||||
|
@ -524,16 +525,44 @@ class processor_text_json_diff_form(commonSettingsForm):
|
||||||
|
|
||||||
# Attempt to validate jinja2 templates in the URL
|
# Attempt to validate jinja2 templates in the URL
|
||||||
try:
|
try:
|
||||||
from changedetectionio.safe_jinja import render as jinja_render
|
|
||||||
jinja_render(template_str=self.url.data)
|
jinja_render(template_str=self.url.data)
|
||||||
except ModuleNotFoundError as e:
|
except ModuleNotFoundError as e:
|
||||||
# incase jinja2_time or others is missing
|
# incase jinja2_time or others is missing
|
||||||
logger.error(e)
|
logger.error(e)
|
||||||
self.url.errors.append(e)
|
self.url.errors.append(f'Invalid template syntax configuration: {e}')
|
||||||
result = False
|
result = False
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(e)
|
logger.error(e)
|
||||||
self.url.errors.append('Invalid template syntax')
|
self.url.errors.append(f'Invalid template syntax: {e}')
|
||||||
|
result = False
|
||||||
|
|
||||||
|
# Attempt to validate jinja2 templates in the body
|
||||||
|
if self.body.data and self.body.data.strip():
|
||||||
|
try:
|
||||||
|
jinja_render(template_str=self.body.data)
|
||||||
|
except ModuleNotFoundError as e:
|
||||||
|
# incase jinja2_time or others is missing
|
||||||
|
logger.error(e)
|
||||||
|
self.body.errors.append(f'Invalid template syntax configuration: {e}')
|
||||||
|
result = False
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(e)
|
||||||
|
self.body.errors.append(f'Invalid template syntax: {e}')
|
||||||
|
result = False
|
||||||
|
|
||||||
|
# Attempt to validate jinja2 templates in the headers
|
||||||
|
if len(self.headers.data) > 0:
|
||||||
|
try:
|
||||||
|
for header, value in self.headers.data.items():
|
||||||
|
jinja_render(template_str=value)
|
||||||
|
except ModuleNotFoundError as e:
|
||||||
|
# incase jinja2_time or others is missing
|
||||||
|
logger.error(e)
|
||||||
|
self.headers.errors.append(f'Invalid template syntax configuration: {e}')
|
||||||
|
result = False
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(e)
|
||||||
|
self.headers.errors.append(f'Invalid template syntax in "{header}" header: {e}')
|
||||||
result = False
|
result = False
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
|
@ -102,6 +102,7 @@ class difference_detection_processor():
|
||||||
self.fetcher.browser_steps_screenshot_path = os.path.join(self.datastore.datastore_path, self.watch.get('uuid'))
|
self.fetcher.browser_steps_screenshot_path = os.path.join(self.datastore.datastore_path, self.watch.get('uuid'))
|
||||||
|
|
||||||
# Tweak the base config with the per-watch ones
|
# Tweak the base config with the per-watch ones
|
||||||
|
from changedetectionio.safe_jinja import render as jinja_render
|
||||||
request_headers = CaseInsensitiveDict()
|
request_headers = CaseInsensitiveDict()
|
||||||
|
|
||||||
ua = self.datastore.data['settings']['requests'].get('default_ua')
|
ua = self.datastore.data['settings']['requests'].get('default_ua')
|
||||||
|
@ -118,9 +119,15 @@ class difference_detection_processor():
|
||||||
if 'Accept-Encoding' in request_headers and "br" in request_headers['Accept-Encoding']:
|
if 'Accept-Encoding' in request_headers and "br" in request_headers['Accept-Encoding']:
|
||||||
request_headers['Accept-Encoding'] = request_headers['Accept-Encoding'].replace(', br', '')
|
request_headers['Accept-Encoding'] = request_headers['Accept-Encoding'].replace(', br', '')
|
||||||
|
|
||||||
|
for header_name in request_headers:
|
||||||
|
request_headers.update({header_name: jinja_render(template_str=request_headers.get(header_name))})
|
||||||
|
|
||||||
timeout = self.datastore.data['settings']['requests'].get('timeout')
|
timeout = self.datastore.data['settings']['requests'].get('timeout')
|
||||||
|
|
||||||
request_body = self.watch.get('body')
|
request_body = self.watch.get('body')
|
||||||
|
if request_body:
|
||||||
|
request_body = jinja_render(template_str=self.watch.get('body'))
|
||||||
|
|
||||||
request_method = self.watch.get('method')
|
request_method = self.watch.get('method')
|
||||||
ignore_status_codes = self.watch.get('ignore_status_codes', False)
|
ignore_status_codes = self.watch.get('ignore_status_codes', False)
|
||||||
|
|
||||||
|
|
|
@ -65,8 +65,8 @@
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<div class="pure-control-group">
|
<div class="pure-control-group">
|
||||||
{{ render_field(form.url, placeholder="https://...", required=true, class="m-d") }}
|
{{ render_field(form.url, placeholder="https://...", required=true, class="m-d") }}
|
||||||
<span class="pure-form-message-inline">Some sites use JavaScript to create the content, for this you should <a href="https://github.com/dgtlmoon/changedetection.io/wiki/Fetching-pages-with-WebDriver">use the Chrome/WebDriver Fetcher</a></span><br>
|
<div class="pure-form-message">Some sites use JavaScript to create the content, for this you should <a href="https://github.com/dgtlmoon/changedetection.io/wiki/Fetching-pages-with-WebDriver">use the Chrome/WebDriver Fetcher</a></div>
|
||||||
<span class="pure-form-message-inline">You can use variables in the URL, perfect for inserting the current date and other logic, <a href="https://github.com/dgtlmoon/changedetection.io/wiki/Handling-variables-in-the-watched-URL">help and examples here</a></span><br>
|
<div class="pure-form-message">Variables are supported in the URL (<a href="https://github.com/dgtlmoon/changedetection.io/wiki/Handling-variables-in-the-watched-URL">help and examples here</a>).</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="pure-control-group inline-radio">
|
<div class="pure-control-group inline-radio">
|
||||||
{{ render_field(form.processor) }}
|
{{ render_field(form.processor) }}
|
||||||
|
@ -149,21 +149,24 @@
|
||||||
{{ render_field(form.method) }}
|
{{ render_field(form.method) }}
|
||||||
</div>
|
</div>
|
||||||
<div id="request-body">
|
<div id="request-body">
|
||||||
{{ render_field(form.body, rows=5, placeholder="Example
|
{{ render_field(form.body, rows=7, placeholder="Example
|
||||||
{
|
{
|
||||||
\"name\":\"John\",
|
\"name\":\"John\",
|
||||||
\"age\":30,
|
\"age\":30,
|
||||||
\"car\":null
|
\"car\":null,
|
||||||
|
\"year\":{% now 'Europe/Berlin', '%Y' %}
|
||||||
}") }}
|
}") }}
|
||||||
</div>
|
</div>
|
||||||
|
<div class="pure-form-message">Variables are supported in the request body (<a href="https://github.com/dgtlmoon/changedetection.io/wiki/Handling-variables-in-the-watched-URL">help and examples here</a>).</div>
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<!-- hmm -->
|
<!-- hmm -->
|
||||||
<div class="pure-control-group advanced-options" style="display: none;">
|
<div class="pure-control-group advanced-options" style="display: none;">
|
||||||
{{ render_field(form.headers, rows=5, placeholder="Example
|
{{ render_field(form.headers, rows=7, placeholder="Example
|
||||||
Cookie: foobar
|
Cookie: foobar
|
||||||
User-Agent: wonderbra 1.0") }}
|
User-Agent: wonderbra 1.0
|
||||||
|
Math: {{ 1 + 1 }}") }}
|
||||||
|
<div class="pure-form-message">Variables are supported in the request header values (<a href="https://github.com/dgtlmoon/changedetection.io/wiki/Handling-variables-in-the-watched-URL">help and examples here</a>).</div>
|
||||||
<div class="pure-form-message-inline">
|
<div class="pure-form-message-inline">
|
||||||
{% if has_extra_headers_file %}
|
{% if has_extra_headers_file %}
|
||||||
<strong>Alert! Extra headers file found and will be added to this watch!</strong>
|
<strong>Alert! Extra headers file found and will be added to this watch!</strong>
|
||||||
|
|
|
@ -45,7 +45,7 @@ def test_headers_in_request(client, live_server, measure_memory_usage):
|
||||||
"url": test_url,
|
"url": test_url,
|
||||||
"tags": "",
|
"tags": "",
|
||||||
"fetch_backend": 'html_webdriver' if os.getenv('PLAYWRIGHT_DRIVER_URL') else 'html_requests',
|
"fetch_backend": 'html_webdriver' if os.getenv('PLAYWRIGHT_DRIVER_URL') else 'html_requests',
|
||||||
"headers": "xxx:ooo\ncool:yeah\r\ncookie:"+cookie_header},
|
"headers": "jinja2:{{ 1+1 }}\nxxx:ooo\ncool:yeah\r\ncookie:"+cookie_header},
|
||||||
follow_redirects=True
|
follow_redirects=True
|
||||||
)
|
)
|
||||||
assert b"Updated watch." in res.data
|
assert b"Updated watch." in res.data
|
||||||
|
@ -61,6 +61,7 @@ def test_headers_in_request(client, live_server, measure_memory_usage):
|
||||||
)
|
)
|
||||||
|
|
||||||
# Flask will convert the header key to uppercase
|
# Flask will convert the header key to uppercase
|
||||||
|
assert b"Jinja2:2" in res.data
|
||||||
assert b"Xxx:ooo" in res.data
|
assert b"Xxx:ooo" in res.data
|
||||||
assert b"Cool:yeah" in res.data
|
assert b"Cool:yeah" in res.data
|
||||||
|
|
||||||
|
@ -117,7 +118,8 @@ def test_body_in_request(client, live_server, measure_memory_usage):
|
||||||
wait_for_all_checks(client)
|
wait_for_all_checks(client)
|
||||||
|
|
||||||
# Now the change which should trigger a change
|
# Now the change which should trigger a change
|
||||||
body_value = 'Test Body Value'
|
body_value = 'Test Body Value {{ 1+1 }}'
|
||||||
|
body_value_formatted = 'Test Body Value 2'
|
||||||
res = client.post(
|
res = client.post(
|
||||||
url_for("edit_page", uuid="first"),
|
url_for("edit_page", uuid="first"),
|
||||||
data={
|
data={
|
||||||
|
@ -140,8 +142,9 @@ def test_body_in_request(client, live_server, measure_memory_usage):
|
||||||
|
|
||||||
# If this gets stuck something is wrong, something should always be there
|
# If this gets stuck something is wrong, something should always be there
|
||||||
assert b"No history found" not in res.data
|
assert b"No history found" not in res.data
|
||||||
# We should see what we sent in the reply
|
# We should see the formatted value of what we sent in the reply
|
||||||
assert str.encode(body_value) in res.data
|
assert str.encode(body_value) not in res.data
|
||||||
|
assert str.encode(body_value_formatted) in res.data
|
||||||
|
|
||||||
####### data sanity checks
|
####### data sanity checks
|
||||||
# Add the test URL twice, we will check
|
# Add the test URL twice, we will check
|
||||||
|
|
Ładowanie…
Reference in New Issue