feat: Cloudflare Worker proxy for Microsoft API + Back button fix + favicon #7

Merged
starkSV merged 1 commit from feat/cf-worker-proxy into main 2026-05-18 12:07:42 +05:30
starkSV commented 2026-05-18 12:06:52 +05:30 (Migrated from github.com)

Changes

fix: Back button navigates to external referrer (#5)

When users land directly on a product URL from an external source, the
Back button now always returns to the home page instead of the external
referrer. Uses window.history.state?.idx to detect whether prior
in-app history exists before calling navigate(-1).

feat: Cloudflare Worker proxy to avoid Microsoft IP blocks (#6)

The Go backend now routes all Microsoft API calls through a Cloudflare
Worker (cloudflare-worker/worker.js) when CF_WORKER_URL is set.
Cloudflare's distributed edge IPs prevent any single IP from accumulating
enough request volume to trigger Microsoft's block (error 715-123130).

The Worker is protected by a shared secret (CF_WORKER_SECRET) so only
the backend can use it. Self-hosters can omit both env vars to keep the
existing direct-to-Microsoft behaviour.

Required env vars on the backend:

  • CF_WORKER_URL — your deployed Worker URL
  • CF_WORKER_SECRET — must match the secret set in the Worker's settings

fix: Add favicon

Closes #5, Closes #6

Summary by CodeRabbit

  • Bug Fixes
    • Fixed "Back" button navigation in the product detail page to correctly preserve browser history state.

Review Change Stack

## Changes ### fix: Back button navigates to external referrer (#5) When users land directly on a product URL from an external source, the Back button now always returns to the home page instead of the external referrer. Uses `window.history.state?.idx` to detect whether prior in-app history exists before calling `navigate(-1)`. ### feat: Cloudflare Worker proxy to avoid Microsoft IP blocks (#6) The Go backend now routes all Microsoft API calls through a Cloudflare Worker (`cloudflare-worker/worker.js`) when `CF_WORKER_URL` is set. Cloudflare's distributed edge IPs prevent any single IP from accumulating enough request volume to trigger Microsoft's block (error 715-123130). The Worker is protected by a shared secret (`CF_WORKER_SECRET`) so only the backend can use it. Self-hosters can omit both env vars to keep the existing direct-to-Microsoft behaviour. **Required env vars on the backend:** - `CF_WORKER_URL` — your deployed Worker URL - `CF_WORKER_SECRET` — must match the secret set in the Worker's settings ### fix: Add favicon Closes #5, Closes #6 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Fixed "Back" button navigation in the product detail page to correctly preserve browser history state. <!-- review_stack_entry_start --> [![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/starkSV/windows-iso-downloader/pull/7?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack) <!-- review_stack_entry_end --> <!-- end of auto-generated comment: release notes by coderabbit.ai -->
coderabbitai[bot] commented 2026-05-18 12:07:02 +05:30 (Migrated from github.com)

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 4c70f498-232c-4963-9994-e618225d8165

📥 Commits

Reviewing files that changed from the base of the PR and between a8f9ba1da1 and 8b036e94ba.

Files ignored due to path filters (1)
  • frontend/public/favicon.ico is excluded by !**/*.ico
📒 Files selected for processing (3)
  • backend/main.go
  • cloudflare-worker/worker.js
  • frontend/src/pages/ProductDetailPage.tsx

📝 Walkthrough

Walkthrough

PR adds Cloudflare Worker proxy routing for Microsoft API calls to distribute outbound traffic across edge IPs instead of a single server IP, preventing rate-limiting blocks. Backend imports os, defines proxy helpers (setWorkerSecret, proxyURL), and applies them to setupSession, /skuinfo, and /proxy handlers. New Cloudflare Worker validates secret headers and forwards allowed hosts. Frontend back button now falls back to home when no in-app history exists.

Changes

Cloudflare Worker Proxy Infrastructure

Layer / File(s) Summary
Worker environment and proxy helpers
backend/main.go
Adds os import, reads CF_WORKER_SECRET, and defines setWorkerSecret function to conditionally set X-Worker-Secret header and proxyURL function to rewrite Microsoft URLs through CF_WORKER_URL with original hostname as host query parameter.
setupSession proxy integration
backend/main.go
Updates setupSession steps 1-3 (tags, mdt.js, fingerprint) to use proxyURL for URL construction and apply setWorkerSecret to each request.
/skuinfo handler proxy integration
backend/main.go
Modifies /skuinfo handler to build getskuinformationbyproductedition request URL via proxyURL and apply setWorkerSecret to outbound requests.
/proxy handler proxy integration
backend/main.go
Updates /proxy handler warmup and main GetProductDownloadLinksBySku calls to use proxyURL and apply setWorkerSecret.
Cloudflare Worker reverse proxy
cloudflare-worker/worker.js
Implements async fetch handler that validates X-Worker-Secret header, enforces allowlisted upstream hosts, rewrites URLs to remove host parameter, forwards method and headers, and returns response with CORS headers and Content-Type fallback.

Frontend Navigation Fix

Layer / File(s) Summary
Back button fallback logic
frontend/src/pages/ProductDetailPage.tsx
Changes back button to navigate to previous history entry when window.history.state?.idx is present, otherwise falls back to navigating to / instead of always using navigate(-1).

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

A Worker takes flight on Cloudflare's edge,
Spreading requests wide—no single IP pledge,
setupSession and skuinfo now proxy their way,
While the Back button knows the home-bound way! 🐰

Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/cf-worker-proxy

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 golangci-lint (2.12.2)

level=error msg="[linters_context] typechecking error: pattern ./...: directory prefix . does not contain main module or its selected dependencies"


Comment @coderabbitai help to get the list of available commands and usage tips.

<!-- This is an auto-generated comment: summarize by coderabbit.ai --> <!-- This is an auto-generated comment: failure by coderabbit.ai --> > [!CAUTION] > ## Review failed > > The pull request is closed. <!-- end of auto-generated comment: failure by coderabbit.ai --> <details> <summary>ℹ️ Recent review info</summary> <details> <summary>⚙️ Run configuration</summary> **Configuration used**: defaults **Review profile**: CHILL **Plan**: Pro Plus **Run ID**: `4c70f498-232c-4963-9994-e618225d8165` </details> <details> <summary>📥 Commits</summary> Reviewing files that changed from the base of the PR and between a8f9ba1da1e17a5bd802bd37a3d380c819189095 and 8b036e94ba0236ea306407f8e95b1536fc0b9781. </details> <details> <summary>⛔ Files ignored due to path filters (1)</summary> * `frontend/public/favicon.ico` is excluded by `!**/*.ico` </details> <details> <summary>📒 Files selected for processing (3)</summary> * `backend/main.go` * `cloudflare-worker/worker.js` * `frontend/src/pages/ProductDetailPage.tsx` </details> </details> --- <!-- walkthrough_start --> <details> <summary>📝 Walkthrough</summary> ## Walkthrough PR adds Cloudflare Worker proxy routing for Microsoft API calls to distribute outbound traffic across edge IPs instead of a single server IP, preventing rate-limiting blocks. Backend imports `os`, defines proxy helpers (`setWorkerSecret`, `proxyURL`), and applies them to setupSession, /skuinfo, and /proxy handlers. New Cloudflare Worker validates secret headers and forwards allowed hosts. Frontend back button now falls back to home when no in-app history exists. ## Changes **Cloudflare Worker Proxy Infrastructure** | Layer / File(s) | Summary | | --- | --- | | **Worker environment and proxy helpers** <br> `backend/main.go` | Adds `os` import, reads `CF_WORKER_SECRET`, and defines `setWorkerSecret` function to conditionally set `X-Worker-Secret` header and `proxyURL` function to rewrite Microsoft URLs through `CF_WORKER_URL` with original hostname as `host` query parameter. | | **setupSession proxy integration** <br> `backend/main.go` | Updates setupSession steps 1-3 (tags, mdt.js, fingerprint) to use `proxyURL` for URL construction and apply `setWorkerSecret` to each request. | | **/skuinfo handler proxy integration** <br> `backend/main.go` | Modifies /skuinfo handler to build getskuinformationbyproductedition request URL via `proxyURL` and apply `setWorkerSecret` to outbound requests. | | **/proxy handler proxy integration** <br> `backend/main.go` | Updates /proxy handler warmup and main GetProductDownloadLinksBySku calls to use `proxyURL` and apply `setWorkerSecret`. | | **Cloudflare Worker reverse proxy** <br> `cloudflare-worker/worker.js` | Implements async fetch handler that validates `X-Worker-Secret` header, enforces allowlisted upstream hosts, rewrites URLs to remove host parameter, forwards method and headers, and returns response with CORS headers and Content-Type fallback. | **Frontend Navigation Fix** | Layer / File(s) | Summary | | --- | --- | | **Back button fallback logic** <br> `frontend/src/pages/ProductDetailPage.tsx` | Changes back button to navigate to previous history entry when `window.history.state?.idx` is present, otherwise falls back to navigating to `/` instead of always using `navigate(-1)`. | ## Estimated code review effort 🎯 3 (Moderate) | ⏱️ ~25 minutes ## Poem > A Worker takes flight on Cloudflare's edge, > Spreading requests wide—no single IP pledge, > setupSession and skuinfo now proxy their way, > While the Back button knows the home-bound way! 🐰✨ </details> <!-- walkthrough_end --> <!-- finishing_touch_checkbox_start --> <details> <summary>✨ Finishing Touches</summary> <details> <summary>📝 Generate docstrings</summary> - [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> Create stacked PR - [ ] <!-- {"checkboxId": "3e1879ae-f29b-4d0d-8e06-d12b7ba33d98"} --> Commit on current branch </details> <details> <summary>🧪 Generate unit tests (beta)</summary> - [ ] <!-- {"checkboxId": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} --> Create PR with unit tests - [ ] <!-- {"checkboxId": "6ba7b810-9dad-11d1-80b4-00c04fd430c8", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} --> Commit unit tests in branch `feat/cf-worker-proxy` </details> </details> <!-- finishing_touch_checkbox_end --> <!-- This is an auto-generated comment: all tool run failures by coderabbit.ai --> > [!WARNING] > There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure. > > <details> > <summary>🔧 golangci-lint (2.12.2)</summary> > > level=error msg="[linters_context] typechecking error: pattern ./...: directory prefix . does not contain main module or its selected dependencies" > > > > > </details> <!-- end of auto-generated comment: all tool run failures by coderabbit.ai --> <!-- tips_start --> --- <sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub> <!-- tips_end --> <!-- internal state start --> <!-- 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 --> <!-- internal state end -->
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: shekhar/windows-iso-downloader#7
No description provided.