MIDIを作れるJavaアプレットを作っているのだ。
前回では終了処理を行ったのだ。
第7回で、出来上がったデータをCGIに向けて送り出す方法を書きました。
しかし、実はあの方法で送りつけると、サーバーによっては「404 Not Acceptable」のエラーを起こすことがわかったのです。
さて、何が問題なのか考えてみましょうか。
POST (実行するCGIのパス) HTTP/1.1 Host: (ホスト名):(ポート番号) Content-Type: multipart/form-data; boundary=(区切り文字列) Content-Length: (受け渡すデータのサイズ) Connection: close (空行) (バイナリデータ)
…はて、送りつけるのは複数のパートに分かれた(multipart)フォームデータ(form-data)でしたっけ?
こちらが勝手に決めた法則で並べられた一連のバイナリデータであり、「multipart/form-data」じゃないみたいです。
もしかすると、気の利いたサーバーだと「multipart/form-data」としておくと送られてきたデータをフォームデータとして解析してCGIに渡そうとするのかもしれません(あくまでも私の勝手な予想です)。
ともかく、一連のバイナリデータであるということで、Content-Typeを「application/octet-stream」としておきます。
POST (実行するCGIのパス) HTTP/1.1 Host: (ホスト名):(ポート番号) Content-Type: application/octet-stream Content-Length: (受け渡すデータのサイズ) Connection: close (空行) (バイナリデータ)
コードはそう変わっていませんが次のようになります。
せっかくなので80以外のポートにも対応させました。
エラー処理はここでは省略していますが実際は書いてますよ!
Socket socket; String host = applet.uri_save.getHost(); String path = applet.uri_save.getPath(); int port = applet.uri_save.getPort(); if (port==-1) port=80; socket = new Socket(host,port); PrintWriter print = new PrintWriter(socket.getOutputStream()); print.println("POST "+path+" HTTP/1.1"); print.println("Host: "+host+":"+Integer.toString(port)); print.println("Content-Type: application/octet-stream"); print.println("Content-Length: "+stream.size()); print.println("Connection: close"); print.println(); print.flush(); stream.writeTo(socket.getOutputStream()); socket.getOutputStream().flush();
要点
- 独自形式のバイナリデータを送るならContent-Typeは「application/octet-stream」が無難。
- URL.getPort()で80以外のポート番号にも対応。
- この前は嘘書いてごめん。