Skip to content

feat: improve IP parsing from X-Forwarded-For header#1940

Merged
0xERR0R merged 1 commit intomainfrom
fix-forwarded-header
Nov 20, 2025
Merged

feat: improve IP parsing from X-Forwarded-For header#1940
0xERR0R merged 1 commit intomainfrom
fix-forwarded-header

Conversation

@0xERR0R
Copy link
Copy Markdown
Owner

@0xERR0R 0xERR0R commented Nov 20, 2025

closes #1938

@0xERR0R 0xERR0R added this to the v0.29.0 milestone Nov 20, 2025
@0xERR0R 0xERR0R requested a review from Copilot November 20, 2025 19:53
@0xERR0R 0xERR0R added the 🐞 bug Something isn't working label Nov 20, 2025
@codecov
Copy link
Copy Markdown

codecov bot commented Nov 20, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 90.20%. Comparing base (605a361) to head (131629e).
⚠️ Report is 3 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #1940      +/-   ##
==========================================
+ Coverage   90.19%   90.20%   +0.01%     
==========================================
  Files          90       90              
  Lines        6434     6445      +11     
==========================================
+ Hits         5803     5814      +11     
  Misses        492      492              
  Partials      139      139              

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR enhances the HTTPClientIP function to properly parse comma-separated IP addresses from the X-Forwarded-For header, enabling accurate client IP extraction when the service is behind multiple proxies. The implementation adds robust handling for whitespace, multiple proxy chains, IPv6 addresses, and graceful fallback to RemoteAddr when the header is invalid or missing.

  • Improved X-Forwarded-For header parsing to extract the leftmost (original client) IP from comma-separated proxy chains
  • Added comprehensive test coverage for multiple edge cases including IPv6, whitespace handling, and invalid inputs
  • Introduced a helper function to split and trim comma-separated values

Reviewed Changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

File Description
util/http.go Added splitCommaSeparated helper function and enhanced HTTPClientIP to parse comma-separated X-Forwarded-For headers with proper whitespace handling and fallback logic
util/http_test.go Added 6 new test cases covering comma-separated IPs, extra whitespace, IPv6 addresses, invalid inputs, empty strings, and whitespace-only scenarios

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@0xERR0R 0xERR0R added the 🔨 enhancement New feature or request label Nov 20, 2025
@0xERR0R 0xERR0R merged commit e199445 into main Nov 20, 2025
26 checks passed
@0xERR0R 0xERR0R deleted the fix-forwarded-header branch November 20, 2025 19:59
alexlebens pushed a commit to alexlebens/infrastructure that referenced this pull request Feb 27, 2026
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [0xerr0r/blocky](https://github.com/0xerr0r/blocky) | minor | `v0.28.2` → `v0.29.0` |
| [ghcr.io/0xerr0r/blocky](https://github.com/0xERR0R/blocky) | minor | `v0.28.2` → `v0.29.0` |

---

### Release Notes

<details>
<summary>0xerr0r/blocky (0xerr0r/blocky)</summary>

### [`v0.29.0`](https://github.com/0xERR0R/blocky/releases/tag/v0.29.0)

[Compare Source](0xERR0R/blocky@v0.28.2...v0.29.0)

#### Changelog

##### Features

- [`0c35f21`](0xERR0R/blocky@0c35f21): feat: add RFC 7239 Forwarded header support for client IP parsing ([#&#8203;1941](0xERR0R/blocky#1941)) ([@&#8203;0xERR0R](https://github.com/0xERR0R))
- [`011e3eb`](0xERR0R/blocky@011e3eb): feat: implement DNS64 support ([#&#8203;1933](0xERR0R/blocky#1933)) ([@&#8203;0xERR0R](https://github.com/0xERR0R))
- [`e199445`](0xERR0R/blocky@e199445): feat: improve IP parsing from X-Forwarded-For header ([#&#8203;1940](0xERR0R/blocky#1940)) ([@&#8203;0xERR0R](https://github.com/0xERR0R))

##### Bug fixes

- [`257fe07`](0xERR0R/blocky@257fe07): fix: Incorrect rate data shown on Grafana dashboards ([#&#8203;1948](0xERR0R/blocky#1948)) ([@&#8203;mattdy](https://github.com/mattdy))
- [`1a4d22d`](0xERR0R/blocky@1a4d22d): fix: db automigration with timescaledb ([#&#8203;1975](0xERR0R/blocky#1975)) ([@&#8203;manofthepeace](https://github.com/manofthepeace))
- [`9874212`](0xERR0R/blocky@9874212): fix: use context based versions of net.Listen and net.Dial ([#&#8203;1952](0xERR0R/blocky#1952)) ([@&#8203;sonjek](https://github.com/sonjek))

##### Build and dependencies

- [`fe67404`](0xERR0R/blocky@fe67404): build(deps): bump actions/checkout from 5 to 6 ([#&#8203;1943](0xERR0R/blocky#1943)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`4752061`](0xERR0R/blocky@4752061): build(deps): bump actions/download-artifact from 6 to 7 ([#&#8203;1961](0xERR0R/blocky#1961)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`d459311`](0xERR0R/blocky@d459311): build(deps): bump actions/download-artifact from 7 to 8 ([#&#8203;2000](0xERR0R/blocky#2000)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`fa1614b`](0xERR0R/blocky@fa1614b): build(deps): bump actions/upload-artifact from 5 to 6 ([#&#8203;1960](0xERR0R/blocky#1960)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`11b6f92`](0xERR0R/blocky@11b6f92): build(deps): bump actions/upload-artifact from 6 to 7 ([#&#8203;1998](0xERR0R/blocky#1998)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`e83805c`](0xERR0R/blocky@e83805c): build(deps): bump filippo.io/edwards25519 from 1.1.0 to 1.1.1 ([#&#8203;1992](0xERR0R/blocky#1992)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`4f62ec8`](0xERR0R/blocky@4f62ec8): build(deps): bump github.com/alicebob/miniredis/v2 from 2.35.0 to 2.36.0 ([#&#8203;1976](0xERR0R/blocky#1976)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`16644c5`](0xERR0R/blocky@16644c5): build(deps): bump github.com/alicebob/miniredis/v2 from 2.36.0 to 2.36.1 ([#&#8203;1978](0xERR0R/blocky#1978)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`36ae188`](0xERR0R/blocky@36ae188): build(deps): bump github.com/alicebob/miniredis/v2 from 2.36.1 to 2.37.0 ([#&#8203;1996](0xERR0R/blocky#1996)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`4733c6b`](0xERR0R/blocky@4733c6b): build(deps): bump github.com/breml/rootcerts from 0.3.3 to 0.3.4 ([#&#8203;1987](0xERR0R/blocky#1987)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`e4f7462`](0xERR0R/blocky@e4f7462): build(deps): bump github.com/go-chi/chi/v5 from 5.2.3 to 5.2.4 ([#&#8203;1972](0xERR0R/blocky#1972)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`f9dd4d2`](0xERR0R/blocky@f9dd4d2): build(deps): bump github.com/go-chi/chi/v5 from 5.2.4 to 5.2.5 ([#&#8203;1985](0xERR0R/blocky#1985)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`e66a29d`](0xERR0R/blocky@e66a29d): build(deps): bump github.com/miekg/dns from 1.1.68 to 1.1.69 ([#&#8203;1959](0xERR0R/blocky#1959)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`8e69355`](0xERR0R/blocky@8e69355): build(deps): bump github.com/miekg/dns from 1.1.69 to 1.1.70 ([#&#8203;1968](0xERR0R/blocky#1968)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`5e8b555`](0xERR0R/blocky@5e8b555): build(deps): bump github.com/miekg/dns from 1.1.70 to 1.1.72 ([#&#8203;1977](0xERR0R/blocky#1977)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`ef5dc97`](0xERR0R/blocky@ef5dc97): build(deps): bump github.com/onsi/ginkgo/v2 from 2.27.2 to 2.27.3 ([#&#8203;1956](0xERR0R/blocky#1956)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`670542b`](0xERR0R/blocky@670542b): build(deps): bump github.com/onsi/ginkgo/v2 from 2.27.3 to 2.27.4 ([#&#8203;1966](0xERR0R/blocky#1966)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`e062742`](0xERR0R/blocky@e062742): build(deps): bump github.com/onsi/ginkgo/v2 from 2.27.4 to 2.27.5 ([#&#8203;1970](0xERR0R/blocky#1970)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`4926d16`](0xERR0R/blocky@4926d16): build(deps): bump github.com/onsi/ginkgo/v2 from 2.27.5 to 2.28.1 ([#&#8203;1981](0xERR0R/blocky#1981)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`ca0da10`](0xERR0R/blocky@ca0da10): build(deps): bump github.com/onsi/gomega from 1.38.2 to 1.38.3 ([#&#8203;1955](0xERR0R/blocky#1955)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`567a738`](0xERR0R/blocky@567a738): build(deps): bump github.com/onsi/gomega from 1.38.3 to 1.39.0 ([#&#8203;1967](0xERR0R/blocky#1967)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`c3aab87`](0xERR0R/blocky@c3aab87): build(deps): bump github.com/onsi/gomega from 1.39.0 to 1.39.1 ([#&#8203;1982](0xERR0R/blocky#1982)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`ef79a67`](0xERR0R/blocky@ef79a67): build(deps): bump github.com/sirupsen/logrus from 1.9.3 to 1.9.4 ([#&#8203;1974](0xERR0R/blocky#1974)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`6775759`](0xERR0R/blocky@6775759): build(deps): bump github.com/spf13/cobra from 1.10.1 to 1.10.2 ([#&#8203;1953](0xERR0R/blocky#1953)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`71c39fc`](0xERR0R/blocky@71c39fc): build(deps): bump golang.org/x/crypto from 0.44.0 to 0.45.0 ([#&#8203;1939](0xERR0R/blocky#1939)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`be31648`](0xERR0R/blocky@be31648): build(deps): bump golang.org/x/net from 0.47.0 to 0.48.0 ([#&#8203;1957](0xERR0R/blocky#1957)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`a574078`](0xERR0R/blocky@a574078): build(deps): bump golang.org/x/net from 0.48.0 to 0.49.0 ([#&#8203;1971](0xERR0R/blocky#1971)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`6f3f295`](0xERR0R/blocky@6f3f295): build(deps): bump golang.org/x/net from 0.49.0 to 0.50.0 ([#&#8203;1988](0xERR0R/blocky#1988)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`6a75afb`](0xERR0R/blocky@6a75afb): build(deps): bump golang.org/x/net from 0.50.0 to 0.51.0 ([#&#8203;1997](0xERR0R/blocky#1997)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])

##### Misc

- [`439e99b`](0xERR0R/blocky@439e99b): Add Blocky Visor to web UIs section in installation.md ([#&#8203;1993](0xERR0R/blocky#1993)) ([@&#8203;JCHHeilmann](https://github.com/JCHHeilmann))
- [`ced469f`](0xERR0R/blocky@ced469f): refactor: centralize DNS response creation logic with helper functions ([#&#8203;1942](0xERR0R/blocky#1942)) ([@&#8203;0xERR0R](https://github.com/0xERR0R))
- [`3075c38`](0xERR0R/blocky@3075c38): refactor: clean up obsolete Go syntax ([#&#8203;1951](0xERR0R/blocky#1951)) ([@&#8203;sonjek](https://github.com/sonjek))
- [`9fe42a8`](0xERR0R/blocky@9fe42a8): refactor: simplify code for improved readability and maintainability ([#&#8203;1945](0xERR0R/blocky#1945)) ([@&#8203;0xERR0R](https://github.com/0xERR0R))
- [`6581668`](0xERR0R/blocky@6581668): refactor: use mockery for mocks ([#&#8203;1944](0xERR0R/blocky#1944)) ([@&#8203;0xERR0R](https://github.com/0xERR0R))
- [`55ab95e`](0xERR0R/blocky@55ab95e): test(metrics): Prometheus metrics ([#&#8203;1868](0xERR0R/blocky#1868)) ([@&#8203;zeilenschubser](https://github.com/zeilenschubser))

</details>

<details>
<summary>0xERR0R/blocky (ghcr.io/0xerr0r/blocky)</summary>

### [`v0.29.0`](https://github.com/0xERR0R/blocky/releases/tag/v0.29.0)

[Compare Source](0xERR0R/blocky@v0.28.2...v0.29.0)

#### Changelog

##### Features

- [`0c35f21`](0xERR0R/blocky@0c35f21): feat: add RFC 7239 Forwarded header support for client IP parsing ([#&#8203;1941](0xERR0R/blocky#1941)) ([@&#8203;0xERR0R](https://github.com/0xERR0R))
- [`011e3eb`](0xERR0R/blocky@011e3eb): feat: implement DNS64 support ([#&#8203;1933](0xERR0R/blocky#1933)) ([@&#8203;0xERR0R](https://github.com/0xERR0R))
- [`e199445`](0xERR0R/blocky@e199445): feat: improve IP parsing from X-Forwarded-For header ([#&#8203;1940](0xERR0R/blocky#1940)) ([@&#8203;0xERR0R](https://github.com/0xERR0R))

##### Bug fixes

- [`257fe07`](0xERR0R/blocky@257fe07): fix: Incorrect rate data shown on Grafana dashboards ([#&#8203;1948](0xERR0R/blocky#1948)) ([@&#8203;mattdy](https://github.com/mattdy))
- [`1a4d22d`](0xERR0R/blocky@1a4d22d): fix: db automigration with timescaledb ([#&#8203;1975](0xERR0R/blocky#1975)) ([@&#8203;manofthepeace](https://github.com/manofthepeace))
- [`9874212`](0xERR0R/blocky@9874212): fix: use context based versions of net.Listen and net.Dial ([#&#8203;1952](0xERR0R/blocky#1952)) ([@&#8203;sonjek](https://github.com/sonjek))

##### Build and dependencies

- [`fe67404`](0xERR0R/blocky@fe67404): build(deps): bump actions/checkout from 5 to 6 ([#&#8203;1943](0xERR0R/blocky#1943)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`4752061`](0xERR0R/blocky@4752061): build(deps): bump actions/download-artifact from 6 to 7 ([#&#8203;1961](0xERR0R/blocky#1961)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`d459311`](0xERR0R/blocky@d459311): build(deps): bump actions/download-artifact from 7 to 8 ([#&#8203;2000](0xERR0R/blocky#2000)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`fa1614b`](0xERR0R/blocky@fa1614b): build(deps): bump actions/upload-artifact from 5 to 6 ([#&#8203;1960](0xERR0R/blocky#1960)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`11b6f92`](0xERR0R/blocky@11b6f92): build(deps): bump actions/upload-artifact from 6 to 7 ([#&#8203;1998](0xERR0R/blocky#1998)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`e83805c`](0xERR0R/blocky@e83805c): build(deps): bump filippo.io/edwards25519 from 1.1.0 to 1.1.1 ([#&#8203;1992](0xERR0R/blocky#1992)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`4f62ec8`](0xERR0R/blocky@4f62ec8): build(deps): bump github.com/alicebob/miniredis/v2 from 2.35.0 to 2.36.0 ([#&#8203;1976](0xERR0R/blocky#1976)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`16644c5`](0xERR0R/blocky@16644c5): build(deps): bump github.com/alicebob/miniredis/v2 from 2.36.0 to 2.36.1 ([#&#8203;1978](0xERR0R/blocky#1978)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`36ae188`](0xERR0R/blocky@36ae188): build(deps): bump github.com/alicebob/miniredis/v2 from 2.36.1 to 2.37.0 ([#&#8203;1996](0xERR0R/blocky#1996)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`4733c6b`](0xERR0R/blocky@4733c6b): build(deps): bump github.com/breml/rootcerts from 0.3.3 to 0.3.4 ([#&#8203;1987](0xERR0R/blocky#1987)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`e4f7462`](0xERR0R/blocky@e4f7462): build(deps): bump github.com/go-chi/chi/v5 from 5.2.3 to 5.2.4 ([#&#8203;1972](0xERR0R/blocky#1972)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`f9dd4d2`](0xERR0R/blocky@f9dd4d2): build(deps): bump github.com/go-chi/chi/v5 from 5.2.4 to 5.2.5 ([#&#8203;1985](0xERR0R/blocky#1985)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`e66a29d`](0xERR0R/blocky@e66a29d): build(deps): bump github.com/miekg/dns from 1.1.68 to 1.1.69 ([#&#8203;1959](0xERR0R/blocky#1959)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`8e69355`](0xERR0R/blocky@8e69355): build(deps): bump github.com/miekg/dns from 1.1.69 to 1.1.70 ([#&#8203;1968](0xERR0R/blocky#1968)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`5e8b555`](0xERR0R/blocky@5e8b555): build(deps): bump github.com/miekg/dns from 1.1.70 to 1.1.72 ([#&#8203;1977](0xERR0R/blocky#1977)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`ef5dc97`](0xERR0R/blocky@ef5dc97): build(deps): bump github.com/onsi/ginkgo/v2 from 2.27.2 to 2.27.3 ([#&#8203;1956](0xERR0R/blocky#1956)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`670542b`](0xERR0R/blocky@670542b): build(deps): bump github.com/onsi/ginkgo/v2 from 2.27.3 to 2.27.4 ([#&#8203;1966](0xERR0R/blocky#1966)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`e062742`](0xERR0R/blocky@e062742): build(deps): bump github.com/onsi/ginkgo/v2 from 2.27.4 to 2.27.5 ([#&#8203;1970](0xERR0R/blocky#1970)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`4926d16`](0xERR0R/blocky@4926d16): build(deps): bump github.com/onsi/ginkgo/v2 from 2.27.5 to 2.28.1 ([#&#8203;1981](0xERR0R/blocky#1981)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`ca0da10`](0xERR0R/blocky@ca0da10): build(deps): bump github.com/onsi/gomega from 1.38.2 to 1.38.3 ([#&#8203;1955](0xERR0R/blocky#1955)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`567a738`](0xERR0R/blocky@567a738): build(deps): bump github.com/onsi/gomega from 1.38.3 to 1.39.0 ([#&#8203;1967](0xERR0R/blocky#1967)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`c3aab87`](0xERR0R/blocky@c3aab87): build(deps): bump github.com/onsi/gomega from 1.39.0 to 1.39.1 ([#&#8203;1982](0xERR0R/blocky#1982)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`ef79a67`](0xERR0R/blocky@ef79a67): build(deps): bump github.com/sirupsen/logrus from 1.9.3 to 1.9.4 ([#&#8203;1974](0xERR0R/blocky#1974)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`6775759`](0xERR0R/blocky@6775759): build(deps): bump github.com/spf13/cobra from 1.10.1 to 1.10.2 ([#&#8203;1953](0xERR0R/blocky#1953)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`71c39fc`](0xERR0R/blocky@71c39fc): build(deps): bump golang.org/x/crypto from 0.44.0 to 0.45.0 ([#&#8203;1939](0xERR0R/blocky#1939)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`be31648`](0xERR0R/blocky@be31648): build(deps): bump golang.org/x/net from 0.47.0 to 0.48.0 ([#&#8203;1957](0xERR0R/blocky#1957)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`a574078`](0xERR0R/blocky@a574078): build(deps): bump golang.org/x/net from 0.48.0 to 0.49.0 ([#&#8203;1971](0xERR0R/blocky#1971)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`6f3f295`](0xERR0R/blocky@6f3f295): build(deps): bump golang.org/x/net from 0.49.0 to 0.50.0 ([#&#8203;1988](0xERR0R/blocky#1988)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`6a75afb`](0xERR0R/blocky@6a75afb): build(deps): bump golang.org/x/net from 0.50.0 to 0.51.0 ([#&#8203;1997](0xERR0R/blocky#1997)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])

##### Misc

- [`439e99b`](0xERR0R/blocky@439e99b): Add Blocky Visor to web UIs section in installation.md ([#&#8203;1993](0xERR0R/blocky#1993)) ([@&#8203;JCHHeilmann](https://github.com/JCHHeilmann))
- [`ced469f`](0xERR0R/blocky@ced469f): refactor: centralize DNS response creation logic with helper functions ([#&#8203;1942](0xERR0R/blocky#1942)) ([@&#8203;0xERR0R](https://github.com/0xERR0R))
- [`3075c38`](0xERR0R/blocky@3075c38): refactor: clean up obsolete Go syntax ([#&#8203;1951](0xERR0R/blocky#1951)) ([@&#8203;sonjek](https://github.com/sonjek))
- [`9fe42a8`](0xERR0R/blocky@9fe42a8): refactor: simplify code for improved readability and maintainability ([#&#8203;1945](0xERR0R/blocky#1945)) ([@&#8203;0xERR0R](https://github.com/0xERR0R))
- [`6581668`](0xERR0R/blocky@6581668): refactor: use mockery for mocks ([#&#8203;1944](0xERR0R/blocky#1944)) ([@&#8203;0xERR0R](https://github.com/0xERR0R))
- [`55ab95e`](0xERR0R/blocky@55ab95e): test(metrics): Prometheus metrics ([#&#8203;1868](0xERR0R/blocky#1868)) ([@&#8203;zeilenschubser](https://github.com/zeilenschubser))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNS44IiwidXBkYXRlZEluVmVyIjoiNDMuMjUuOCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/4282
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
alexlebens pushed a commit to alexlebens/infrastructure that referenced this pull request Feb 27, 2026
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/0xerr0r/blocky](https://github.com/0xERR0R/blocky) | minor | `v0.28.2` → `v0.29.0` |

---

### Release Notes

<details>
<summary>0xERR0R/blocky (ghcr.io/0xerr0r/blocky)</summary>

### [`v0.29.0`](https://github.com/0xERR0R/blocky/releases/tag/v0.29.0)

[Compare Source](0xERR0R/blocky@v0.28.2...v0.29.0)

#### Changelog

##### Features

- [`0c35f21`](0xERR0R/blocky@0c35f21): feat: add RFC 7239 Forwarded header support for client IP parsing ([#&#8203;1941](0xERR0R/blocky#1941)) ([@&#8203;0xERR0R](https://github.com/0xERR0R))
- [`011e3eb`](0xERR0R/blocky@011e3eb): feat: implement DNS64 support ([#&#8203;1933](0xERR0R/blocky#1933)) ([@&#8203;0xERR0R](https://github.com/0xERR0R))
- [`e199445`](0xERR0R/blocky@e199445): feat: improve IP parsing from X-Forwarded-For header ([#&#8203;1940](0xERR0R/blocky#1940)) ([@&#8203;0xERR0R](https://github.com/0xERR0R))

##### Bug fixes

- [`257fe07`](0xERR0R/blocky@257fe07): fix: Incorrect rate data shown on Grafana dashboards ([#&#8203;1948](0xERR0R/blocky#1948)) ([@&#8203;mattdy](https://github.com/mattdy))
- [`1a4d22d`](0xERR0R/blocky@1a4d22d): fix: db automigration with timescaledb ([#&#8203;1975](0xERR0R/blocky#1975)) ([@&#8203;manofthepeace](https://github.com/manofthepeace))
- [`9874212`](0xERR0R/blocky@9874212): fix: use context based versions of net.Listen and net.Dial ([#&#8203;1952](0xERR0R/blocky#1952)) ([@&#8203;sonjek](https://github.com/sonjek))

##### Build and dependencies

- [`fe67404`](0xERR0R/blocky@fe67404): build(deps): bump actions/checkout from 5 to 6 ([#&#8203;1943](0xERR0R/blocky#1943)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`4752061`](0xERR0R/blocky@4752061): build(deps): bump actions/download-artifact from 6 to 7 ([#&#8203;1961](0xERR0R/blocky#1961)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`d459311`](0xERR0R/blocky@d459311): build(deps): bump actions/download-artifact from 7 to 8 ([#&#8203;2000](0xERR0R/blocky#2000)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`fa1614b`](0xERR0R/blocky@fa1614b): build(deps): bump actions/upload-artifact from 5 to 6 ([#&#8203;1960](0xERR0R/blocky#1960)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`11b6f92`](0xERR0R/blocky@11b6f92): build(deps): bump actions/upload-artifact from 6 to 7 ([#&#8203;1998](0xERR0R/blocky#1998)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`e83805c`](0xERR0R/blocky@e83805c): build(deps): bump filippo.io/edwards25519 from 1.1.0 to 1.1.1 ([#&#8203;1992](0xERR0R/blocky#1992)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`4f62ec8`](0xERR0R/blocky@4f62ec8): build(deps): bump github.com/alicebob/miniredis/v2 from 2.35.0 to 2.36.0 ([#&#8203;1976](0xERR0R/blocky#1976)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`16644c5`](0xERR0R/blocky@16644c5): build(deps): bump github.com/alicebob/miniredis/v2 from 2.36.0 to 2.36.1 ([#&#8203;1978](0xERR0R/blocky#1978)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`36ae188`](0xERR0R/blocky@36ae188): build(deps): bump github.com/alicebob/miniredis/v2 from 2.36.1 to 2.37.0 ([#&#8203;1996](0xERR0R/blocky#1996)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`4733c6b`](0xERR0R/blocky@4733c6b): build(deps): bump github.com/breml/rootcerts from 0.3.3 to 0.3.4 ([#&#8203;1987](0xERR0R/blocky#1987)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`e4f7462`](0xERR0R/blocky@e4f7462): build(deps): bump github.com/go-chi/chi/v5 from 5.2.3 to 5.2.4 ([#&#8203;1972](0xERR0R/blocky#1972)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`f9dd4d2`](0xERR0R/blocky@f9dd4d2): build(deps): bump github.com/go-chi/chi/v5 from 5.2.4 to 5.2.5 ([#&#8203;1985](0xERR0R/blocky#1985)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`e66a29d`](0xERR0R/blocky@e66a29d): build(deps): bump github.com/miekg/dns from 1.1.68 to 1.1.69 ([#&#8203;1959](0xERR0R/blocky#1959)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`8e69355`](0xERR0R/blocky@8e69355): build(deps): bump github.com/miekg/dns from 1.1.69 to 1.1.70 ([#&#8203;1968](0xERR0R/blocky#1968)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`5e8b555`](0xERR0R/blocky@5e8b555): build(deps): bump github.com/miekg/dns from 1.1.70 to 1.1.72 ([#&#8203;1977](0xERR0R/blocky#1977)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`ef5dc97`](0xERR0R/blocky@ef5dc97): build(deps): bump github.com/onsi/ginkgo/v2 from 2.27.2 to 2.27.3 ([#&#8203;1956](0xERR0R/blocky#1956)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`670542b`](0xERR0R/blocky@670542b): build(deps): bump github.com/onsi/ginkgo/v2 from 2.27.3 to 2.27.4 ([#&#8203;1966](0xERR0R/blocky#1966)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`e062742`](0xERR0R/blocky@e062742): build(deps): bump github.com/onsi/ginkgo/v2 from 2.27.4 to 2.27.5 ([#&#8203;1970](0xERR0R/blocky#1970)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`4926d16`](0xERR0R/blocky@4926d16): build(deps): bump github.com/onsi/ginkgo/v2 from 2.27.5 to 2.28.1 ([#&#8203;1981](0xERR0R/blocky#1981)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`ca0da10`](0xERR0R/blocky@ca0da10): build(deps): bump github.com/onsi/gomega from 1.38.2 to 1.38.3 ([#&#8203;1955](0xERR0R/blocky#1955)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`567a738`](0xERR0R/blocky@567a738): build(deps): bump github.com/onsi/gomega from 1.38.3 to 1.39.0 ([#&#8203;1967](0xERR0R/blocky#1967)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`c3aab87`](0xERR0R/blocky@c3aab87): build(deps): bump github.com/onsi/gomega from 1.39.0 to 1.39.1 ([#&#8203;1982](0xERR0R/blocky#1982)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`ef79a67`](0xERR0R/blocky@ef79a67): build(deps): bump github.com/sirupsen/logrus from 1.9.3 to 1.9.4 ([#&#8203;1974](0xERR0R/blocky#1974)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`6775759`](0xERR0R/blocky@6775759): build(deps): bump github.com/spf13/cobra from 1.10.1 to 1.10.2 ([#&#8203;1953](0xERR0R/blocky#1953)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`71c39fc`](0xERR0R/blocky@71c39fc): build(deps): bump golang.org/x/crypto from 0.44.0 to 0.45.0 ([#&#8203;1939](0xERR0R/blocky#1939)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`be31648`](0xERR0R/blocky@be31648): build(deps): bump golang.org/x/net from 0.47.0 to 0.48.0 ([#&#8203;1957](0xERR0R/blocky#1957)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`a574078`](0xERR0R/blocky@a574078): build(deps): bump golang.org/x/net from 0.48.0 to 0.49.0 ([#&#8203;1971](0xERR0R/blocky#1971)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`6f3f295`](0xERR0R/blocky@6f3f295): build(deps): bump golang.org/x/net from 0.49.0 to 0.50.0 ([#&#8203;1988](0xERR0R/blocky#1988)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`6a75afb`](0xERR0R/blocky@6a75afb): build(deps): bump golang.org/x/net from 0.50.0 to 0.51.0 ([#&#8203;1997](0xERR0R/blocky#1997)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])

##### Misc

- [`439e99b`](0xERR0R/blocky@439e99b): Add Blocky Visor to web UIs section in installation.md ([#&#8203;1993](0xERR0R/blocky#1993)) ([@&#8203;JCHHeilmann](https://github.com/JCHHeilmann))
- [`ced469f`](0xERR0R/blocky@ced469f): refactor: centralize DNS response creation logic with helper functions ([#&#8203;1942](0xERR0R/blocky#1942)) ([@&#8203;0xERR0R](https://github.com/0xERR0R))
- [`3075c38`](0xERR0R/blocky@3075c38): refactor: clean up obsolete Go syntax ([#&#8203;1951](0xERR0R/blocky#1951)) ([@&#8203;sonjek](https://github.com/sonjek))
- [`9fe42a8`](0xERR0R/blocky@9fe42a8): refactor: simplify code for improved readability and maintainability ([#&#8203;1945](0xERR0R/blocky#1945)) ([@&#8203;0xERR0R](https://github.com/0xERR0R))
- [`6581668`](0xERR0R/blocky@6581668): refactor: use mockery for mocks ([#&#8203;1944](0xERR0R/blocky#1944)) ([@&#8203;0xERR0R](https://github.com/0xERR0R))
- [`55ab95e`](0xERR0R/blocky@55ab95e): test(metrics): Prometheus metrics ([#&#8203;1868](0xERR0R/blocky#1868)) ([@&#8203;zeilenschubser](https://github.com/zeilenschubser))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNS44IiwidXBkYXRlZEluVmVyIjoiNDMuMjUuOCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/4283
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🐞 bug Something isn't working 🔨 enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

http incorrect parsing of x-forwarded-for

2 participants