- 晴れ
1100
bit.ly が転送先を HTTP 応答 header の Location に入れるときに UTF8 の生バイトを返すのが云々という話が出たので再調査
- HTTP/1.1 ( rfc2626 ) 上 Location: には absolute-URI が入る
- Location: scheme:/ /host/path と成っている必要がある
- また,応答 header の value ( Foobar: hogehuga ) の hogehuga 側に現れるビット列に制限はない
- Location: 0xFF 0xA0 0x01 … となっていても良い
- URI ( rfc3986 ) で absolute-URI はURLの構成文字に制限がある.Section 3.3
- http://example.com/ハム は http://exapmle.com/%xx%xx%xx という文字列に成っている必要がある
- URI では特定の encode を特に規定しないので absolute-URI で使われる文字がその上位のプロトコルに於いてどういうビット列,オクテット列に変換されるかは規定されない
- h -> 0x08, t ->0x14, とエンコードされてても良い?が,あくまでも pchar のみ
よって,Location: http://example/ハム (UTF8 で全て表すと 68 74 74 70 3A 2F 2F 65 78 61 6D 70 6C 65 2F E3 83 8F E3 83 A0 というオクテット列)を返すと,HTTP/1.1 上合法だが,E3 以降が absolute-URI ( の pchar )とは解釈されず予期せぬ結果をもたらすことがある
- 特に 最後の A0 が ISO-8859-1 で ー 2 から 16 でもだが ー nbsp とみなせるからか,Opera の場合,何故かなかったことにされて,E3 83 という 2 オクテットとして処理される
となるようで,encodeURIComponent 相当の処理をしておいたほうが安全なんじゃないですかという結論
- HTTP/1.1 ( rfc2626 ) 上 Location: には absolute-URI が入る
2011/02/02 水