From: ryu@... Date: 2001-02-07T08:05:16+09:00 Subject: [ruby-list:27559] Re: net/smtp,pop,http 1.2 pre2 大島です。 HTTP のレスポンスに複数の同名フィールドがあった場合の件ですが、僕は 実際に多少困っています。 現在の net/http.rb では、複数の同名フィールドがあった場合、 ', ' で 文字列を連結していますよね?高橋さんがあげられた RFC2616 の「4.2 Message Headers」の規定からも、大抵のフィールドの場合にはおそらくこ れで問題にならないと思います。 けれども、おそらく複数の同名フィールドが HTTP 上で最も頻繁に使われて いる、Set-Cookie フィールドで実は困るのです。以下の www.excite.co.jp のレスポンスが参考になると思います。 % telnet www.excite.co.jp 80 Trying 198.3.103.129... Connected to www.excite.co.jp. Escape character is '^]'. HEAD / HTTP/1.0 Host: www.excite.co.jp HTTP/1.0 200 OK Server: Netscape-Enterprise/2.01 Date: Tue, 06 Feb 2001 22:16:13 GMT Set-cookie: registered=no; path=/; domain=.excite.co.jp; expires=Wednesday, 31-Dec-2009 12:00:00 GMT Set-cookie: xmen=off,0,0,1; path=/; domain=.excite.co.jp; expires=Wednesday, 31-Dec-2009 12:00:00 GMT Set-cookie: registered=no; path=/; domain=.excite.co.jp; expires=Wednesday, 31-Dec-2010 12:00:00 GMT Set-cookie: UID=BB5DDBAD3A80770B; path=/; domain=.excite.co.jp; expires=Wednesday, 31-Dec-2010 12:00:00 GMT Cache-Control: No-Cache Content-length: 27212 Content-type: text/html (以下略、HEAD リクエストなのに本体も返してきます。) 問題は Set-cookie フィールドの中身の expires の部分で、 ', ' が含ま れていることで、単純に String#split(/, /) では中身を取り出せません。 2つ目の Set-cookie なんて、設定する値自体に ',' を持っていて、さらに やっかいです。 僕は現在のところ、 net/http.rb の連結する部分のメソッドを、 Set-Cookieには使われなさそうなセパレータで連結するように上書きして、 凌いでいます。 From: TAKAHASHI Masayoshi Subject: [ruby-list:27554] Re: net/smtp,pop,http 1.2 pre2 Date: Tue, 6 Feb 2001 22:14:35 +0900 > なんでも HTTP1.1の「4.2 Message Headers」によれば、同じフィールド名 > を持つ multiple message-header fields は、意味を変えずに一つの > 「field-name: field-value」ペアに合成できなきゃいけない(MUST)みたい > だそうですけど、X-* なヘッダにそういうセマンティクスを期待するのは > 難しいのかも。 RFC2616 ですね。その部分には気づいていませんでしたが、元々 ',' を含 むフィールドは、どう扱うべきかまでは規定されていないですね。 RFC2965 で規定された Set-Cookie2 フィールドを使う方法が普及すれば、 expires に ', ' が含まれる問題からは開放されますが、複数の同名フィー ルドを相変わらず許容しているようなので、中身に ',' を含んでいた場合 には、やはり問題が残りそうです。 大島 龍之介 ryu@jaist.ac.jp