Introducing Request Mirror: a free micro-service to reflect HTTP requests Published on September 22, 2025 by Freek Van der Herten @freekmurze Freek Van der Herten September 22, 2025 We have launched Request Mirror, a little free service to reflect HTTP requests. We've also open-sourced it: you can read the code in the ohdearapp/request-mirror.ohdear.app repo on GitHub. In this blog post I'd like to explain why we built it and how you can use it. Why we needed to reflect HTTP requests # One of the many checks we offer is our uptime check. Like all our checks, we have an extensive test suite for our uptime monitoring functionality. We have tests that prove that when a site is down, we actually do warn our users. So, in our end-to-end tests we need to have a site available that is considered down. Instead of bringing an actually service down, wouldn't it be nice if we could just tell a website what status code it should return? That's exactly the sort of thing that Request Mirror can do. It has a route /status/ that you can append with any status code you want. So a request to https://request-mirror.ohdear.app/status/500 will respond with status code 500, mimicking a website that is down. Try it by visiting that URL in the browser and use your developer tools to see the status code. In our tests we can use this: // I've simplified the test for brevity it('can send a notification when the site is down', function () { performUptimeCheck('https://request-mirror.ohdear.app/status/500'); Notification::assertSent(UptimeCheckFailedNotification::class); }); Other endpoints # Our uptime check has many options to tailor it to your specific monitoring needs. To be able to test all these options, we added extra endpoints to Request Mirror. Let's take a look at the ability to reflect headers: $response = Http::withHeaders([ 'extra-header' => 'extra-value', ])->get('https://request-mirror.ohdear.app/get'); // the json response will have a headers property that contains // the `extra-header` header. $response->json('headers'); These are also available: https://request-mirror.ohdear.app/ip: returns your IP https://request-mirror.ohdear.app/user-agent: returns your user agent https://request-mirror.ohdear.app/json: returns a bit of random JSON https://request-mirror.ohdear.app/xml: returns a bit of random XML And there are a few more listed on Request Mirror. An alternative: HTTPBin # There's also an excellent alternative that's been around for a long time: HTTP Bin. Request Mirror was heavily inspired by HTTP Bin. Even though HTTP Bin works well, I still took the time to build Request Mirror, because the uptime of HTTP Bin was a bit flaky in the past period, causing our tests to fail sometimes. And with Request Mirror being in my control, I can add any endpoint Oh Dear needs for its test suite. In closing # Granted, Request Mirror is not the most exciting project, but if you need this kind of functionality it can come quite handy. Should you need another endpoint for your testing, I'm open for pull requests to the request mirror repo on GitHub.
We have launched Request Mirror, a little free service to reflect HTTP requests. We've also open-sourced it: you can read the code in the ohdearapp/request-mirror.ohdear.app repo on GitHub. In this blog post I'd like to explain why we built it and how you can use it. Why we needed to reflect HTTP requests # One of the many checks we offer is our uptime check. Like all our checks, we have an extensive test suite for our uptime monitoring functionality. We have tests that prove that when a site is down, we actually do warn our users. So, in our end-to-end tests we need to have a site available that is considered down. Instead of bringing an actually service down, wouldn't it be nice if we could just tell a website what status code it should return? That's exactly the sort of thing that Request Mirror can do. It has a route /status/ that you can append with any status code you want. So a request to https://request-mirror.ohdear.app/status/500 will respond with status code 500, mimicking a website that is down. Try it by visiting that URL in the browser and use your developer tools to see the status code. In our tests we can use this: // I've simplified the test for brevity it('can send a notification when the site is down', function () { performUptimeCheck('https://request-mirror.ohdear.app/status/500'); Notification::assertSent(UptimeCheckFailedNotification::class); }); Other endpoints # Our uptime check has many options to tailor it to your specific monitoring needs. To be able to test all these options, we added extra endpoints to Request Mirror. Let's take a look at the ability to reflect headers: $response = Http::withHeaders([ 'extra-header' => 'extra-value', ])->get('https://request-mirror.ohdear.app/get'); // the json response will have a headers property that contains // the `extra-header` header. $response->json('headers'); These are also available: https://request-mirror.ohdear.app/ip: returns your IP https://request-mirror.ohdear.app/user-agent: returns your user agent https://request-mirror.ohdear.app/json: returns a bit of random JSON https://request-mirror.ohdear.app/xml: returns a bit of random XML And there are a few more listed on Request Mirror. An alternative: HTTPBin # There's also an excellent alternative that's been around for a long time: HTTP Bin. Request Mirror was heavily inspired by HTTP Bin. Even though HTTP Bin works well, I still took the time to build Request Mirror, because the uptime of HTTP Bin was a bit flaky in the past period, causing our tests to fail sometimes. And with Request Mirror being in my control, I can add any endpoint Oh Dear needs for its test suite. In closing # Granted, Request Mirror is not the most exciting project, but if you need this kind of functionality it can come quite handy. Should you need another endpoint for your testing, I'm open for pull requests to the request mirror repo on GitHub.