@SuppressWarnings("unchecked")
public void testSimpleBasicHttpEntityEnclosingRequestsHTTP10() throws Exception {
final int connNo = 3;
final int reqNo = 20;
final RequestCount requestCount = new RequestCount(connNo * reqNo);
Random rnd = new Random();
// Prepare some random data
final List testData = new ArrayList(reqNo);
for (int i = 0; i < reqNo; i++) {
int size = rnd.nextInt(5000);
byte[] data = new byte[size];
rnd.nextBytes(data);
testData.add(data);
}
List[] responseData = new List[connNo];
for (int i = 0; i < responseData.length; i++) {
responseData[i] = new ArrayList();
}
HttpRequestHandler requestHandler = new HttpRequestHandler() {
public void handle(
final HttpRequest request,
final HttpResponse response,
final HttpContext context) throws HttpException, IOException {
if (request instanceof HttpEntityEnclosingRequest) {
HttpEntity incoming = ((HttpEntityEnclosingRequest) request).getEntity();
byte[] data = EntityUtils.toByteArray(incoming);
ByteArrayEntity outgoing = new ByteArrayEntity(data);
outgoing.setChunked(false);
response.setEntity(outgoing);
} else {
StringEntity outgoing = new StringEntity("No content");
response.setEntity(outgoing);
}
}
};
// Set protocol level to HTTP/1.0
this.client.getParams().setParameter(
CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_0);
HttpRequestExecutionHandler requestExecutionHandler = new HttpRequestExecutionHandler() {
public void initalizeContext(final HttpContext context, final Object attachment) {
context.setAttribute("LIST", (List) attachment);
context.setAttribute("REQ-COUNT", new Integer(0));
context.setAttribute("RES-COUNT", new Integer(0));
}
public void finalizeContext(final HttpContext context) {
}
public HttpRequest submitRequest(final HttpContext context) {
int i = ((Integer) context.getAttribute("REQ-COUNT")).intValue();
BasicHttpEntityEnclosingRequest post = null;
if (i < reqNo) {
post = new BasicHttpEntityEnclosingRequest("POST", "/?" + i);
byte[] data = (byte[]) testData.get(i);
ByteArrayEntity outgoing = new ByteArrayEntity(data);
post.setEntity(outgoing);
context.setAttribute("REQ-COUNT", new Integer(i + 1));
}
return post;
}
public void handleResponse(final HttpResponse response, final HttpContext context) {
NHttpConnection conn = (NHttpConnection) context.getAttribute(
ExecutionContext.HTTP_CONNECTION);
List list = (List) context.getAttribute("LIST");
int i = ((Integer) context.getAttribute("RES-COUNT")).intValue();
i++;
context.setAttribute("RES-COUNT", new Integer(i));
try {
HttpEntity entity = response.getEntity();
byte[] data = EntityUtils.toByteArray(entity);
list.add(data);
requestCount.decrement();
} catch (IOException ex) {
requestCount.abort();
}
if (i < reqNo) {
conn.requestInput();
}
}
};
SimpleEventListener serverEventListener = new SimpleEventListener();
SimpleEventListener clientEventListener = new SimpleEventListener();
NHttpServiceHandler serviceHandler = createHttpServiceHandler(
requestHandler,
null,
serverEventListener);
NHttpClientHandler clientHandler = createHttpClientHandler(
requestExecutionHandler,
clientEventListener);
this.server.start(serviceHandler);
this.client.start(clientHandler);
InetSocketAddress serverAddress = (InetSocketAddress) this.server.getSocketAddress();
for (int i = 0; i < responseData.length; i++) {
this.client.openConnection(
new InetSocketAddress("localhost", serverAddress.getPort()),
responseData[i]);
}
requestCount.await(10000);
assertEquals(0, requestCount.getValue());
this.client.shutdown();
this.server.shutdown();
for (int c = 0; c < responseData.length; c++) {