Sinatra: オプションのURLパラメータを使用した予期しないパラメータ解析

作成日 2017年11月10日  ·  5コメント  ·  ソース: sinatra/sinatra

https://github.com/sinatra/sinatra/issues/1361を調査しているときに、別の問題だと思う次のことがわかりました。 この問題はSinatra1.4.8でも発生するため、これが仕様によるものかどうかはわかりませんが、予期しない動作が発生します。

要約すると、Sinatraは、最も具体的なルートの一致にパラメーターの解析を行わせ、それらの解析された値をフィルターに使用する必要があるという事実に帰着すると思います( before )。 そうしないと、フィルター( before )と動詞( getpostなど)の同じパラメーターに対して異なるパラメーター値が発生する可能性があります。

テストケース:

require 'minitest/autorun'
require 'sinatra/base'
require 'rack/test'

VALUES = {}

class App < Sinatra::Base

  before '/foo/:bar/?:baz?' do
    VALUES[:before] = params[:baz]
  end

  get '/foo/:bar/?:baz?/1' do
    VALUES[:get] = params[:baz]
  end
end

class NestedNamespacesTest < Minitest::Test
  include Rack::Test::Methods

  def app
    App
  end

  def test_same_values
    get "/foo/2017/1"
    assert_equal VALUES[:before], VALUES[:get]
  end
end

このテストは失敗します。つまり、 beforeフィルターではbaz1が、実際のルートではnilます。

help wanted

最も参考になるコメント

これはバグではないと思いますが、API設計について議論するためにこの問題を残しておきたいと思います。
@lvonkご報告ありがとうございます。

cc @zzak

全てのコメント5件

まず、オプションのパラメータとして:bar/?代わりに(/:bar)?を使用する必要があります。
キャプチャされた名前はコンテキストによって異なります。 したがって、動作はバグではないと思います。

こんにちは@namusyaka返信ありがとうbazではなく、 barです。 '/foo/:bar/?:baz?' (例の名前がわかりにくいことをお詫びします)。 オプションのパラメータを定義する両方の方法は、同じ動作するようには思え/?:baz?(/?:baz)?(/?:baz)?変更しても、結果は変わりません。

キャプチャされた名前はコンテキストによって異なります

私は、文脈が最も具体的なルートであると主張します。 実際、それはreadmeが述べていることでもあります(または少なくともそれは私がそれを解釈する方法です):

ルートと同じコンテキスト内の各リクエストの前にフィルタが評価される前に、リクエストとレスポンスを変更できます。

バグであろうとなかろうと、私見では、フィルターがそのコンテキスト内から機能することが最も理にかなっています。 フィルタとルートの間でパラメータ値を変えたいコンテキストや状況を考えることができませんか?

この例では、オプションのパラメーターはbarではなくbazです。 '/ foo /:bar /?:baz?' (例の名前がわかりにくいことをお詫びします)。 オプションのパラメータを定義する両方の方法は同じように機能するようです/ ?: baz? 対(/?:baz)?. (/?:baz)に変更しますか? 異なる結果にはなりません。

ご迷惑をおかけして申し訳ありません。 オプションのパラメータは(/:foo)?である必要があると言いたかったので、 mustermannのreadmeを参照してください。

バグであろうとなかろうと、私見では、フィルターがそのコンテキスト内から機能することが最も理にかなっています。 フィルタとルートの間でパラメータ値を変えたいコンテキストや状況を考えることができませんか?

実際、ルートとフィルターのパターンは必ずしも密接に関連しているわけではありません。
この動作は確立されています。

実際、ルートとフィルターのパターンは必ずしも密接に関連しているわけではありません。
この動作は確立されています。

うーん、いいよ。 私はそれを考慮しませんでした。 1回のリクエストでフィルターとルートでパラメーターの値が異なるのはまだ奇妙に感じます...

とにかく、これが機能するはずの方法である場合、実際にはバグではありません。 これを調査するために時間を割いてくれてありがとう! 処理済みと思われる場合は、この問題を自由にクローズしてください。

これはバグではないと思いますが、API設計について議論するためにこの問題を残しておきたいと思います。
@lvonkご報告ありがとうございます。

cc @zzak

このページは役に立ちましたか?
0 / 5 - 0 評価