scala-uri で角括弧を含む文字列が Parse Failed する件の調査ログ
こんにちは、 @kz_morita です。
今回は、 scala-uri を使っていて、以下のような角括弧を含むURLがパースできなかったので調査したログになります。
https://example.com/hoge/fuga[1].png 発生した環境と事象 対象のライブラリは以下になります。
https://github.com/lemonlabsuk/scala-uri 使用していたバージョンは、3.6.0 になります。
起きていた事象は以下のようなものになります。
import io.lemonlabs.uri.Url // ↓ Parse Error Occured val result = Url.parse("https://example.com/hoge/fuga[1].png") 角括弧が含まれる URL がパースできないといったものになります。
先に結論 scala-uri のバージョンを 4.0.1 にアップデートすると解決されます。
scala-uri の 4.x.x 系で Scala3 対応が入っていますが、引き続き Scala 2.13, 2.12 へのサポートも残っているためこれらのバージョンであれば問題なくアップデートすることができそうです。
詳細な調査手順 まずは、URL の仕様についてしらべました。
まず前提として、角括弧を使ったURLはブラウザ上では正しく表示することができます。
また角括弧ですが、 RFC 3986 にて予約語に追加されていそうでこの辺りが怪しそうだな当たりをつけました。
次に、scala-uri の実際に parse 処理を見ていきます。
以下のように処理が進んでいきます。
// 呼び出し側 Url.parse("https://example.com/hoge/fuga[1].png") // package io.lemonlabs.uri // https://github.com/lemonlabsuk/scala-uri/blob/3.6.0/shared/src/main/scala/io/lemonlabs/uri/Uri.scala#L593-L600 object Url { // ... def parse(s: CharSequence)(implicit config: UriConfig = UriConfig.