fix: FromApp inherits the app-level api {} config into site handlers - #142

Open
jtelo88 wants to merge 1 commit into
caddyserver:masterfrom
jtelo88:icl/fromapp-api-copy
Open

fix: FromApp inherits the app-level api {} config into site handlers#142
jtelo88 wants to merge 1 commit into
caddyserver:masterfrom
jtelo88:icl/fromapp-api-copy

Conversation

@jtelo88

Copy link
Copy Markdown

The Caddyfile api {} block is global-only (parseCaddyfileGlobalOption rejects it inside site blocks), but FromApp never copies app.API into the handler configuration. GenerateHandlerMap therefore sees a zero API config (nothing enabled) in every http.handlers.cache instance and returns nil — so the souin API is unreachable in-band on any listener: a PURGE/GET to /souin-api/* falls through the cache handler as an ordinary request (with no terminal handler after it, Caddy answers its default empty 200, which callers can easily mistake for success — we shipped a Surrogate-Key purge that silently no-oped for two months this way).

This copies the app-level API into the handler config exactly like the other app-level defaults merged in FromApp, guarded so a raw-JSON per-handler API config (still possible outside the Caddyfile adapter) keeps winning.

Verified end-to-end with a 3-listener Caddyfile (origin + public site + internal API listener): PURGE with Surrogate-Key now reaches the API (204) and evicts; before the patch the same request fell through with a 200.

Note for reviewers: since the cache directive orders before rewrite, once the API is genuinely served in-band, operators who relied on a later respond /souin-api* 404 to shield the API on public listeners must pin the order (e.g. a route block) — happy to add a README note if you want it in this PR.

The api {} block is global-only in the Caddyfile adapter, but FromApp never
copied app.API into the handler configuration, so GenerateHandlerMap built a
nil handler map in every http.handlers.cache instance: the souin API was
unreachable in-band on any listener — a PURGE/GET to /souin-api/* fell
through the cache handler as an ordinary request. Inherit the app-level API
(only when the handler config carries none of its own, which raw-JSON configs
still can) exactly like the other app-level defaults merged here.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jtelo88
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix: FromApp inherits the app-level api {} config into site handlers - #142

Open
jtelo88 wants to merge 1 commit into
caddyserver:masterfrom
jtelo88:icl/fromapp-api-copy
Open

fix: FromApp inherits the app-level api {} config into site handlers#142
jtelo88 wants to merge 1 commit into
caddyserver:masterfrom
jtelo88:icl/fromapp-api-copy

Conversation

@jtelo88

Copy link
Copy Markdown

The Caddyfile api {} block is global-only (parseCaddyfileGlobalOption rejects it inside site blocks), but FromApp never copies app.API into the handler configuration. GenerateHandlerMap therefore sees a zero API config (nothing enabled) in every http.handlers.cache instance and returns nil — so the souin API is unreachable in-band on any listener: a PURGE/GET to /souin-api/* falls through the cache handler as an ordinary request (with no terminal handler after it, Caddy answers its default empty 200, which callers can easily mistake for success — we shipped a Surrogate-Key purge that silently no-oped for two months this way).

This copies the app-level API into the handler config exactly like the other app-level defaults merged in FromApp, guarded so a raw-JSON per-handler API config (still possible outside the Caddyfile adapter) keeps winning.

Verified end-to-end with a 3-listener Caddyfile (origin + public site + internal API listener): PURGE with Surrogate-Key now reaches the API (204) and evicts; before the patch the same request fell through with a 200.

Note for reviewers: since the cache directive orders before rewrite, once the API is genuinely served in-band, operators who relied on a later respond /souin-api* 404 to shield the API on public listeners must pin the order (e.g. a route block) — happy to add a README note if you want it in this PR.

The api {} block is global-only in the Caddyfile adapter, but FromApp never
copied app.API into the handler configuration, so GenerateHandlerMap built a
nil handler map in every http.handlers.cache instance: the souin API was
unreachable in-band on any listener — a PURGE/GET to /souin-api/* fell
through the cache handler as an ordinary request. Inherit the app-level API
(only when the handler config carries none of its own, which raw-JSON configs
still can) exactly like the other app-level defaults merged here.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jtelo88
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: FromApp inherits the app-level api {} config into site handlers - #142

Open
jtelo88 wants to merge 1 commit into
caddyserver:masterfrom
jtelo88:icl/fromapp-api-copy
Open

fix: FromApp inherits the app-level api {} config into site handlers#142
jtelo88 wants to merge 1 commit into
caddyserver:masterfrom
jtelo88:icl/fromapp-api-copy

Conversation

@jtelo88

Copy link
Copy Markdown

The Caddyfile api {} block is global-only (parseCaddyfileGlobalOption rejects it inside site blocks), but FromApp never copies app.API into the handler configuration. GenerateHandlerMap therefore sees a zero API config (nothing enabled) in every http.handlers.cache instance and returns nil — so the souin API is unreachable in-band on any listener: a PURGE/GET to /souin-api/* falls through the cache handler as an ordinary request (with no terminal handler after it, Caddy answers its default empty 200, which callers can easily mistake for success — we shipped a Surrogate-Key purge that silently no-oped for two months this way).

This copies the app-level API into the handler config exactly like the other app-level defaults merged in FromApp, guarded so a raw-JSON per-handler API config (still possible outside the Caddyfile adapter) keeps winning.

Verified end-to-end with a 3-listener Caddyfile (origin + public site + internal API listener): PURGE with Surrogate-Key now reaches the API (204) and evicts; before the patch the same request fell through with a 200.

Note for reviewers: since the cache directive orders before rewrite, once the API is genuinely served in-band, operators who relied on a later respond /souin-api* 404 to shield the API on public listeners must pin the order (e.g. a route block) — happy to add a README note if you want it in this PR.

The api {} block is global-only in the Caddyfile adapter, but FromApp never
copied app.API into the handler configuration, so GenerateHandlerMap built a
nil handler map in every http.handlers.cache instance: the souin API was
unreachable in-band on any listener — a PURGE/GET to /souin-api/* fell
through the cache handler as an ordinary request. Inherit the app-level API
(only when the handler config carries none of its own, which raw-JSON configs
still can) exactly like the other app-level defaults merged here.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jtelo88
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: FromApp inherits the app-level api {} config into site handlers - #142

Open
jtelo88 wants to merge 1 commit into
caddyserver:masterfrom
jtelo88:icl/fromapp-api-copy
Open

fix: FromApp inherits the app-level api {} config into site handlers#142
jtelo88 wants to merge 1 commit into
caddyserver:masterfrom
jtelo88:icl/fromapp-api-copy

Conversation

@jtelo88

Copy link
Copy Markdown

The Caddyfile api {} block is global-only (parseCaddyfileGlobalOption rejects it inside site blocks), but FromApp never copies app.API into the handler configuration. GenerateHandlerMap therefore sees a zero API config (nothing enabled) in every http.handlers.cache instance and returns nil — so the souin API is unreachable in-band on any listener: a PURGE/GET to /souin-api/* falls through the cache handler as an ordinary request (with no terminal handler after it, Caddy answers its default empty 200, which callers can easily mistake for success — we shipped a Surrogate-Key purge that silently no-oped for two months this way).

This copies the app-level API into the handler config exactly like the other app-level defaults merged in FromApp, guarded so a raw-JSON per-handler API config (still possible outside the Caddyfile adapter) keeps winning.

Verified end-to-end with a 3-listener Caddyfile (origin + public site + internal API listener): PURGE with Surrogate-Key now reaches the API (204) and evicts; before the patch the same request fell through with a 200.

Note for reviewers: since the cache directive orders before rewrite, once the API is genuinely served in-band, operators who relied on a later respond /souin-api* 404 to shield the API on public listeners must pin the order (e.g. a route block) — happy to add a README note if you want it in this PR.

The api {} block is global-only in the Caddyfile adapter, but FromApp never
copied app.API into the handler configuration, so GenerateHandlerMap built a
nil handler map in every http.handlers.cache instance: the souin API was
unreachable in-band on any listener — a PURGE/GET to /souin-api/* fell
through the cache handler as an ordinary request. Inherit the app-level API
(only when the handler config carries none of its own, which raw-JSON configs
still can) exactly like the other app-level defaults merged here.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jtelo88
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix: FromApp inherits the app-level api {} config into site handlers - #142

Open
jtelo88 wants to merge 1 commit into
caddyserver:masterfrom
jtelo88:icl/fromapp-api-copy
Open

fix: FromApp inherits the app-level api {} config into site handlers#142
jtelo88 wants to merge 1 commit into
caddyserver:masterfrom
jtelo88:icl/fromapp-api-copy

Conversation

@jtelo88

Copy link
Copy Markdown

The Caddyfile api {} block is global-only (parseCaddyfileGlobalOption rejects it inside site blocks), but FromApp never copies app.API into the handler configuration. GenerateHandlerMap therefore sees a zero API config (nothing enabled) in every http.handlers.cache instance and returns nil — so the souin API is unreachable in-band on any listener: a PURGE/GET to /souin-api/* falls through the cache handler as an ordinary request (with no terminal handler after it, Caddy answers its default empty 200, which callers can easily mistake for success — we shipped a Surrogate-Key purge that silently no-oped for two months this way).

This copies the app-level API into the handler config exactly like the other app-level defaults merged in FromApp, guarded so a raw-JSON per-handler API config (still possible outside the Caddyfile adapter) keeps winning.

Verified end-to-end with a 3-listener Caddyfile (origin + public site + internal API listener): PURGE with Surrogate-Key now reaches the API (204) and evicts; before the patch the same request fell through with a 200.

Note for reviewers: since the cache directive orders before rewrite, once the API is genuinely served in-band, operators who relied on a later respond /souin-api* 404 to shield the API on public listeners must pin the order (e.g. a route block) — happy to add a README note if you want it in this PR.

The api {} block is global-only in the Caddyfile adapter, but FromApp never
copied app.API into the handler configuration, so GenerateHandlerMap built a
nil handler map in every http.handlers.cache instance: the souin API was
unreachable in-band on any listener — a PURGE/GET to /souin-api/* fell
through the cache handler as an ordinary request. Inherit the app-level API
(only when the handler config carries none of its own, which raw-JSON configs
still can) exactly like the other app-level defaults merged here.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jtelo88
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: FromApp inherits the app-level api {} config into site handlers - #142

Open
jtelo88 wants to merge 1 commit into
caddyserver:masterfrom
jtelo88:icl/fromapp-api-copy
Open

fix: FromApp inherits the app-level api {} config into site handlers#142
jtelo88 wants to merge 1 commit into
caddyserver:masterfrom
jtelo88:icl/fromapp-api-copy

Conversation

@jtelo88

Copy link
Copy Markdown

The Caddyfile api {} block is global-only (parseCaddyfileGlobalOption rejects it inside site blocks), but FromApp never copies app.API into the handler configuration. GenerateHandlerMap therefore sees a zero API config (nothing enabled) in every http.handlers.cache instance and returns nil — so the souin API is unreachable in-band on any listener: a PURGE/GET to /souin-api/* falls through the cache handler as an ordinary request (with no terminal handler after it, Caddy answers its default empty 200, which callers can easily mistake for success — we shipped a Surrogate-Key purge that silently no-oped for two months this way).

This copies the app-level API into the handler config exactly like the other app-level defaults merged in FromApp, guarded so a raw-JSON per-handler API config (still possible outside the Caddyfile adapter) keeps winning.

Verified end-to-end with a 3-listener Caddyfile (origin + public site + internal API listener): PURGE with Surrogate-Key now reaches the API (204) and evicts; before the patch the same request fell through with a 200.

Note for reviewers: since the cache directive orders before rewrite, once the API is genuinely served in-band, operators who relied on a later respond /souin-api* 404 to shield the API on public listeners must pin the order (e.g. a route block) — happy to add a README note if you want it in this PR.

The api {} block is global-only in the Caddyfile adapter, but FromApp never
copied app.API into the handler configuration, so GenerateHandlerMap built a
nil handler map in every http.handlers.cache instance: the souin API was
unreachable in-band on any listener — a PURGE/GET to /souin-api/* fell
through the cache handler as an ordinary request. Inherit the app-level API
(only when the handler config carries none of its own, which raw-JSON configs
still can) exactly like the other app-level defaults merged here.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jtelo88
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: FromApp inherits the app-level api {} config into site handlers - #142

Open
jtelo88 wants to merge 1 commit into
caddyserver:masterfrom
jtelo88:icl/fromapp-api-copy
Open

fix: FromApp inherits the app-level api {} config into site handlers#142
jtelo88 wants to merge 1 commit into
caddyserver:masterfrom
jtelo88:icl/fromapp-api-copy

Conversation

@jtelo88

Copy link
Copy Markdown

The Caddyfile api {} block is global-only (parseCaddyfileGlobalOption rejects it inside site blocks), but FromApp never copies app.API into the handler configuration. GenerateHandlerMap therefore sees a zero API config (nothing enabled) in every http.handlers.cache instance and returns nil — so the souin API is unreachable in-band on any listener: a PURGE/GET to /souin-api/* falls through the cache handler as an ordinary request (with no terminal handler after it, Caddy answers its default empty 200, which callers can easily mistake for success — we shipped a Surrogate-Key purge that silently no-oped for two months this way).

This copies the app-level API into the handler config exactly like the other app-level defaults merged in FromApp, guarded so a raw-JSON per-handler API config (still possible outside the Caddyfile adapter) keeps winning.

Verified end-to-end with a 3-listener Caddyfile (origin + public site + internal API listener): PURGE with Surrogate-Key now reaches the API (204) and evicts; before the patch the same request fell through with a 200.

Note for reviewers: since the cache directive orders before rewrite, once the API is genuinely served in-band, operators who relied on a later respond /souin-api* 404 to shield the API on public listeners must pin the order (e.g. a route block) — happy to add a README note if you want it in this PR.

The api {} block is global-only in the Caddyfile adapter, but FromApp never
copied app.API into the handler configuration, so GenerateHandlerMap built a
nil handler map in every http.handlers.cache instance: the souin API was
unreachable in-band on any listener — a PURGE/GET to /souin-api/* fell
through the cache handler as an ordinary request. Inherit the app-level API
(only when the handler config carries none of its own, which raw-JSON configs
still can) exactly like the other app-level defaults merged here.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jtelo88
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix: FromApp inherits the app-level api {} config into site handlers - #142

Open
jtelo88 wants to merge 1 commit into
caddyserver:masterfrom
jtelo88:icl/fromapp-api-copy
Open

fix: FromApp inherits the app-level api {} config into site handlers#142
jtelo88 wants to merge 1 commit into
caddyserver:masterfrom
jtelo88:icl/fromapp-api-copy

Conversation

@jtelo88

Copy link
Copy Markdown

The Caddyfile api {} block is global-only (parseCaddyfileGlobalOption rejects it inside site blocks), but FromApp never copies app.API into the handler configuration. GenerateHandlerMap therefore sees a zero API config (nothing enabled) in every http.handlers.cache instance and returns nil — so the souin API is unreachable in-band on any listener: a PURGE/GET to /souin-api/* falls through the cache handler as an ordinary request (with no terminal handler after it, Caddy answers its default empty 200, which callers can easily mistake for success — we shipped a Surrogate-Key purge that silently no-oped for two months this way).

This copies the app-level API into the handler config exactly like the other app-level defaults merged in FromApp, guarded so a raw-JSON per-handler API config (still possible outside the Caddyfile adapter) keeps winning.

Verified end-to-end with a 3-listener Caddyfile (origin + public site + internal API listener): PURGE with Surrogate-Key now reaches the API (204) and evicts; before the patch the same request fell through with a 200.

Note for reviewers: since the cache directive orders before rewrite, once the API is genuinely served in-band, operators who relied on a later respond /souin-api* 404 to shield the API on public listeners must pin the order (e.g. a route block) — happy to add a README note if you want it in this PR.

The api {} block is global-only in the Caddyfile adapter, but FromApp never
copied app.API into the handler configuration, so GenerateHandlerMap built a
nil handler map in every http.handlers.cache instance: the souin API was
unreachable in-band on any listener — a PURGE/GET to /souin-api/* fell
through the cache handler as an ordinary request. Inherit the app-level API
(only when the handler config carries none of its own, which raw-JSON configs
still can) exactly like the other app-level defaults merged here.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jtelo88