読者です 読者をやめる 読者になる 読者になる

テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

spray: inner routeに入る前にパスを書き換える

https://groups.google.com/forum/#!topic/spray-user/QqCEOoZs5A0

mapRequestはルーティングに影響を与えないという話をした. user gruopで質問をしたところ, mapRequestContextを使って, mapRequestでやっているようにリクエスト自体とunmatchedPathを書き換える必要があると分かった.

unmatchedPathというのは, 名前から想像するに, 次の瞬間にマッチを試みるためのパスだろう. sprayはgetとかpath(Segment / Rest)のようなディレクティブでマッチしていくんだけど, これは単なるパターンマッチのDSLであるから, その入力であるx matchの部分に次に何を入れるかがこのunmatchedPathということ. (大体, 以下のようなことだと思っている)

val route = get {...

<=>

val route = unmatchedPath match {
  case HttpRequest(GET, ...) => 
}

だから, 私はルーティング自体が最初に計算されるようなアルゴリズムだと思っていたが, そうではなく, パターンマッチ自体はまだ実行されていなかったのだ. だから, unmatchedPathを書き換えることによって運命を変えることが出来る.

きっとこの実装は動くけど, 問題はある. Hostヘッダをどうするんだとか, 他の情報が不整合になる可能性がある. 従って, あらゆるケースを考えて実装する必要がある. ここでよくよく考えれば本当に書き換えたいならsprayの外でapacheなどを使ってパスを書き換える戦略の方が, 遅いし手間だけど, やり方としてはスマートではあるし, とりあえずはそういう逃げ道があるということでこの件についてはこれ以上追求しない.