チケット #28740

ニコニコ側のリダイレクトURLが相対URIの時にエラー

登録: 2012-06-15 17:26 最終更新: 2012-06-16 09:53

報告者:
担当者:
チケットの種類:
状況:
完了
マイルストーン:
(未割り当て)
優先度:
9 - 最高
重要度:
9 - 最高
解決法:
修正済み

詳細

たとえば、這いよれ!ニャル子さん 第10話「超時空の覇者」の情報を

http://ext.nicovideo.jp/api/getthumbinfo/1339405721
から取得すると、
<video_id>so18069623</video_id>
が帰ってくる。で、このvideo_idに合わせて、
http://www.nicovideo.jp/watch/so18069623
にアクセスすると、
http://www.nicovideo.jp/watch/1339405721
にリダイレクトされる。この時のヘッダは
HTTP/1.1 302 Found
Connection:close
Content-Encoding:gzip
Content-Language:ja
Content-Length:20
Content-Type:text/html
Date:Fri, 15 Jun 2012 07:52:46 GMT
Location:/watch/1339405721
Server:Apache
Vary:Accept-Encoding
X-Frame-Options:SAMEORIGIN
x-niconico-authflag:3
x-niconico-id:185957
で、以下のLocation行でジャンプ先を指定しているものの、
Location:/watch/1339405721
これはRFC違反。 http://www.studyinghttp.net/cgi-bin/rfc.cgi?2616#Sec14.30
Location       = "Location" ":" absoluteURI
で、absoluteURIの定義はhttp://www.ietf.org/rfc/rfc2396.txt
absoluteURI   = scheme ":" ( hier_part | opaque_part )
なので、Locationにはスキームが必ず必要なのに、ニコニコ動画の方にはスキームが付いてない

さーてどうしよう

  • ニコニコ動画側が直すべき
  • 「送る方は厳しく、受信側は寛容に」に基づいてこっちで対処
  • リダイレクトが起きないようにこちらからURLを変える

ただ、Pythonのソースを見ると

        # For security reasons we don't allow redirection to anything other
        # than http, https or ftp.

        if not urlparts.scheme in ('http', 'https', 'ftp'):
            raise HTTPError(newurl, code,
                            msg +
                            " - Redirection to url '%s' is not allowed" %
                            newurl,
                            headers, fp)
とセキュリティを問題にしている模様

添付ファイルリスト

添付ファイルはありません

チケットの履歴 (5 件中 3 件表示)

2012-06-15 17:26 更新者: ledyba
  • 新しいチケット "ニコニコ側のリダイレクトURLが相対URIの時にエラー" が作成されました
2012-06-15 17:26 更新者: ledyba
  • 優先度5 - 中 から 9 - 最高 に更新されました
2012-06-15 17:26 更新者: ledyba
  • 詳細が更新されました
2012-06-15 22:51 更新者: ledyba
コメント

Python3.2.3のソースだとこのようになってました。

        # For security reasons we don't allow redirection to anything other
        # than http, https or ftp.

        if urlparts.scheme not in ('http', 'https', 'ftp', ''):
            raise HTTPError(
                newurl, code,
                "%s - Redirection to url '%s' is not allowed" % (msg, newurl),
                headers, fp)

 というわけで、Windows版に付属してるPortablePython(3.2.1)が若干古いのが問題なようです…。

 修正してるリビジョンはこちら http://hg.python.org/cpython/file/86141d28b20d/Lib/urllib/request.py

2012-06-16 09:53 更新者: ledyba
  • チケット完了時刻2012-06-16 09:53 に更新されました
  • 状況オープン から 完了 に更新されました
  • 解決法なし から 修正済み に更新されました
コメント

Pythonをアップデートして修正しました。 公式ビルドをuniextractすればPortableになるみたいです。

…となると、PortablePythonの立場は…? # 他にたくさんライブラリが入ってることぐらい?

編集

ログインしていません。ログインしていない状態では、コメントに記載者の記録が残りません。 » ログインする