node.js環境のFirebase Functions (多分Cloud Functionsも)だと特殊なContent-Encodingのリクエストがエラーになる

feather for Mastodonのプッシュ通知機能を実装するときに得た知見を紹介します。

firebase functions のhttp triggerを使ってmastodonのWeb Pushのリクエストを受け付けようとしましたがうまくリクエストが取れずエラー(UnsupportedMediaTypeError: unsupported content encoding "aesgcm")になりました。

やや推測も含むのですが、以下のようなことだろうということで結論づけで最終的にfirebase functionsは適さないと思い別の方法を取ることにしました。

まず、Web Pushのリクエストには "Content-Encoding: aesgcm" ヘッダーがついているという前提があります。

一方でfirebase functions のhttp triggerは内部的にexpress.jsが使用されており、body-parserが設定されています。 これによってリクエストの内容に応じて自動的にbodyがパースされ、大体の場合においては非常に便利に使えます。

※以下はエミュレータのコードですが実際のコードも近いものだと思います。

github.com

しかし、body-parserは一般的な形式のencodingしか対応していないため、"aesgcm" の場合エラー(UnsupportedMediaTypeError: unsupported content encoding "aesgcm")になってしまいます。

github.com

この処理は自分で書いたfunctionsの関数が呼び出される前に実行されるため、自分ではどうにもならない状況です。プッシュ通知のためにはbodyのraw dataがほしいだけなので、特にbody-parserによるパースの処理は不要なのですが、前処理として行われてしまうのでどうにもならなそうです。

最終的には、この問題を解決できないため、諦めてリクエストがそのまま使えるCloud Runを使うことにしました。