dgtlmoon
09881f8b26
0.60.8
0.60.8
2026-09-28 09:24:04 +02:00
skkzsh
d789fe3ea5
i18n: Fix untranslated labels ( #4488 )
...
Build and push containers / metadata (push) Canceled after 0s
Build and push containers / build-push-containers (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Build distribution 📦 (push) Canceled after 0s
ChangeDetection.io App Test / lint-code (push) Canceled after 0s
ChangeDetection.io App Test / lint-translations (push) Canceled after 0s
ChangeDetection.io App Test / lint-template-i18n (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Test the built package works basically. (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Publish Python 🐍 distribution 📦 to PyPI (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-11 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-12 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-13 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-14 (push) Canceled after 0s
* gettext "No proxy"
* Fix untranslated Settings label
* Unify `.po` header fields across all languages
2026-09-25 18:31:40 +02:00
skkzsh
61f03cdc69
Use lazy_pgettext for condition Match label ( #4480 )
Build and push containers / metadata (push) Canceled after 0s
Build and push containers / build-push-containers (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Build distribution 📦 (push) Canceled after 0s
ChangeDetection.io App Test / lint-code (push) Canceled after 0s
ChangeDetection.io App Test / lint-translations (push) Canceled after 0s
ChangeDetection.io App Test / lint-template-i18n (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Test the built package works basically. (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Publish Python 🐍 distribution 📦 to PyPI (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-11 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-12 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-13 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-14 (push) Canceled after 0s
2026-09-25 11:31:00 +02:00
dgtlmoon
6704fdb29e
Title extract - Limit search window and improve regex - reduce memory usage ( #4487 )
2026-09-25 11:26:21 +02:00
dgtlmoon
15615ccf6f
LLM - Disable by default the fetching of price mappings from GitHub on startup
2026-09-25 09:32:02 +02:00
dgtlmoon
1df1131095
UI - CSS cleanups in LLM settings area
Build and push containers / metadata (push) Canceled after 0s
Build and push containers / build-push-containers (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Build distribution 📦 (push) Canceled after 0s
ChangeDetection.io Container Build Test / Build linux/amd64 (alpine) (push) Canceled after 0s
ChangeDetection.io Container Build Test / Build linux/arm64 (alpine) (push) Canceled after 0s
ChangeDetection.io Container Build Test / Build linux/amd64 (main) (push) Canceled after 0s
ChangeDetection.io Container Build Test / Build linux/arm/v7 (main) (push) Canceled after 0s
ChangeDetection.io Container Build Test / Build linux/arm/v8 (main) (push) Canceled after 0s
ChangeDetection.io Container Build Test / Build linux/arm64 (main) (push) Canceled after 0s
ChangeDetection.io App Test / lint-code (push) Canceled after 0s
ChangeDetection.io App Test / lint-translations (push) Canceled after 0s
ChangeDetection.io App Test / lint-template-i18n (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Test the built package works basically. (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Publish Python 🐍 distribution 📦 to PyPI (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-11 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-12 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-13 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-14 (push) Canceled after 0s
2026-09-25 08:22:33 +02:00
dependabot[bot]
7370395fd3
Update python-socketio requirement from <6,>=5.11.0 to >=5.17.0,<6 ( #4486 )
...
Updates the requirements on [python-socketio](https://github.com/sponsors/miguelgrinberg ) to permit the latest version.
- [Commits](https://github.com/sponsors/miguelgrinberg/commits )
---
updated-dependencies:
- dependency-name: python-socketio
dependency-version: 5.17.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-25 08:05:18 +02:00
dependabot[bot]
3328d8ad73
Update flask-wtf requirement from ~=1.2 to ~=1.3 ( #4485 )
...
Updates the requirements on [flask-wtf](https://github.com/pallets-eco/flask-wtf ) to permit the latest version.
- [Release notes](https://github.com/pallets-eco/flask-wtf/releases )
- [Changelog](https://github.com/pallets-eco/flask-wtf/blob/main/docs/changes.rst )
- [Commits](https://github.com/pallets-eco/flask-wtf/compare/v1.2.0...v1.3.0 )
---
updated-dependencies:
- dependency-name: flask-wtf
dependency-version: 1.3.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-25 08:05:02 +02:00
dgtlmoon
fd7c9db23e
UI - CSS - Mobile - Just remove disabled items, cleaner output.
Build and push containers / metadata (push) Canceled after 0s
Build and push containers / build-push-containers (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Build distribution 📦 (push) Canceled after 0s
ChangeDetection.io App Test / lint-code (push) Canceled after 0s
ChangeDetection.io App Test / lint-translations (push) Canceled after 0s
ChangeDetection.io App Test / lint-template-i18n (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Test the built package works basically. (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Publish Python 🐍 distribution 📦 to PyPI (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-11 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-12 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-13 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-14 (push) Canceled after 0s
2026-09-21 18:06:05 +02:00
dgtlmoon
474c70f37c
UI - CSS - Mobile - Fixing padding on edit pages
2026-09-21 18:00:42 +02:00
dgtlmoon
8689ad9dfa
UI - CSS - Mobile - Add little home button at top
2026-09-21 17:57:32 +02:00
dgtlmoon
59827a98f8
UI - CSS - Mobile improvements
2026-09-21 17:52:36 +02:00
dgtlmoon
63b0ad0ccd
Merge branch 'master' of github.com:dgtlmoon/changedetection.io
Build and push containers / metadata (push) Canceled after 0s
Build and push containers / build-push-containers (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Build distribution 📦 (push) Canceled after 0s
ChangeDetection.io Container Build Test / Build linux/amd64 (alpine) (push) Canceled after 0s
ChangeDetection.io Container Build Test / Build linux/arm64 (alpine) (push) Canceled after 0s
ChangeDetection.io Container Build Test / Build linux/amd64 (main) (push) Canceled after 0s
ChangeDetection.io Container Build Test / Build linux/arm/v7 (main) (push) Canceled after 0s
ChangeDetection.io Container Build Test / Build linux/arm/v8 (main) (push) Canceled after 0s
ChangeDetection.io Container Build Test / Build linux/arm64 (main) (push) Canceled after 0s
ChangeDetection.io App Test / lint-code (push) Canceled after 0s
ChangeDetection.io App Test / lint-translations (push) Canceled after 0s
ChangeDetection.io App Test / lint-template-i18n (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Test the built package works basically. (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Publish Python 🐍 distribution 📦 to PyPI (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-11 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-12 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-13 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-14 (push) Canceled after 0s
2026-09-20 20:29:58 +02:00
dgtlmoon
167597628d
LLM - History/difference page - CSRF fix for LLM summary fetching between versions
2026-09-20 20:29:36 +02:00
dependabot[bot]
95f06c5004
Update selenium requirement from ~=4.31.0 to ~=4.49.0 ( #4456 )
...
Updates the requirements on [selenium](https://github.com/SeleniumHQ/Selenium ) to permit the latest version.
- [Release notes](https://github.com/SeleniumHQ/Selenium/releases )
- [Commits](https://github.com/SeleniumHQ/Selenium/compare/selenium-4.31.0...selenium-4.49.0 )
---
updated-dependencies:
- dependency-name: selenium
dependency-version: 4.49.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-20 20:28:19 +02:00
dgtlmoon
ed217644fa
Our first basic PWA mobile integration! Look for the QR-Code in Settings ( #4472 )
2026-09-20 19:45:11 +02:00
dgtlmoon
239a69dcc4
UI - Prevent accidental change of LLM Key ( #4473 )
2026-09-20 19:44:06 +02:00
dgtlmoon
de4637c0bd
LLM - Fixes for temperature/reasoning GPT-5 etc
2026-09-20 18:09:55 +02:00
dgtlmoon
11916a89e6
LLM - UI nonblocking ( #4469 )
...
* Make LLM summary from UI non blocking
* Increase logging
2026-09-20 16:00:12 +02:00
dgtlmoon
4da220be62
LLM timeout improvements (frontend) ( #4470 )
2026-09-20 15:59:58 +02:00
dgtlmoon
a165df2da9
LLM UI - When LLM is disabled, hide it from the groups settings also ( #4471 )
2026-09-20 15:54:41 +02:00
dgtlmoon
dd588bf3e3
Make LLM summary from UI non blocking ( #4467 )
Build and push containers / metadata (push) Canceled after 0s
Build and push containers / build-push-containers (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Build distribution 📦 (push) Canceled after 0s
ChangeDetection.io App Test / lint-code (push) Canceled after 0s
ChangeDetection.io App Test / lint-translations (push) Canceled after 0s
ChangeDetection.io App Test / lint-template-i18n (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Test the built package works basically. (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Publish Python 🐍 distribution 📦 to PyPI (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-11 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-12 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-13 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-14 (push) Canceled after 0s
2026-09-20 13:01:14 +02:00
dgtlmoon
1b7219755f
Groups - UI fix for #4451 and tweaks ( #4466 )
2026-09-20 09:11:16 +02:00
dgtlmoon
7086a1769b
UI - LLM - Tidy up styling
2026-09-20 08:10:30 +02:00
Corey Quinn and dgtlmoon
8776c205dc
UI: make editing a configured LLM model discoverable ( #4400 )
...
Co-authored-by: dgtlmoon <dgtlmoon@gmail.com >
2026-09-20 08:06:04 +02:00
skkzsh
9c5600087a
i18n: Add ja translations for new UI ( #4464 )
Build and push containers / metadata (push) Canceled after 0s
Build and push containers / build-push-containers (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Build distribution 📦 (push) Canceled after 0s
ChangeDetection.io App Test / lint-code (push) Canceled after 0s
ChangeDetection.io App Test / lint-translations (push) Canceled after 0s
ChangeDetection.io App Test / lint-template-i18n (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Test the built package works basically. (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Publish Python 🐍 distribution 📦 to PyPI (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-11 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-12 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-13 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-14 (push) Canceled after 0s
2026-09-19 10:46:15 +02:00
skkzsh
0426ce0424
i18n: Use msgctxt and correct ja translations for -ed forms ( #4460 )
...
Build and push containers / metadata (push) Canceled after 0s
Build and push containers / build-push-containers (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Build distribution 📦 (push) Canceled after 0s
ChangeDetection.io Container Build Test / Build linux/amd64 (alpine) (push) Canceled after 0s
ChangeDetection.io Container Build Test / Build linux/arm64 (alpine) (push) Canceled after 0s
ChangeDetection.io Container Build Test / Build linux/amd64 (main) (push) Canceled after 0s
ChangeDetection.io Container Build Test / Build linux/arm/v7 (main) (push) Canceled after 0s
ChangeDetection.io Container Build Test / Build linux/arm/v8 (main) (push) Canceled after 0s
ChangeDetection.io Container Build Test / Build linux/arm64 (main) (push) Canceled after 0s
ChangeDetection.io App Test / lint-code (push) Canceled after 0s
ChangeDetection.io App Test / lint-translations (push) Canceled after 0s
ChangeDetection.io App Test / lint-template-i18n (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Test the built package works basically. (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Publish Python 🐍 distribution 📦 to PyPI (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-11 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-12 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-13 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-14 (push) Canceled after 0s
* Annotate fragmented gettext locations with marker comments (#4074 )
* update_catalog
* Re-add translator marker comments after UI refactor
* Use `msgctxt` and correct ja translations for -ed forms
# Conflicts:
# changedetectionio/blueprint/ui/templates/edit.html
# changedetectionio/translations/messages.pot
2026-09-18 15:22:24 +02:00
dgtlmoon
438419b3ab
Merge branch 'master' of github.com:dgtlmoon/changedetection.io
2026-09-18 15:02:10 +02:00
dgtlmoon
d436405da7
UI - sidebar - background fixes
2026-09-18 14:59:59 +02:00
dependabot[bot]
21a1d18f3e
Update chardet requirement from >2.3.0 to >=7.6.0 ( #4455 )
...
Updates the requirements on [chardet](https://github.com/chardet/chardet ) to permit the latest version.
- [Release notes](https://github.com/chardet/chardet/releases )
- [Changelog](https://github.com/chardet/chardet/blob/main/docs/changelog.rst )
- [Commits](https://github.com/chardet/chardet/compare/3.0.0...7.6.0 )
---
updated-dependencies:
- dependency-name: chardet
dependency-version: 7.6.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-18 13:56:25 +02:00
dgtlmoon
bb37ea23d2
System - Ensure import+API update values are verified types ( #4458 )
2026-09-18 13:55:50 +02:00
dgtlmoon
a2bc2bf9ae
UI - Horizontal lines and styling fixes for #4424
Build and push containers / metadata (push) Canceled after 0s
Build and push containers / build-push-containers (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Build distribution 📦 (push) Canceled after 0s
ChangeDetection.io App Test / lint-code (push) Canceled after 0s
ChangeDetection.io App Test / lint-translations (push) Canceled after 0s
ChangeDetection.io App Test / lint-template-i18n (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Test the built package works basically. (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Publish Python 🐍 distribution 📦 to PyPI (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-11 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-12 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-13 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-14 (push) Canceled after 0s
2026-09-18 12:39:57 +02:00
dgtlmoon
3f864cad5b
UI - Sidebar spacing/colour fixes
2026-09-18 12:00:16 +02:00
dgtlmoon
d3e1c17092
UI - Styling - Remove background on sidebar, more contrast is easier on the eyes
2026-09-18 11:48:41 +02:00
dgtlmoon
77e80d39f1
API - Rebuild docs
2026-09-18 11:42:51 +02:00
dgtlmoon
86d5800a00
UI - Set language on reverse proxy/subdirectory hosting was acting wrong, just redirect it to watchlist so theres no failures. ( #4453 )
Build and push containers / metadata (push) Canceled after 0s
Build and push containers / build-push-containers (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Build distribution 📦 (push) Canceled after 0s
ChangeDetection.io App Test / lint-code (push) Canceled after 0s
ChangeDetection.io App Test / lint-translations (push) Canceled after 0s
ChangeDetection.io App Test / lint-template-i18n (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Test the built package works basically. (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Publish Python 🐍 distribution 📦 to PyPI (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-11 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-12 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-13 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-14 (push) Canceled after 0s
2026-09-17 22:35:29 +02:00
dgtlmoon
72d3c171d4
UI - CSS - Mobile misc fixes
2026-09-17 22:24:25 +02:00
dgtlmoon
e38e02aa6b
Update stock-not-in-stock.js - spanish
Build and push containers / metadata (push) Canceled after 0s
Build and push containers / build-push-containers (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Build distribution 📦 (push) Canceled after 0s
ChangeDetection.io App Test / lint-code (push) Canceled after 0s
ChangeDetection.io App Test / lint-translations (push) Canceled after 0s
ChangeDetection.io App Test / lint-template-i18n (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Test the built package works basically. (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Publish Python 🐍 distribution 📦 to PyPI (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-11 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-12 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-13 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-14 (push) Canceled after 0s
2026-09-17 20:15:37 +02:00
dgtlmoon
077ae823e6
Docs - Adding price graph/restock info
2026-09-17 17:48:09 +02:00
dgtlmoon
5e5e0d8f36
Adding HTTP browser caching of UI elements ( #4450 )
2026-09-17 16:16:42 +02:00
dgtlmoon
593e9cc48c
0.60.7
Build and push containers / metadata (push) Canceled after 0s
Build and push containers / build-push-containers (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Build distribution 📦 (push) Canceled after 0s
ChangeDetection.io App Test / lint-code (push) Canceled after 0s
ChangeDetection.io App Test / lint-translations (push) Canceled after 0s
ChangeDetection.io App Test / lint-template-i18n (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Test the built package works basically. (push) Canceled after 0s
Publish Python 🐍distribution 📦 to PyPI and TestPyPI / Publish Python 🐍 distribution 📦 to PyPI (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-11 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-12 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-13 (push) Canceled after 0s
ChangeDetection.io App Test / test-application-3-14 (push) Canceled after 0s
0.60.7
2026-09-17 11:22:29 +02:00
Dennis Gaida and dgtlmoon
b91082b38a
Set Cache-Control: no-store on dynamic responses by default ( #4319 )
...
* Set Cache-Control: no-store on dynamic responses by default
Pages with per-session content (settings, CSRF-token-bearing forms,
watch data) had no Cache-Control header, so a misconfigured CDN or
reverse proxy sitting in front of the app could cache and replay them
across requests/sessions — most commonly surfacing as "CSRF tokens do
not match" after the edge served a stale cached page. Routes that
already set their own Cache-Control (static assets, screenshots,
favicons) are left untouched.
* Adding tests and moving function
---------
Co-authored-by: dgtlmoon <dgtlmoon@gmail.com >
2026-09-17 11:20:31 +02:00
dgtlmoon
36ca14df82
UI - Make the 'share watch' optional, reduces visual noise, not really used by non-power users ( #4448 )
2026-09-17 10:54:43 +02:00
dgtlmoon
12b86f19b5
UI - CSS - Header menu item color fix
2026-09-17 10:39:26 +02:00
dgtlmoon
9c4c95dd44
UI - Watch list - Move processor/mode to its own column
2026-09-17 09:18:39 +02:00
dgtlmoon
d3e33f14eb
UI - Watchlist - Better alignment and icons
2026-09-17 09:10:30 +02:00
dgtlmoon
706dcb646c
UI - Diff page - tabs should be consistent size with rest of app
2026-09-17 08:34:53 +02:00
dgtlmoon
f2e7b88cd3
UI - Watch list - Tidy up padding between cells
2026-09-17 08:31:32 +02:00
77fb923de6
fix(http): send a single Date header on werkzeug built-in server ( #4372 )
...
* fix(http): send a single Date header on werkzeug built-in server
Static resources served via werkzeug send_from_directory/send_file get a
Date header injected into the WSGI response by make_conditional()
(werkzeug/wrappers/response.py:752-757). When the app runs on Werkzeug's
built-in server -- the default path started through
socketio.run(..., allow_unsafe_werkzeug=True) in changedetectionio/__init__.py:694
and used by the docker entrypoint -- BaseHTTPRequestHandler.send_response()
(werkzeug/serving.py:271) emits its own Date header line as well, so the
wire response carries two Date headers. RFC 9110 forbids this and nginx
rejects the response with "upstream sent duplicate header line" (issue
#4299 , see also #4101 ).
Fix: a global after_request hook pops the application-side Date copy so
only the server's single header reaches the wire. Verified safe on
gunicorn too, which also emits its own Date header.
Test: new tests/test_duplicate_date_header.py hits the live_server over
real HTTP with http.client (the Flask test client talks to the WSGI app
directly and never sees the server-added header) and asserts the Date
header appears exactly once, on the exact static resources named in the
issue. Fails on unfixed code with two identical Date lines; passes with
the fix.
Fixes #4299
* Apply suggestion from @dgtlmoon
* Tidy the #4299 Date header fix and its test
flask_app.py: the applied suggestion landed with a 3-space indent and
trailing whitespace - the latter was the only W291 in the file, which
.ruff.toml selects.
test_duplicate_date_header.py:
- drop the 10s socket wait loop, pytest-flask's live_server already
blocks until the port accepts connections
- drop the unused `app` fixture argument (live_server depends on it)
- stop hardcoding jquery-3.6.0.min.js: asserting 200 on a vendored
filename turns a jQuery bump into a failure in a file about HTTP
headers. Any send_from_directory() response exercises the same path,
so styles.css alone is enough.
Still red before the fix (two identical Date lines) and green after.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
---------
Co-authored-by: dgtlmoon <leigh@morresi.net >
Co-authored-by: dgtlmoon <dgtlmoon@gmail.com >
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-09-17 07:16:00 +02:00
dgtlmoon
3d51a04a19
"Add watch" UI tweaks ( #4446 )
2026-09-17 06:37:51 +02:00