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)によると

  1. Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
  2. Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
  3. 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ってるほうが遅いか。微妙だなあ・・・うーん。