Closed hsbt closed 11 years ago
当面の回避策があるなら、慌てずに本来のあるべき姿を追求しましょう。URIを与えるかどうかで挙動が変わるのは、普通に考えておかしい。
net/http.rb L102 で host ヘッダにポート番号を付けているのが上手く動かない原因みたいですねえ。ポート番号を除外すると URI クラスのインスタンスを渡しても動くようになりました。
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.23 を見る限り、ポート番号を付けるのは問題ないように見えるから、rpaproxy 側がおかしいような気もする。
URIを与えるかどうかで挙動が変わるのは、普通に考えておかしい。
http://bugs.ruby-lang.org/issues/6482
backwards compatibility のようです。
だいたいわかった。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 これどうしますかねえ。
@nahi さんの情報 https://github.com/nahi/httpclient/blob/master/lib/httpclient/http.rb#L395 他のサービスでもポート番号付けると動かないのがあるらしい。
ひとまず報告した。 http://bugs.ruby-lang.org/issues/7650
Hostヘッダには慣習としてポート番号はつけないからねぇ。Ruby側で対応すべきだと思う。rubyの方のissueもwatchしておきます。
r38707 で直りました。
:+1:
net/http の変更により、URIクラスのインスタンスを与えた時に host ヘッダを上書きするようになって、403 エラーが発生する用になったようだ。現在、調査中でわかったこと。
rpaproxy が悪いのか、heroku の CNAME がおかしいのか、net/http の host ヘッダの上書きの仕方?が悪いのか難航中。ひとまず、amazon.rb の 54 行目でアドホックに URI を与えないようにすれば動く。