Blog posts
Forwarded Without Question: How Web Frameworks Overtrust the Forwarded Header
November 05, 2026 - 4954 words - 21 minsAt work, I was recently testing and deploying a new HTTPS reverse proxy service. I ran into some weirdness in how Envoy handles the X-Forwarded-For headers when it's configured not to trust the incoming values. I ended up configuring Envoy to just drop all incoming X-Forwarded-* and Forwarded headers, just to be safe.
But this got me thinking: would Envoy even do anything regarding the Forwarded header, if it's designed to mainly use the X-Forwarded-* family of headers? Are there web frameworks that would support both X-Forwarded-* and Forwarded and could this behaviour be abused?
Loopback UDP broadcasts and multiple listeners
October 19, 2025 - 708 words - 3 minsI ran into a situation where multiple processes needed to receive all UDP datagrams sent from a service running on the same host. The sender already set SO_BROADCAST, and I thought setting the target host to 127.255.255.255 should be enough to make things work. And of course, the clients must use the same host and specify SO_REUSEADDR so that they receive the packets. But the reason why this works is more interesting.
Enable Jetpack Compose Accessibility When Collecting Baseline Profiles
May 01, 2025 - 718 words - 4 minsHere's a small workaround that can be used to make Android Baseline Profile collection work better with Jetpack Compose apps. For some reason, Compose apps (at least with Compose version 1.8.0) don't emit accessibility events when running Macrobenchmarks (for example, when generating baseline profiles). With this workaround, they can be forced to be enabled, which makes a bunch of UI Automator functions work.
read moreWhy is Bitwarden returning 503s to my Windows app?
September 02, 2023 - 3581 words - 16 minsFor a few years now, I've been developing a TUI Bitwarden client app called Wden. While Bitwarden does not have a stable API for writing alternative clients, the APIs for the official clients have been pretty well documented by third parties. It's not too difficult to write a client against those, but it will occasionally break when Bitwarden makes changes to their servers.
Recently, I ran against a peculiar issue where Bitwarden started to consistently return errors to Wden, but only when running on Windows. There seemed to be no good explanation for this - the functionality is completely identical between platforms. I found the whole thing quite intriguing and I decided to write something about how I debugged the issue and worked around it.
read more