メモ書き Java

2005/01/17
■いつの間にかサーバの仕様が変わってた

いつの間にかサーバの仕様が変わっていた。
(昨年12月にcgiをいじっていて気づいた)

2005/10/19以降に2度ほどサーバメンテナンスがあり、その時に仕様が変わったみたい。

2005/10/26(未確認)
cgi専用サーバアドレスでcgi以外のものが指定可能になった?
例http://cgi.www5d.biglobe.ne.jp/~abcdef/index.html
2005/11/22(問い合わせ確認済み)
cgi専用サーバアドレスではないのにcgiが実行可能になった。
例http://www5d.biglobe.ne.jp/~abcdef/test.cgi

どうやらlinuxになって最新のwww7aサーバの仕様で動くようになったようだ。
(なんか全体的に通信が重くなった気がしてならないが・・・)
もちろんwww5d旧仕様でもそのまま動く。

よってJavaAppletとCGI(BIGLOBEサーバ)JavaAppletとCGI(BIGLOBEサーバ)(2)
書いたような苦労はしなくて済むようになった・・・。

で、新仕様でのテストをやってみた。
JavaAppletからCGIをPOSTでキックして、リターンを受け取る。


CGI060117b.java (ちなみに jdk1.3.1_16 です)

import java.applet.Applet;
import java.awt.TextArea;
import java.net.*;
import java.io.*;

public class CGI060117b extends Applet {
    TextArea ta;

    public void init() {
        ta = new TextArea();
        add(ta);
        ta.append("CodeBase: " + getCodeBase().toString() + "\n\n");
        try{
            URL url = new URL(getCodeBase().toString() + "test060116b.cgi");

            URLConnection uc = url.openConnection();
            
            uc.setDoOutput(true);
            uc.setUseCaches(false);
            
            PrintWriter pw = new PrintWriter(uc.getOutputStream());
            //pw.print("name=value&XYZ=あいうえお");
            pw.print("name=value&XYZ=" + URLEncoder.encode("あいうえお"));
            pw.close();
            
            InputStreamReader isr =new InputStreamReader(uc.getInputStream());
            
            BufferedReader br = new BufferedReader(isr);

            while(true) {
                String str = br.readLine();
                if (str == null) {
                    break;
                }
                ta.append(str + "\n");
                ta.append(URLDecoder.decode(str) + "\n");
            }

            br.close();
            isr.close();
        }
        catch(Exception e){
            ta.append(e.toString());
        }
    }
}


test060116b.cgi

#!/usr/local/bin/perl

read( STDIN, $postbuf, $ENV{'CONTENT_LENGTH'} );

print "Content-Type: text/html\n\n";

print $postbuf;

結果

POST送信なので自動的にエンコードしてくれるのか?と思ったが、そうではないようだ。
ブラウザからHTMLでPOSTしたときか?
以下 ethreal のキャプチャー結果

URLEncoderを使ってPOSTした通信ログ



CGIからのリターン




URLEncoderを使用せずにPOSTした通信ログ

ほんとにそのまま流れています・・・。



CGIからのリターン



今回は Windows ブラウザで試したが、MacやUNIXになるとデフォルトエンコーディングが違うらしい。
(WinはSJIS。UNIXはEUC?)
となるとサーバ側(perl)で日本語などを保存したいときはSJISかEUCかを判別してどちらかに変換しなきゃならない?

やはり j2sdk1.4 以降にして Unicode で統一すべきか・・・
(URLEncoderクラスのencodeメソッドの仕様が変わって文字コードの指定ができるようになった)


1.3だとwin95,98ユーザにやさしいんだけどなぁ・・・。
(JavaVMがIEに標準搭載されていて、1.3までならそのままで動く)