and it is important that I get to specify that Future is Send.
Now, while this works it generates a warning of the type opaque_hidden_inferred_bound. So I should actually write Future = impl Send + Future<Output = ?>. I do not know how to specify this ? part as what would be the analogue of the Self::ResponseBody in the trait definition in this context? The compiler suggests using a fully qualified name, but I do not know how to refer to the ResponseBody inside the impl.
The lint is fairly new and the idea is that you can't assume the constraints imposed by the associated type bound from the opaque "type" impl Send [+ Future<...>]. In particular there's no way without TAIT to say "the output of this future is the same impl Body as ResponseBody" in the function signature. If that's not important, you could just silence the lint I suppose.
However, even if not important to your particular use case, I suggest creating an issue mentioning the lint PR and pointing out TAIT doesn't seem to help if you can't name the concrete type. If you can't name a concrete type here, there seems to be no way to satisfy the lint even on nightly.
Edit: TAIT can be made to work, see next post. I still think it's worth an issue as you can't necessarily satisfy the lint on stable.