BaseHTTPServerのDataフィールド
お仕事で、とある検証の結果表示をpythonのSimpleHTTPServerを利用してネットから取得できるようにしていたんだけど、車輪の再発明をしたくなって、全部素で書いてみたりした。要するに遊び(一応セキュリティ上の問題と実験、という名目はある)。そのときに「Date: ヘッダフィールドってどうやって作ってんの」で一瞬悩む。
apacheさんの真似をする方針で。。。
HTTP/1.1 200 OK Date: Tue, 18 May 2010 06:53:11 GMT Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.10 with Suhosin-Patch
これ。
datetimeをdir()ってみると、それらしいisoformatとかいうのが見つかった。のでやってみるが
>>> datetime.now().isoformat()
'2010-05-18T16:25:11.059133'
いや、全然違うし。うーん。Cでいうasctime()みたいなの無いんだろうか。
BaseHTTPServer.pyを見てみるとどうも以下のsnippleのようになってるっぽい。
def date_time_string(self, timestamp=None): """Return the current date and time formatted for a message header.""" if timestamp is None: timestamp = time.time() year, month, day, hh, mm, ss, wd, y, z = time.gmtime(timestamp) s = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % ( self.weekdayname[wd], day, self.monthname[month], year, hh, mm, ss) return s : weekdayname = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] monthname = [None, 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
なんじゃこりゃ、ややっこしいことしてるなあ。
time.strftime("%a, %d %b %Y %H:%M:%S GMT")
じゃダメなんだろうか? いいと思うんだけどなあ。不明だ。そもそも、このフォーマットってある程度自由なんだろうか? 勝手に多少いじってもいいんだろうか?
仕様を調べてみる(順番逆!!)
RFCを引っ張ってみる。rfc2616(HTTP1.1)によると
- Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
- Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
- Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
の3種類あって、server/client共に、どのフォーマットも読める必要がある、とのこと。ただし、最も好ましいのはインターネット標準(rfc1123)である1で、server/client共に出力は必ず1にすべきだそうな(このあたりはMUSTだらけ)。
というわけで、どっちにしても
time.strftime("%a, %d %b %Y %H:%M:%S GMT")
でよさそうに思うんだけど。BaseHTTPServerは何故にややこしいことをしているんだろうか?
よくわかりません><
追記:
ひょっとして、、、strftimeは %aとか%b は"Locale’s abbreviated weekday/month name"なので、いちいちlocaleを再設定するのを嫌ったとか、、、かな。あるいはその分のオーバーヘッドを嫌ったとか。。。ってそれは素でpythonってるほうが遅いか。微妙だなあ・・・うーん。