blob: 8fec04b7cbaa38bb4fca78458fec2131cad44be1 [file] [log] [blame]
/*
* $HeadURL: https://svn.apache.org/repos/asf/jakarta/commons/proper/httpclient/branches/HTTPCLIENT_3_0_BRANCH/src/test/org/apache/commons/httpclient/TestEntityEnclosingMethod.java $
* $Revision: 1.1 $
* $Date: 2009/02/13 18:07:48 $
*
* ====================================================================
*
* Copyright 2003-2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
*/
package org.apache.commons.httpclient;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.commons.httpclient.server.AuthRequestHandler;
import org.apache.commons.httpclient.server.HttpRequestHandlerChain;
import org.apache.commons.httpclient.server.HttpService;
import org.apache.commons.httpclient.server.HttpServiceHandler;
import org.apache.commons.httpclient.server.SimpleRequest;
import org.apache.commons.httpclient.server.SimpleResponse;
/**
* Tests specific to entity enclosing methods.
*
* @author Oleg Kalnichevski
* @version $Id: TestEntityEnclosingMethod.java,v 1.1 2009/02/13 18:07:48 slewis Exp $
*/
public class TestEntityEnclosingMethod extends HttpClientTestBase {
public TestEntityEnclosingMethod(String testName) throws IOException {
super(testName);
}
public static Test suite() {
TestSuite suite = new TestSuite(TestEntityEnclosingMethod.class);
return suite;
}
public static void main(String args[]) {
String[] testCaseName = { TestEntityEnclosingMethod.class.getName() };
junit.textui.TestRunner.main(testCaseName);
}
// ------------------------------------------------------------------ Tests
public void testEnclosedEntityAutoLength() throws Exception {
String inputstr = "This is a test message";
byte[] input = inputstr.getBytes("US-ASCII");
InputStream instream = new ByteArrayInputStream(input);
RequestEntity requestentity = new InputStreamRequestEntity(
instream, InputStreamRequestEntity.CONTENT_LENGTH_AUTO);
PostMethod method = new PostMethod("/");
method.setRequestEntity(requestentity);
this.server.setHttpService(new EchoService());
try {
this.client.executeMethod(method);
assertEquals(200, method.getStatusCode());
String body = method.getResponseBodyAsString();
assertEquals(inputstr, body);
assertNull(method.getRequestHeader("Transfer-Encoding"));
assertNotNull(method.getRequestHeader("Content-Length"));
assertEquals(input.length, Integer.parseInt(
method.getRequestHeader("Content-Length").getValue()));
} finally {
method.releaseConnection();
}
}
public void testEnclosedEntityExplicitLength() throws Exception {
String inputstr = "This is a test message";
byte[] input = inputstr.getBytes("US-ASCII");
InputStream instream = new ByteArrayInputStream(input);
RequestEntity requestentity = new InputStreamRequestEntity(
instream, 14);
PostMethod method = new PostMethod("/");
method.setRequestEntity(requestentity);
this.server.setHttpService(new EchoService());
try {
this.client.executeMethod(method);
assertEquals(200, method.getStatusCode());
String body = method.getResponseBodyAsString();
assertEquals("This is a test", body);
assertNull(method.getRequestHeader("Transfer-Encoding"));
assertNotNull(method.getRequestHeader("Content-Length"));
assertEquals(14, Integer.parseInt(
method.getRequestHeader("Content-Length").getValue()));
} finally {
method.releaseConnection();
}
}
public void testEnclosedEntityChunked() throws Exception {
String inputstr = "This is a test message";
byte[] input = inputstr.getBytes("US-ASCII");
InputStream instream = new ByteArrayInputStream(input);
RequestEntity requestentity = new InputStreamRequestEntity(
instream, InputStreamRequestEntity.CONTENT_LENGTH_AUTO);
PostMethod method = new PostMethod("/");
method.setRequestEntity(requestentity);
method.setContentChunked(true);
this.server.setHttpService(new EchoService());
try {
this.client.executeMethod(method);
assertEquals(200, method.getStatusCode());
String body = method.getResponseBodyAsString();
assertEquals(inputstr, body);
assertNotNull(method.getRequestHeader("Transfer-Encoding"));
assertNull(method.getRequestHeader("Content-Length"));
} finally {
method.releaseConnection();
}
}
public void testEnclosedEntityChunkedHTTP1_0() throws Exception {
String inputstr = "This is a test message";
byte[] input = inputstr.getBytes("US-ASCII");
InputStream instream = new ByteArrayInputStream(input);
RequestEntity requestentity = new InputStreamRequestEntity(
instream, InputStreamRequestEntity.CONTENT_LENGTH_AUTO);
PostMethod method = new PostMethod("/");
method.setRequestEntity(requestentity);
method.setContentChunked(true);
method.getParams().setVersion(HttpVersion.HTTP_1_0);
this.server.setHttpService(new EchoService());
try {
this.client.executeMethod(method);
fail("ProtocolException should have been thrown");
} catch (ProtocolException ex) {
// expected
} finally {
method.releaseConnection();
}
}
public void testEnclosedEntityRepeatable() throws Exception {
String inputstr = "This is a test message";
byte[] input = inputstr.getBytes("US-ASCII");
InputStream instream = new ByteArrayInputStream(input);
RequestEntity requestentity = new InputStreamRequestEntity(
instream, InputStreamRequestEntity.CONTENT_LENGTH_AUTO);
PostMethod method = new PostMethod("/");
method.setRequestEntity(requestentity);
UsernamePasswordCredentials creds =
new UsernamePasswordCredentials("testuser", "testpass");
HttpRequestHandlerChain handlerchain = new HttpRequestHandlerChain();
handlerchain.appendHandler(new AuthRequestHandler(creds));
handlerchain.appendHandler(new HttpServiceHandler(new EchoService()));
this.server.setRequestHandler(handlerchain);
this.client.getState().setCredentials(AuthScope.ANY, creds);
try {
this.client.executeMethod(method);
assertEquals(200, method.getStatusCode());
String body = method.getResponseBodyAsString();
assertEquals(inputstr, body);
assertNull(method.getRequestHeader("Transfer-Encoding"));
assertNotNull(method.getRequestHeader("Content-Length"));
assertEquals(input.length, Integer.parseInt(
method.getRequestHeader("Content-Length").getValue()));
} finally {
method.releaseConnection();
}
}
public void testEnclosedEntityNonRepeatable() throws Exception {
String inputstr = "This is a test message";
byte[] input = inputstr.getBytes("US-ASCII");
InputStream instream = new ByteArrayInputStream(input);
RequestEntity requestentity = new InputStreamRequestEntity(
instream, InputStreamRequestEntity.CONTENT_LENGTH_AUTO);
PostMethod method = new PostMethod("/");
method.setRequestEntity(requestentity);
method.setContentChunked(true);
UsernamePasswordCredentials creds =
new UsernamePasswordCredentials("testuser", "testpass");
HttpRequestHandlerChain handlerchain = new HttpRequestHandlerChain();
handlerchain.appendHandler(new AuthRequestHandler(creds));
handlerchain.appendHandler(new HttpServiceHandler(new EchoService()));
this.server.setRequestHandler(handlerchain);
this.client.getState().setCredentials(AuthScope.ANY, creds);
try {
this.client.executeMethod(method);
fail("ProtocolException should have been thrown");
} catch (ProtocolException ex) {
// expected
} finally {
method.releaseConnection();
}
}
public void testEnclosedEntityNegativeLength() throws Exception {
String inputstr = "This is a test message";
byte[] input = inputstr.getBytes("US-ASCII");
InputStream instream = new ByteArrayInputStream(input);
RequestEntity requestentity = new InputStreamRequestEntity(
instream, -14);
PostMethod method = new PostMethod("/");
method.setRequestEntity(requestentity);
method.setContentChunked(false);
this.server.setHttpService(new EchoService());
try {
this.client.executeMethod(method);
assertEquals(200, method.getStatusCode());
String body = method.getResponseBodyAsString();
assertEquals(inputstr, body);
assertNotNull(method.getRequestHeader("Transfer-Encoding"));
assertNull(method.getRequestHeader("Content-Length"));
} finally {
method.releaseConnection();
}
}
public void testEnclosedEntityNegativeLengthHTTP1_0() throws Exception {
String inputstr = "This is a test message";
byte[] input = inputstr.getBytes("US-ASCII");
InputStream instream = new ByteArrayInputStream(input);
RequestEntity requestentity = new InputStreamRequestEntity(
instream, -14);
PostMethod method = new PostMethod("/");
method.setRequestEntity(requestentity);
method.setContentChunked(false);
method.getParams().setVersion(HttpVersion.HTTP_1_0);
this.server.setHttpService(new EchoService());
try {
this.client.executeMethod(method);
fail("ProtocolException should have been thrown");
} catch (ProtocolException ex) {
// expected
} finally {
method.releaseConnection();
}
}
class RequestBodyStatsService implements HttpService {
public RequestBodyStatsService() {
super();
}
public boolean process(final SimpleRequest request, final SimpleResponse response)
throws IOException
{
HttpVersion httpversion = request.getRequestLine().getHttpVersion();
response.setStatusLine(httpversion, HttpStatus.SC_OK);
response.addHeader(new Header("Content-Type", "text/plain"));
StringBuffer buffer = new StringBuffer();
buffer.append("Request bosy stats:\r\n");
buffer.append("===================\r\n");
long l = request.getContentLength();
if (l >= 0) {
buffer.append("Content-Length: ");
buffer.append(l);
buffer.append("\r\n");
}
Header te = request.getFirstHeader("Transfer-Encoding");
if (te != null) {
buffer.append("Content-Length: ");
buffer.append(te.getValue());
buffer.append("\r\n");
}
byte[] b = request.getBodyBytes();
if (b.length <= 0) {
buffer.append("No body submitted\r\n");
}
response.setBodyString(buffer.toString());
return true;
}
}
public void testEmptyPostMethod() throws Exception {
this.server.setHttpService(new RequestBodyStatsService());
PostMethod method = new PostMethod("/");
method.setRequestHeader("Content-Type", "text/plain");
this.client.executeMethod(method);
assertEquals(200,method.getStatusLine().getStatusCode());
String response = method.getResponseBodyAsString();
assertNotNull(method.getRequestHeader("Content-Length"));
assertTrue(response.indexOf("No body submitted") >= 0);
method = new PostMethod("/");
method.setRequestHeader("Content-Type", "text/plain");
method.setRequestEntity(new StringRequestEntity(""));
this.client.executeMethod(method);
assertEquals(200,method.getStatusLine().getStatusCode());
assertNotNull(method.getRequestHeader("Content-Length"));
response = method.getResponseBodyAsString();
assertTrue(response.indexOf("No body submitted") >= 0);
method = new PostMethod("/");
method.setRequestHeader("Content-Type", "text/plain");
method.setContentChunked(true);
this.client.executeMethod(method);
assertEquals(200,method.getStatusLine().getStatusCode());
assertNotNull(method.getRequestHeader("Content-Length"));
response = method.getResponseBodyAsString();
assertTrue(response.indexOf("No body submitted") >= 0);
method = new PostMethod("/");
method.setRequestHeader("Content-Type", "text/plain");
method.setRequestEntity(new StringRequestEntity(""));
method.setContentChunked(true);
this.client.executeMethod(method);
assertNull(method.getRequestHeader("Content-Length"));
assertNotNull(method.getRequestHeader("Transfer-Encoding"));
assertEquals(200,method.getStatusLine().getStatusCode());
response = method.getResponseBodyAsString();
assertTrue(response.indexOf("No body submitted") >= 0);
}
}