Internet Explorer 8のPUTの挙動

| | Comments (0) | TrackBacks (0)
こんにちわ。
いまさらですが、今年で入社して1年がたちました。
お祝いにルートビアをいただきました。
飲んだその日は、しばらくお腹が痛かったです。
話は変わって、Internet Explorer 8のちょっと困った挙動に悩まされました。

PUTリクエストを送信し、303 See Other レスポンスコードを受け取ると、
リダイレクト先にPUTリクエストを送信してしまうのです。

リダイレクト先を、リクエスト送信先と同じにしていた場合

PUT -> リダイレクト -> PUT -> リダイレクト...

と、PUTリクエストを延々と投げ続けてしまいます。


RFC2616(http://www.ietf.org/rfc/rfc2616.txt)には

"10.3.4 303 See Other

  The response to the request can be found under a different URI and
SHOULD be retrieved using a GET method on that resource."

とあるので、リダイレクト先にはGETリクエストを投げるべきではないかと思うのですが...。

この挙動はPUTとDELETEで起こりました。
GETとPOSTに関しては、リダイレクト先にGETリクエストを送信します。

動作の確認に使ったコードは以下のものです。
python2.4 と web.py0.3、jQuery1.2.6で動作確認しました。
ディレクトリ構成は以下の通りです。
 
.
├ server.py
└ tmp/
     ├ Index.html
     └ jQuery.js
 
確認に使ったコードは以下の通りです。
 
server.py
#! /usr/bin/env python
# -*- coding: utf-8 -*-

import web
import mako

urls = (
    "/", "Index",
    "/jquery", "Jquery"
    )

app = web.application(urls, globals())
app.internalerror = web.debugerror

render = web.template.render('tmp/')

class Index:
    def GET(self):
        return render.Index(posted = "")
           
    def POST(self):
        #post_string = web.input().posted
        return web.seeother(web.ctx.path)

    def PUT(self):
        return web.seeother(web.ctx.path)

    def DELETE(self):
        return web.seeother(web.ctx.path)

class Jquery:
    def GET(self):
        jquery = open("tmp/jquery.js", "r")
        return jquery
    
if __name__ == '__main__':
    app.run()

------------------------------------------------------------
HTML
-- Index.html --
$def with (posted)

<head>
    <meta http-equiv="content-script-type" content="text/javascript" />
    <script type="text/javascript" src="/jquery" charset="utf-8"></script>
    
    <script type="text/javascript">
        <!--
            $$(document).ready(function(){
                alert("hello");

                $$("#test").click(function(){
                    $$.ajax({
                        url: "/",
                        type: "PUT",
                        dataType: "html",
                        data: null,

                        beforeSend: function(){
                            alert("before");
                            return true;
                        },
                        success: function(){
                            alert("success");
                        },
                        complete: function(){
                            alert("comp");
                        },
                        error: function(){
                            alert("error");
                        }
                    });
                });
            });

        //-->
    </script>

</head>

<html>
    <body>
        <form method="POST" id="test_form" action="/" >
            <input type="button" id="test" name="test" value="put_test"/>
        </form>
    <p>${posted}</p>
    </body>
</html>

0 TrackBacks

Listed below are links to blogs that reference this entry: Internet Explorer 8のPUTの挙動.

TrackBack URL for this entry: http://lab.hde.co.jp/blog/mt-tb.cgi/123

Leave a comment

About this Entry

This page contains a single entry by hayashi published on May 18, 2009 6:44 PM.

PyPI に登録する方法 was the previous entry in this blog.

Fedora11は6/9リリース is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.