私はJavaでプロキシプログラムを書いています。仕組みは次のとおりです。
- ブラウザがプログラムに接続されます。
- ブラウザによるすべてのリクエストは、最初に標準出力に出力され、次にサーバーに転送されます。
- 次に、サーバーは応答を返します。これは標準出力にも出力され、ブラウザに転送されます。
私の問題は、ステップ 1 は機能し、ステップ 2 は機能しますが、ステップ 3 は失敗することです。プログラムは応答を取得でき、標準出力に適切に出力されますが、ブラウザはそれを取得できないようです。問題を切り分けるためにプログラムを修正しました。
ここで行うことは、応答をブラウザーに直接出力することだけです。
ServerSocket client = null;
try {
client = new ServerSocket(snoopPort);
} catch (IOException e) {
System.out.println("ERROR: Could not listen on port: " + snoopPort);
System.exit(-1);
}
Socket clientSocket = null;
try {
clientSocket = client.accept();
} catch (IOException e) {
System.out.println("ERROR: Accept failed on port: " + snoopPort);
System.exit(-1);
}
PrintWriter snoopOut = new PrintWriter(clientSocket.getOutputStream(), true);
snoopOut.print("HTTP/1.1 200 OK\r\n");
snoopOut.print("Date: Thu, 05 Feb 2009 06:37:28 GMT\r\n");
snoopOut.print("Server: Apache\r\n");
snoopOut.print("Set-Cookie: Apache=99.245.58.244.1233815848703045; path=/\r\n");
snoopOut.print("Accept-Ranges: bytes\r\n");
snoopOut.print("Transfer-Encoding: chunked\r\n");
snoopOut.print("Content-Type: text/html\r\n");
snoopOut.print("\r\n");
snoopOut.print("<html><head><title>test</head><body>hello world!</body></html>\r\n");
snoopOut.close();
clientSocket.close();
client.close();