* This test uses nonblocking entities.
*/
public void testHttpPostsWithExpectationVerification() throws Exception {
final int reqNo = 3;
final RequestCount requestCount = new RequestCount(reqNo);
final ResponseSequence responses = new ResponseSequence();
NHttpRequestHandler requestHandler = new SimpleNHttpRequestHandler() {
public ConsumingNHttpEntity entityRequest(
final HttpEntityEnclosingRequest request,
final HttpContext context) throws HttpException, IOException {
return new BufferingNHttpEntity(
request.getEntity(),
new HeapByteBufferAllocator());
}
@Override
public void handle(
final HttpRequest request,
final HttpResponse response,
final HttpContext context) throws HttpException, IOException {
NStringEntity outgoing = new NStringEntity("No content");
response.setEntity(outgoing);
}
};
HttpExpectationVerifier expectationVerifier = new HttpExpectationVerifier() {
public void verify(
final HttpRequest request,
final HttpResponse response,
final HttpContext context) throws HttpException {
Header someheader = request.getFirstHeader("Secret");
if (someheader != null) {
int secretNumber;
try {
secretNumber = Integer.parseInt(someheader.getValue());
} catch (NumberFormatException ex) {
response.setStatusCode(HttpStatus.SC_BAD_REQUEST);
return;
}
if (secretNumber < 2) {
response.setStatusCode(HttpStatus.SC_EXPECTATION_FAILED);
NByteArrayEntity outgoing = new NByteArrayEntity(
EncodingUtils.getAsciiBytes("Wrong secret number"));
response.setEntity(outgoing);
}
}
}
};
// Activate 'expect: continue' handshake
this.client.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, true);
NHttpRequestExecutionHandler requestExecutionHandler = new NHttpRequestExecutionHandler() {
public void initalizeContext(final HttpContext context, final Object attachment) {
context.setAttribute("LIST", attachment);
context.setAttribute("REQ-COUNT", Integer.valueOf(0));
context.setAttribute("RES-COUNT", Integer.valueOf(0));
}
public void finalizeContext(final HttpContext context) {
}
public ConsumingNHttpEntity responseEntity(
final HttpResponse response,
final HttpContext context) throws IOException {
return new BufferingNHttpEntity(response.getEntity(),
new HeapByteBufferAllocator());
}
public HttpRequest submitRequest(final HttpContext context) {
int i = ((Integer) context.getAttribute("REQ-COUNT")).intValue();
BasicHttpEntityEnclosingRequest post = null;
if (i < reqNo) {
post = new BasicHttpEntityEnclosingRequest("POST", "/");
post.addHeader("Secret", Integer.toString(i));
NByteArrayEntity outgoing = new NByteArrayEntity(
EncodingUtils.getAsciiBytes("No content"));
post.setEntity(outgoing);
context.setAttribute("REQ-COUNT", Integer.valueOf(i + 1));
}
return post;
}
public void handleResponse(final HttpResponse response, final HttpContext context) {
NHttpConnection conn = (NHttpConnection) context.getAttribute(
ExecutionContext.HTTP_CONNECTION);
ResponseSequence list = (ResponseSequence) context.getAttribute("LIST");
int i = ((Integer) context.getAttribute("RES-COUNT")).intValue();
i++;
context.setAttribute("RES-COUNT", Integer.valueOf(i));
HttpEntity entity = response.getEntity();
if (entity != null) {
try {
EntityUtils.toByteArray(entity);
} catch (IOException ex) {
requestCount.abort();
return;
}
}
list.addResponse(response);
requestCount.decrement();
if (i < reqNo) {
conn.requestInput();
}
}
};
NHttpServiceHandler serviceHandler = createHttpServiceHandler(
requestHandler,
expectationVerifier);
NHttpClientHandler clientHandler = createHttpClientHandler(
requestExecutionHandler);
this.server.setRequestCount(requestCount);
this.client.setRequestCount(requestCount);
this.server.start(serviceHandler);
this.client.start(clientHandler);
ListenerEndpoint endpoint = this.server.getListenerEndpoint();
endpoint.waitFor();
InetSocketAddress serverAddress = (InetSocketAddress) endpoint.getAddress();
this.client.openConnection(
new InetSocketAddress("localhost", serverAddress.getPort()),
responses);
requestCount.await(1000);
this.client.shutdown();
this.server.shutdown();
assertEquals(reqNo, responses.size());