2011-12-06 7 views
1

私はトルネードを使用している単純なAPIサーバーで作業していましたが、すべてのリクエストにパラメータaccess_tokenが必要です。私はカールを演奏していましたが、DELETEリクエストとGETリクエストがリクエスト本体からこの値を抽出しないことに驚きました。このパラメータはクエリ文字列を介して渡されるだけです。要求メソッドがPOSTまたはPUTでない場合、Webサーバーは要求本体を無視する必要がありますか?

つまり、私は私のウェブハンドラの方法を削除

curl -i -X DELETE -d access_token=1234 http://localhost:8888/ 

を行うとき、これはNoneを返します。しかし

self.get_argument('access_token', None) 

、私は

curl -i -X DELETE http://localhost:8888/?access_token=1234 

を行うときこれにより、予想通り「1234」が生成されます。

self.get_argument('access_token', None) 

私は竜巻の原因を調査し、ボディのみPOSTのために解析され、要求を入れていることが見つかりました:https://github.com/facebook/tornado/blob/4b346bdde80c1e677ca0e235e04654f8d64b365c/tornado/httpserver.py#L258

は、それがGET、HEADのためのリクエストボディを無視して、要求を削除するには正しいですか、ですこれは竜巻の作者によって作られた選択ですか?

+0

http://stackoverflow.com/questions/978061/http-get-with-request-bodyおよびhttp://tech.groups.yahoo.com/group/rest-discuss/message/9962 – Bruno

答えて

2

これは、HTTP/1.1プロトコル仕様に基づいて正しいです。

DELETE要求とGET要求は、要求に含まれるエンティティデータを受け入れません。

定義に従って、get要求は要求URIからエンティティデータを取得します。

HEAD要求は、GET要求と同じであると定義されています。ただし、サーバーは応答内でメッセージ本文を返さないでください。

したがって、トルネードの著者は、GET、HEAD、およびDELETEの「投稿」データを無視するのは間違いです。

は、彼らがPOSTまたはPUTされていない場合はペイロードを持つ要求を受け入れないようにすることをお勧めしHTTP/1.1 Method Definitions

+1

RFC- 2616 sec 4.3 "サーバは任意の要求に対してメッセージボディを読み込んで転送しなければならない;要求メソッドがエンティティボディに対して定義されたセマンティクスを含まない場合、メッセージボディは要求を処理する際に無視されるべきである(SHOULD)。 – SingleNegationElimination

+2

"定義によると、取得要求は要求URIからエンティティデータを取得します。 - 私は仕様がそれを言うとは思わない。あなたがポインタを持っているなら私を訂正してください。 すべてのHTTPリクエスト*はリクエスト本文を持つことができます。これには、HEAD、GET、DELETEが含まれます。スペックはそれが何を意味するのかを定義しておらず、それらを使用するのは珍しいので、スペック要件ではなく、規約のみを話しています。 –

0

を参照してください。セキュリティ上の理由からです。一部のサーバー(例: lighttpd、この場合はサーバーエラーを返します。

関連する問題