tdiary / tdiary-core

tDiary, The TSUKKOMI-able Weblog.
https://tdiary.org/
GNU General Public License v2.0
171 stars 67 forks source link

ruby-trunk r38546 以降で amazon.rb が動かない #225

Closed hsbt closed 11 years ago

hsbt commented 11 years ago

net/http の変更により、URIクラスのインスタンスを与えた時に host ヘッダを上書きするようになって、403 エラーが発生する用になったようだ。現在、調査中でわかったこと。

rpaproxy が悪いのか、heroku の CNAME がおかしいのか、net/http の host ヘッダの上書きの仕方?が悪いのか難航中。ひとまず、amazon.rb の 54 行目でアドホックに URI を与えないようにすれば動く。

-       res = Net::HTTP::Proxy( px_host, px_port ).get_response( URI::parse( url ) )
+       # workaround: ruby 2.0.0 r38545 later added host header if given URI class.
+       # rpaproxy is not works with host header.
+       uri = URI(url)
+       res = Net::HTTP::Proxy( px_host, px_port ).get_response(uri.host, uri.path)
tdtds commented 11 years ago

当面の回避策があるなら、慌てずに本来のあるべき姿を追求しましょう。URIを与えるかどうかで挙動が変わるのは、普通に考えておかしい。

hsbt commented 11 years ago

net/http.rb L102 で host ヘッダにポート番号を付けているのが上手く動かない原因みたいですねえ。ポート番号を除外すると URI クラスのインスタンスを渡しても動くようになりました。

hsbt commented 11 years ago

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.23 を見る限り、ポート番号を付けるのは問題ないように見えるから、rpaproxy 側がおかしいような気もする。

URIを与えるかどうかで挙動が変わるのは、普通に考えておかしい。

http://bugs.ruby-lang.org/issues/6482

backwards compatibility のようです。

hsbt commented 11 years ago

だいたいわかった。webservices.amazon.co.jp や ecs.amazon.co.jp が host ヘッダにポート番号を付けた時に 403 を返しているらしい...

require 'net/http'
require 'uri'

uri = URI.parse("http://rpaproxy.tdiary.org/rpaproxy/jp/?Service=AWSECommerceService&SubscriptionId=1CVA98NEF1G753PFESR2&Operation=ItemLookup&ItemId=B004HB2KF6&IdType=ASIN&ResponseGroup=Medium&Version=2011-08-01")

res = Net::HTTP.get_response(uri)
# => Net::HTTPRedirection

uri = URI.parse(res['location'])
# res['location'] => http://webservices.amazon.co.jp/onca/xml?AssociateTag=machu-proxy-22&IdType=ASIN&ItemId=B004HB2KF6&Operation=ItemLookup...

res = Net::HTTP.get_response(uri)
# => Net::HTTPForbidden

上のような再現コードでポート番号だけを付けないように net/http を変更したら Net::HTTPOK だった。

@tdtds これどうしますかねえ。

hsbt commented 11 years ago

@nahi さんの情報 https://github.com/nahi/httpclient/blob/master/lib/httpclient/http.rb#L395 他のサービスでもポート番号付けると動かないのがあるらしい。

hsbt commented 11 years ago

ひとまず報告した。 http://bugs.ruby-lang.org/issues/7650

tdtds commented 11 years ago

Hostヘッダには慣習としてポート番号はつけないからねぇ。Ruby側で対応すべきだと思う。rubyの方のissueもwatchしておきます。

hsbt commented 11 years ago

r38707 で直りました。

tdtds commented 11 years ago

:+1: