Logo address

Safari で POST できない

もう Chrome は止めた!

僕は Chrome を使ってたが、近頃の Chrome は使い物にならない。Chrome を動かしていると、ネットを使う他のアプリの動きが極端に遅くなるのだ。アクティビティモニターで調べると Chrome はネットを酷使している。Chrome をつかってネットサーフィンしかしていないユーザーにとってはそれで良いのかも知れないが、そうではないユーザーにとっては甚だ迷惑である。

Safari はどうか?

そこで他のブラウザを試すことにした。そして Safari も使い物にならないことを発見した。理由は、POST にバグがあるからである。僕の場合には(このページもそうだが)ブラウザーを使ってサーバーのホームページの記事を書いているので、サーバーに POST できないブラウザーは使い物にならないのである。

相手サーバーは筆者のサーバーである。POST するので、認証済みである。認証にはMD5ダイジェスト認証が使われている。

バグを示す以下の実験は OSX 10.10.5 での Safari 9.1.2(10601.7.7) で行なわれている。

比較のために Firefox の場合をまず示す。

hebe Dec  5 18:11:09 952794 192.168.0.249 me POST /remoty/test/?send HTTP/1.1
hebe Dec  5 18:11:09 952794 192.168.0.249 me DEBUG: POST /remoty/test/?send HTTP/1.1
Host: me.local
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://me.local/remoty/test/
Content-Length: 1220106
Content-Type: multipart/form-data; boundary=---------------------------91686676015844680951358049865
Authorization: Digest username="nyx", realm="nyx@hera", nonce="a155f6a0c4dff70b4c48f9e5", uri="/remoty/test/?send", response="f7efdf80d374cd5eec5dec15f1e22c3e", qop=auth, nc=0000004f, cnonce="86cbc6a1328e1030"
Connection: keep-alive

hebe Dec  5 18:11:09 952794 192.168.0.249 me exec /bin/remoty
hebe Dec  5 18:11:09 952794 192.168.0.249 me post 1220106 bytes
hebe Dec  5 18:11:09 952794 192.168.0.249 me done /bin/remoty

認証情報は "Authorization: " の行にてクライアントから送られている。

他方 Safari の場合は認証情報が送られない!

hebe Dec  5 18:14:38 953007 192.168.0.249 me POST /remoty/test/?send HTTP/1.1
hebe Dec  5 18:14:38 953007 192.168.0.249 me DEBUG: POST /remoty/test/?send HTTP/1.1
Host: me.local
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryjFNw7dlylRJmlgy0
Origin: http://me.local
Accept-Encoding: gzip, deflate
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/601.7.7 (KHTML, like Gecko) Version/9.1.2 Safari/601.7.7
Referer: http://me.local/remoty/test/
Content-Length: 1220070
Accept-Language: ja-jp

hebe Dec  5 18:14:38 953007 192.168.0.249 me Reply: 401 Unauthorized
hebe Dec  5 18:14:38 953007 192.168.0.249 me unallowed: /remoty/test/

その結果、サーバーから POST を拒否される。

以上の実験は画像ファイルの POST であるが、不思議なことに、テキストのような小さなファイルは POST できる。以下はその時の認証に至るまでのシーケンスである。

hebe Dec  5 19:08:48 959277 192.168.0.249 hebe POST /remoty/osx/?edit.post HTTP/1.1
hebe Dec  5 19:08:48 959277 192.168.0.249 hebe DEBUG: POST /remoty/osx/?edit.post HTTP/1.1
Host: hebe.local
Content-Type: application/x-www-form-urlencoded
Origin: http://hebe.local
Accept-Encoding: gzip, deflate
Content-Length: 7209
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/601.7.7 (KHTML, like Gecko) Version/9.1.2 Safari/601.7.7
Referer: http://hebe.local/remoty/osx/
Cache-Control: no-cache
Accept-Language: ja-jp


hebe Dec  5 19:08:48 959277 192.168.0.249 hebe Reply: 401 Unauthorized
hebe Dec  5 19:08:48 959277 192.168.0.249 hebe unallowed: /remoty/osx/
hebe Dec  5 19:08:48 959279 192.168.0.249 hebe POST /remoty/osx/?edit.post HTTP/1.1
hebe Dec  5 19:08:48 959279 192.168.0.249 hebe DEBUG: POST /remoty/osx/?edit.post HTTP/1.1
Host: hebe.local
Accept: */*
Authorization: Digest username="arisawa", realm="arisawa@hera", nonce="41e30d8cce717c1c4af50bcf", uri="/remoty/osx/?edit.post", response="7c1b6e04c420cdc1af24aec5a2db30eb", cnonce="3c426424ec91c4b0c4e5f3a92835d30d", nc=00000001, qop="auth"
Accept-Encoding: gzip, deflate
Cache-Control: no-cache
Accept-Language: ja-jp
Content-Type: application/x-www-form-urlencoded
Origin: http://hebe.local
Content-Length: 7209
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/601.7.7 (KHTML, like Gecko) Version/9.1.2 Safari/601.7.7
Referer: http://hebe.local/remoty/osx/


hebe Dec  5 19:08:48 959279 192.168.0.249 hebe exec /bin/remoty
hebe Dec  5 19:08:48 959279 192.168.0.249 hebe post 7209 bytes
hebe Dec  5 19:08:48 959279 192.168.0.249 hebe done /bin/remoty

他のブラウザ(ChromeやFirefox)の場合には POST の場合には最初から認証情報を添えてリクエストを送るようであるが、Safari の場合には一旦認証情報なしに POST する。当然拒否されるが、小さなファイルの場合には、認証情報を添えて再度 POST している。こういう考え方もあるだろう。しかし問題は大きなファイルに対しては、再トライしないことにある。