質問: HTTP POSTの multipart form-dataのクライアントとサーバの実装について 送信するデータを、boundaryで指定した文字列で囲うという仕様のようなのですが、ここで疑問があります。 クライアント側は、boundaryで指定したバイト列がデータに含まれていないということをどうやって保障しているのでしょうか? ChromeではPOSTの時に WebKitFormBoundary{ランダムな英数字}というboundaryが指定されるようですが、適当に乱数で英数字を生成し、データ部分に含まれていないかをチェックしてから、リクエストを行う? または、乱数部分が十分に長ければ、一致することは現実的にありえないとして、ノーチェックでリクエストを行う? サーバー側はmultipart form-dataをパースをどうすれば効率的に行える? この仕様だと、テキストデータは行単位で処理できるからマシだとして、バイナリデータは、全データをboundaryと比較しながらパースする必要があり、非常に非効率であるように思います。 簡単なHTTP クライアントやサーバーのサンプルコードでは、POSTするデータはテキストであることが前提なものしか見当たりませんでした。 実装次第だとは思いますが、どんな感じの実装が一般的なのでしょうか?
回答: 自分もこのあたりの専門家ではないので、これまでの経験から回答させていただきます。 実装次第ですが、ご指摘されているように、クライアント側はデータ内にBoundaryと同じ文字列が含まれていないことをチェックした方が良いと思います。クライアントを実装する言語によりますが、バイナリを扱う機能が不向きで遅い言語だと、確かにチェックは少し時間がかかるかも知れませんね。ただ、そこまでシビアなものを作らないのであれば、実際上はノーチェックでも問題ないと思っています。 また、サーバー側も全データをboundaryと比較しながらパースする必要がありますが、こちらも、実装する言語によりますが、1バイトずつ比較する処理をC言語等で実装していくのであれば、コード上は長くなるものの、実行時の負荷はさしてかからないと思います。 クライアント側だけですが、javascriptでバイナリをmultipart-postするサンプルを以前作ったことがあるので、参考にしてみてください。 ただし、データ内のBoundaryチェックは行っていません。