僕は Chrome を使ってたが、近頃の Chrome は使い物にならない。Chrome を動かしていると、ネットを使う他のアプリの動きが極端に遅くなるのだ。アクティビティモニターで調べると Chrome はネットを酷使している。Chrome をつかってネットサーフィンしかしていないユーザーにとってはそれで良いのかも知れないが、そうではないユーザーにとっては甚だ迷惑である。
そこで他のブラウザを試すことにした。そして 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 している。こういう考え方もあるだろう。しかし問題は大きなファイルに対しては、再トライしないことにある。