Haskellでいい感じのHTTPパーサライブラリはない?
「いい感じの」とはずいぶん主観的だが、だいたい以下のようなHTTPパーサが欲しくなってちょっと調べていた。
- 基本的に(Lazy?)ByteStringに対して作用する。
- 非IO。
- HTTPリクエストとレスポンスをパースできる。
- HTTPボディも引っこ抜いてくれる。
- HTTPボディは一定メモリでストリーミングできる (具体的な実現形態はうまくイメージできないが・・)
- Transfer-Encoding: chunkedなHTTPボディをデコードしてストリーミングできる。
- 一つのByteStringに複数のHTTPリクエスト or レスポンスが含まれている場合もパースできる。
- できればContent-Encoding: gzipなどの圧縮コンテンツを解凍するオプションがある。
- さしあたりHTTP/2は非対応でいい。
イメージとしてはこちらで質問されているようなものが近い。
が、意外とこういうものがないかも? 少し調べてみた。
salvia-protocolパッケージの提供するパーサ。Stringがターゲットなのでボツ。
http-clientの内部モジュール。
'parseStatusHeaders'や'getResponse'関数があるが、いずれもConnectionをターゲットとしたIO関数。
attoparsecのexamplesに同梱されているパーサ。
見たところContent-Lengthヘッダの解釈などもやっていないようなのでボツ。
warpの内部モジュール。
'recvRequest'関数があるが、やはりConnectionをターゲットとしたIO関数。そこから呼ばれている'parseRequest'関数などもIO。
ということでHTTPクライアント、サーバの内部実装を簡単に調べてみたが、意外とIOに密結合した作りになっているようだ。ボディストリーミングをやる都合上か、性能を高める都合上そうなっているのかもしれない。
別にIOでも構わないといえば構わないが、本質的にIOじゃなくてよいものをIOにするのはなんとなくモヤる。
他に何かないだろうか。