Haskellでいい感じのHTTPパーサライブラリはない?

「いい感じの」とはずいぶん主観的だが、だいたい以下のようなHTTPパーサが欲しくなってちょっと調べていた。

  • 基本的に(Lazy?)ByteStringに対して作用する。
  • 非IO。
  • HTTPリクエストとレスポンスをパースできる。
  • HTTPボディも引っこ抜いてくれる。
  • HTTPボディは一定メモリでストリーミングできる (具体的な実現形態はうまくイメージできないが・・)
  • Transfer-Encoding: chunkedなHTTPボディをデコードしてストリーミングできる。
  • 一つのByteStringに複数のHTTPリクエスト or レスポンスが含まれている場合もパースできる。
  • できればContent-Encoding: gzipなどの圧縮コンテンツを解凍するオプションがある。
  • さしあたりHTTP/2は非対応でいい。

イメージとしてはこちらで質問されているようなものが近い。

が、意外とこういうものがないかも? 少し調べてみた。

salvia-protocolパッケージの提供するパーサ。Stringがターゲットなのでボツ。

Network.HTTP.Client.Internal

http-clientの内部モジュール。

'parseStatusHeaders'や'getResponse'関数があるが、いずれもConnectionをターゲットとしたIO関数。

attoparsecのexamplesに同梱されているパーサ。

見たところContent-Lengthヘッダの解釈などもやっていないようなのでボツ。

warpの内部モジュール。

'recvRequest'関数があるが、やはりConnectionをターゲットとしたIO関数。そこから呼ばれている'parseRequest'関数などもIO。

ということでHTTPクライアント、サーバの内部実装を簡単に調べてみたが、意外とIOに密結合した作りになっているようだ。ボディストリーミングをやる都合上か、性能を高める都合上そうなっているのかもしれない。

別にIOでも構わないといえば構わないが、本質的にIOじゃなくてよいものをIOにするのはなんとなくモヤる。

他に何かないだろうか。