So, here are some first impressions/issues that came up immediately.
Perhaps I'm doing it wrong, and if so, I'd appreciate guidance.

1) req.form, req.query, etc, maps throw if you try to access an element that isn't there. This leads to endless spam like this:

 if("xys" in req.form)
 {
   string xyz = req.form["xyz"];
   ...
 }

or

 string xyz = "xyz" in req.form ? req.form["xyz"] : null;

That's ugly and annoying. Is that really the accepted pattern?

Surely:

 string xyz = req.form["xyz"];

...is better, and xyz should just be assigned null if not present?

2) HTTPServerRequest has no way to carry user data. URL router is a linear process, and functions like 'check login' that need to look up a user profile should be able to carry that profile across into the following handler. Otherwise the actual handler just has to look up the same user again.
Ie, there is no way to carry state through the URL route. I have a few situations of this sort where it would be simpler and more efficient to carry some state.

3) Fiber Local Storage. Since TLS isn't reliable in the vibe.d environment, an explicit solution should be offered, otherwise users are likely to try using TLS and run into unexpected problems...