Implemented this as a RequestExtension since I couldn't figure out a way to do this with a ResourceExtension.

RequestExtensionController.process drops the bounded URL arguments (e.g. id) so I have to re-parse it myself. Also, the body is never parsed so I have to parse it myself as well.