/* * $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); } }