FULL PRODUCT VERSION :
java version "1.6.0_04"
Java(TM) SE Runtime Environment (build 1.6.0_04-b12)
Java HotSpot(TM) Client VM (build 10.0-b19, mixed mode, sharing)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows 2000 [Version 5.00.2195]
A DESCRIPTION OF THE PROBLEM :
The freeSelector(Selector selector) method of com.sun.net.httpserver.SelectorCache is never called when bad requests are reject. (request send via a telnet console for exemple)
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
To reproduce the bug, it's simple, you just need to open a telnet session to the httpServer, writes random bytes and then press Enter.
The process handle count will increase until the system limit
The step to run the test case :
1 - start the server
2 - start the badClient
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The correct behavior is that the handler count decrease to the minimal value
after the 20 min (because the system property
"sun.net.httpserver.selCacheTimeout" is set to 20;
ACTUAL -
You will see that the handler count of the server will increase, but never
decrease, event if you wait a long time after the end off the client.
---------- BEGIN SOURCE ----------
Here is the code of the Server side :
-----------------------------------------
import java.io.*;
import java.net.*;
import com.sun.net.httpserver.*;
public class SimpleServer implements HttpHandler
{
public static void main(String[] args)
{
try
{
System.setProperty("sun.net.httpserver.selCacheTimeout", "20");
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 1);
server.createContext("/", new SimpleServer());
server.setExecutor(null);
server.start();
}
catch(IOException e)
{
e.printStackTrace();
}
}
public void handle(HttpExchange t) throws IOException
{
InputStream is = t.getRequestBody();
byte[] bBody = new byte[1000];
is.read(bBody);
String response = "Hello\n";
t.sendResponseHeaders(200, response.length());
OutputStream os = t.getResponseBody();
os.write(response.getBytes());
is.close();
os.close();
t.close();
}
}
-----------------------------------------
And now, the code of a client which sends bag request :
-----------------------------------------
import java.io.*;
import java.net.*;
public class BadClient
{
private static int sleepTime = 5000;
private static String addr = "127.0.0.1";
private static int port = 8080;
public static void main(String[] args)
{
Socket socket;
InetSocketAddress serverAddr = new InetSocketAddress(addr, port);
byte[] badRequest = "bad request\r\n".getBytes();
try
{
while(true)
{
socket = new Socket();
socket.connect(serverAddr);
OutputStream out = socket.getOutputStream();
out.write(badRequest);
Thread.sleep(sleepTime);
socket.close();
}
}
catch(Throwable t)
{
t.printStackTrace();
}
}
}
---------- END SOURCE ----------
REPRODUCIBILITY :
This bug can be reproduced always.
java version "1.6.0_04"
Java(TM) SE Runtime Environment (build 1.6.0_04-b12)
Java HotSpot(TM) Client VM (build 10.0-b19, mixed mode, sharing)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows 2000 [Version 5.00.2195]
A DESCRIPTION OF THE PROBLEM :
The freeSelector(Selector selector) method of com.sun.net.httpserver.SelectorCache is never called when bad requests are reject. (request send via a telnet console for exemple)
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
To reproduce the bug, it's simple, you just need to open a telnet session to the httpServer, writes random bytes and then press Enter.
The process handle count will increase until the system limit
The step to run the test case :
1 - start the server
2 - start the badClient
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The correct behavior is that the handler count decrease to the minimal value
after the 20 min (because the system property
"sun.net.httpserver.selCacheTimeout" is set to 20;
ACTUAL -
You will see that the handler count of the server will increase, but never
decrease, event if you wait a long time after the end off the client.
---------- BEGIN SOURCE ----------
Here is the code of the Server side :
-----------------------------------------
import java.io.*;
import java.net.*;
import com.sun.net.httpserver.*;
public class SimpleServer implements HttpHandler
{
public static void main(String[] args)
{
try
{
System.setProperty("sun.net.httpserver.selCacheTimeout", "20");
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 1);
server.createContext("/", new SimpleServer());
server.setExecutor(null);
server.start();
}
catch(IOException e)
{
e.printStackTrace();
}
}
public void handle(HttpExchange t) throws IOException
{
InputStream is = t.getRequestBody();
byte[] bBody = new byte[1000];
is.read(bBody);
String response = "Hello\n";
t.sendResponseHeaders(200, response.length());
OutputStream os = t.getResponseBody();
os.write(response.getBytes());
is.close();
os.close();
t.close();
}
}
-----------------------------------------
And now, the code of a client which sends bag request :
-----------------------------------------
import java.io.*;
import java.net.*;
public class BadClient
{
private static int sleepTime = 5000;
private static String addr = "127.0.0.1";
private static int port = 8080;
public static void main(String[] args)
{
Socket socket;
InetSocketAddress serverAddr = new InetSocketAddress(addr, port);
byte[] badRequest = "bad request\r\n".getBytes();
try
{
while(true)
{
socket = new Socket();
socket.connect(serverAddr);
OutputStream out = socket.getOutputStream();
out.write(badRequest);
Thread.sleep(sleepTime);
socket.close();
}
}
catch(Throwable t)
{
t.printStackTrace();
}
}
}
---------- END SOURCE ----------
REPRODUCIBILITY :
This bug can be reproduced always.
- duplicates
-
JDK-6725892 Http server stability issues
-
- Closed
-