You are viewing a plain text version of this content. The canonical link for it is here.
Posted to awf-commits@incubator.apache.org by sl...@apache.org on 2012/02/12 18:31:27 UTC
svn commit: r1243289 - in /incubator/deft/trunk/src:
main/java/org/apache/deft/web/http/HttpRequestImpl.java
main/java/org/apache/deft/web/http/PartialHttpRequest.java
test/java/org/apache/deft/web/http/HttpRequestImplTest.java
Author: slemesle
Date: Sun Feb 12 18:31:26 2012
New Revision: 1243289
URL: http://svn.apache.org/viewvc?rev=1243289&view=rev
Log:
Cleanup old fashion http parser
Removed:
incubator/deft/trunk/src/main/java/org/apache/deft/web/http/PartialHttpRequest.java
Modified:
incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpRequestImpl.java
incubator/deft/trunk/src/test/java/org/apache/deft/web/http/HttpRequestImplTest.java
Modified: incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpRequestImpl.java
URL: http://svn.apache.org/viewvc/incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpRequestImpl.java?rev=1243289&r1=1243288&r2=1243289&view=diff
==============================================================================
--- incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpRequestImpl.java (original)
+++ incubator/deft/trunk/src/main/java/org/apache/deft/web/http/HttpRequestImpl.java Sun Feb 12 18:31:26 2012
@@ -22,10 +22,8 @@ package org.apache.deft.web.http;
import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.net.URLDecoder;
-import java.nio.ByteBuffer;
import java.util.Collection;
import java.util.Collections;
-import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;
@@ -33,18 +31,14 @@ import com.google.common.base.Charsets;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.Maps;
-import org.apache.deft.io.IOLoop;
import org.apache.deft.io.buffer.DynamicByteBuffer;
-import org.apache.deft.util.ArrayUtil;
import org.apache.deft.web.http.protocol.HttpVerb;
/**
- * TODO SLM Cleanup old Parsing code
+ *
*/
public class HttpRequestImpl implements HttpRequest {
- private IOLoop ioLoop;
-
private String requestLine;
private HttpVerb method;
private String requestedPath; // correct name?
@@ -71,13 +65,6 @@ public class HttpRequestImpl implements
public static final Pattern PARAM_STRING_PATTERN = Pattern.compile("\\&|;");
/** Regex to parse out key/value pairs */
public static final Pattern KEY_VALUE_PATTERN = Pattern.compile("=");
- /** Regex to parse raw headers and body */
- public static final Pattern RAW_VALUE_PATTERN = Pattern.compile("\\r\\n\\r\\n");
- // TODO fix a better regexp for this
- /** Regex to parse raw headers from body */
- public static final Pattern HEADERS_BODY_PATTERN = Pattern.compile("\\r\\n");
- /** Regex to parse header name and value */
- public static final Pattern HEADER_VALUE_PATTERN = Pattern.compile(": ");
/** Regex to split cookie header following RFC6265 Section 5.4 */
public static final Pattern COOKIE_SEPARATOR_PATTERN = Pattern.compile(";");
@@ -103,86 +90,6 @@ public class HttpRequestImpl implements
body = null;
initKeepAlive();
parameters = parseParameters((pathFrags.length>1 ? pathFrags[1]: ""));
-
- }
-
- public HttpRequestImpl(String method, String fullUrl, String version, Map<String, String> headers,
- ImmutableMultimap<String, String> params) {
- requestLine = method + " " + fullUrl + " " + version;
- this.method = HttpVerb.valueOf(method);
- String[] pathFrags = QUERY_STRING_PATTERN.split(fullUrl);
- requestedPath = pathFrags[0];
- this.version = version;
- this.headers = headers;
- body = null;
- initKeepAlive();
- parameters = params;
- }
-
- /**
- * Creates a new HttpRequest
- *
- * @param requestLine The Http request text line
- * @param headers The Http request headers
- * @param body The Http request posted body
- */
- public HttpRequestImpl(String requestLine, Map<String, String> headers, String body) {
- this(requestLine, headers);
- this.body = body;
- }
-
- public static HttpRequestImpl of(ByteBuffer buffer) {
- try {
- String raw = new String(buffer.array(), 0, buffer.limit(), Charsets.ISO_8859_1);
- String[] headersAndBody = RAW_VALUE_PATTERN.split(raw);
- String[] headerFields = HEADERS_BODY_PATTERN.split(headersAndBody[0]);
- headerFields = ArrayUtil.dropFromEndWhile(headerFields, "");
-
- String requestLine = headerFields[0];
- Map<String, String> generalHeaders = new HashMap<String, String>();
- for (int i = 1; i < headerFields.length; i++) {
- String[] header = HEADER_VALUE_PATTERN.split(headerFields[i]);
- generalHeaders.put(header[0].toLowerCase(), header[1]);
- }
-
- String body = "";
- for (int i = 1; i < headersAndBody.length; ++i) { // First entry
- // contains
- // headers
- body += headersAndBody[i];
- }
-
- if (requestLine.contains("POST") || requestLine.contains("PUT")) {
- int contentLength = Integer.parseInt(generalHeaders.get("content-length"));
- if (contentLength > body.length()) {
- String[] elements = REQUEST_LINE_PATTERN.split(requestLine);
- return new PartialHttpRequest(elements[0], requestLine, generalHeaders, body);
- }
- }
- return new HttpRequestImpl(requestLine, generalHeaders, body);
- } catch (Exception t) {
- return MalFormedHttpRequest.instance;
- }
- }
-
- public static HttpRequestImpl continueParsing(ByteBuffer buffer, PartialHttpRequest unfinished) {
- String nextChunk = new String(buffer.array(), 0, buffer.limit(), Charsets.US_ASCII);
- unfinished.appendBody(nextChunk);
-
- int contentLength = Integer.parseInt(unfinished.getHeader("Content-Length"));
- if (contentLength > unfinished.getBody().length()) {
- return unfinished;
- } else {
- return new HttpRequestImpl(unfinished.getRequestLine(), unfinished.getHeaders(), unfinished.getBody());
- }
- }
-
- protected void setIOLoop(IOLoop ioLoop) {
- this.ioLoop = ioLoop;
- }
-
- public IOLoop getIOLoop() {
- return ioLoop;
}
@Override
@@ -328,6 +235,10 @@ public class HttpRequestImpl implements
return keepAlive;
}
+ /**
+ * TODO SLM This should output the real request and use a StringBuilder
+ * @return
+ */
@Override
public String toString() {
String result = "METHOD: " + method + "\n";
@@ -393,14 +304,10 @@ public class HttpRequestImpl implements
}
protected void initKeepAlive() {
+ keepAlive = true;
String connection = getHeader("Connection");
-
- if ("keep-alive".equalsIgnoreCase(connection)) {
- keepAlive = true;
- } else if ("close".equalsIgnoreCase(connection) || requestLine.contains("1.0")) {
+ if ("close".equalsIgnoreCase(connection) || requestLine.contains("1.0")) {
keepAlive = false;
- } else {
- keepAlive = true;
}
}
@@ -476,7 +383,7 @@ public class HttpRequestImpl implements
}
public boolean expectContinue() {
- return (bodyBuffer != null && bodyBuffer.position() == 0) && headers.get("expect") != null;
+ return (bodyBuffer == null || bodyBuffer.position() == 0) && headers.containsKey("expect");
}
}
Modified: incubator/deft/trunk/src/test/java/org/apache/deft/web/http/HttpRequestImplTest.java
URL: http://svn.apache.org/viewvc/incubator/deft/trunk/src/test/java/org/apache/deft/web/http/HttpRequestImplTest.java?rev=1243289&r1=1243288&r2=1243289&view=diff
==============================================================================
--- incubator/deft/trunk/src/test/java/org/apache/deft/web/http/HttpRequestImplTest.java (original)
+++ incubator/deft/trunk/src/test/java/org/apache/deft/web/http/HttpRequestImplTest.java Sun Feb 12 18:31:26 2012
@@ -19,342 +19,17 @@
*/
package org.apache.deft.web.http;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.apache.deft.util.ArrayUtil;
-import org.apache.deft.util.HttpRequestHelper;
-import org.apache.deft.util.HttpUtil;
import org.junit.Assert;
import org.junit.Test;
public class HttpRequestImplTest {
@Test
- public void testDeserializeHttpGetRequest() {
- HttpRequestHelper helper = new HttpRequestHelper();
- helper.addHeader("Host", "127.0.0.1:8080");
- helper.addHeader("User-Agent", "curl/7.19.5 (i386-apple-darwin10.0.0) libcurl/7.19.5 zlib/1.2.3");
- helper.addHeader("Accept", "*/*");
- ByteBuffer bb1 = helper.getRequestAsByteBuffer();
-
- helper = new HttpRequestHelper();
- helper.addHeader("Host", "127.0.0.1:8080");
- helper.addHeader("User-Agent",
- "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; sv-SE; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2");
- helper.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
- helper.addHeader("Accept-Language", "sv-se,sv;q=0.8,en-us;q=0.5,en;q=0.3");
- helper.addHeader("Accept-Encoding", "gzip,deflate");
- helper.addHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
- helper.addHeader("Keep-Alive", "115");
- helper.addHeader("Connection", "keep-alve");
- ByteBuffer bb2 = helper.getRequestAsByteBuffer();
-
- HttpRequest request1 = HttpRequestImpl.of(bb1);
- HttpRequest request2 = HttpRequestImpl.of(bb2);
-
- assertEquals("GET / HTTP/1.1", request1.getRequestLine());
- assertEquals("GET / HTTP/1.1", request2.getRequestLine());
-
- assertEquals(4, request1.getHeaders().size());
- assertEquals(9, request2.getHeaders().size());
-
- List<String> expectedHeaderNamesInRequest1 = Arrays.asList(new String[] { "User-Agent", "Host", "Accept",
- "From" });
- for (String expectedHeaderName : expectedHeaderNamesInRequest1) {
- assertTrue(request1.getHeaders().containsKey(expectedHeaderName.toLowerCase()));
- }
-
- List<String> expectedHeaderNamesInRequest2 = Arrays.asList(new String[] { "Host", "User-Agent", "Accept",
- "From", "Accept-Language", "Accept-Encoding", "Accept-Charset", "Keep-Alive", "Connection" });
- for (String expectedHeaderName : expectedHeaderNamesInRequest2) {
- assertTrue(request2.getHeaders().containsKey(expectedHeaderName.toLowerCase()));
- }
-
- // TODO RS 100920 verify that the headers exist
- }
-
- public void testRemoveTrailingEmptyStrings() {
- String fields1[] = new String[] { "a", "b", "c", "", "" };
- String fields2[] = new String[] { "a", "b", "c" };
-
- assertEquals(3, ArrayUtil.dropFromEndWhile(fields1, "").length);
- assertEquals(3, ArrayUtil.dropFromEndWhile(fields2, "").length);
- }
-
- @Test
- public void testSingleGetParameter() {
- HttpRequestHelper helper = new HttpRequestHelper();
- helper.addGetParameter("firstname", "jim");
-
- HttpRequest request = HttpRequestImpl.of(helper.getRequestAsByteBuffer());
-
- assertEquals(1, request.getParameters().size());
- assertEquals("jim", request.getParameter("firstname"));
- }
-
- @Test
- public void testMultipleGetParameter() {
- HttpRequestHelper helper = new HttpRequestHelper();
- helper.addGetParameter("firstname", "jim");
- helper.addGetParameter("lastname", "petersson");
- helper.addGetParameter("city", "stockholm");
-
- HttpRequest request = HttpRequestImpl.of(helper.getRequestAsByteBuffer());
- Map<String, Collection<String>> params = request.getParameters();
-
- assertEquals(3, getSize(params));
- assertEquals("jim", request.getParameter("firstname"));
- assertEquals("petersson", request.getParameter("lastname"));
- assertEquals("stockholm", request.getParameter("city"));
- }
-
- private int getSize(Map<String, Collection<String>> mmap) {
- int size = 0;
- for (Collection<String> values : mmap.values()) {
- size += values.size();
- }
- return size;
- }
-
- @Test
- public void testSingleParameterWithoutValue() {
- HttpRequestHelper helper = new HttpRequestHelper();
- helper.addGetParameter("firstname", null);
-
- HttpRequest request = HttpRequestImpl.of(helper.getRequestAsByteBuffer());
- Map<String, Collection<String>> params = request.getParameters();
- assertEquals(0, getSize(params));
- assertEquals(null, request.getParameter("firstname"));
- }
-
- @Test
- public void testMultipleParametersWithoutValue() {
- HttpRequestHelper helper = new HttpRequestHelper();
- helper.addGetParameter("firstname", null);
- helper.addGetParameter("lastName", "");
-
- HttpRequest request = HttpRequestImpl.of(helper.getRequestAsByteBuffer());
- Map<String, Collection<String>> params = request.getParameters();
-
- assertEquals(0, getSize(params));
- assertEquals(null, request.getParameter("firstname"));
- assertEquals(null, request.getParameter("lastName"));
- }
-
- @Test
- public void testMultipleParametersWithAndWithoutValue() {
- HttpRequestHelper helper = new HttpRequestHelper();
- helper.addGetParameter("firstname", null);
- helper.addGetParameter("lastName", "petersson");
- helper.addGetParameter("city", "");
- helper.addGetParameter("phoneno", "12345");
- helper.addGetParameter("age", "30");
-
- HttpRequest request = HttpRequestImpl.of(helper.getRequestAsByteBuffer());
- Map<String, Collection<String>> params = request.getParameters();
-
- assertEquals(3, getSize(params));
- assertEquals(null, request.getParameter("firstname"));
- assertEquals("petersson", request.getParameter("lastName"));
- assertEquals(null, request.getParameter("city"));
- assertEquals("12345", request.getParameter("phoneno"));
- assertEquals("30", request.getParameter("age"));
- }
-
- @Test
- public void testSingleGetParameterMultipleValues() {
- HttpRequestHelper helper = new HttpRequestHelper();
- helper.addGetParameter("letters", "x");
- helper.addGetParameter("letters", "y");
- helper.addGetParameter("letters", "z");
-
- HttpRequest request = HttpRequestImpl.of(helper.getRequestAsByteBuffer());
- Map<String, Collection<String>> params = request.getParameters();
-
- assertEquals(3, getSize(params));
- Collection<String> values = params.get("letters");
- assertEquals(3, values.size());
- assertTrue(values.contains("x"));
- assertTrue(values.contains("y"));
- assertTrue(values.contains("z"));
- }
-
- @Test
- public void testMultipleGetParametersMultipleValues() {
- HttpRequestHelper helper = new HttpRequestHelper();
- helper.addGetParameter("letters", "x");
- helper.addGetParameter("letters", "y");
- helper.addGetParameter("letters", "z");
- helper.addGetParameter("numbers", "23");
- helper.addGetParameter("numbers", "54");
- helper.addGetParameter("country", "swe");
-
- HttpRequest request = HttpRequestImpl.of(helper.getRequestAsByteBuffer());
- Map<String, Collection<String>> params = request.getParameters();
-
- assertEquals(6, getSize(params));
- Collection<String> letters = params.get("letters");
- Collection<String> numbers = params.get("numbers");
- Collection<String> country = params.get("country");
-
- assertEquals(3, letters.size());
- assertEquals(2, numbers.size());
- assertEquals(1, country.size());
-
- assertTrue(letters.contains("x"));
- assertTrue(letters.contains("y"));
- assertTrue(letters.contains("z"));
-
- assertTrue(numbers.contains("23"));
- assertTrue(numbers.contains("54"));
-
- assertTrue(country.contains("swe"));
- }
-
- @Test
- public void testSingleGetParameterMultipleValuesIncludingNull() {
- HttpRequestHelper helper = new HttpRequestHelper();
- helper.addGetParameter("letters", "x");
- helper.addGetParameter("letters", "y");
- helper.addGetParameter("letters", null);
- helper.addGetParameter("letters", "z");
-
- HttpRequest request = HttpRequestImpl.of(helper.getRequestAsByteBuffer());
- Map<String, Collection<String>> params = request.getParameters();
-
- assertEquals(3, getSize(params));
- Collection<String> values = params.get("letters");
- assertEquals(3, values.size());
- assertTrue(values.contains("x"));
- assertTrue(values.contains("y"));
- assertTrue(values.contains("z"));
- }
-
- @Test
- public void testEmptyParameters() {
- HttpRequestHelper helper = new HttpRequestHelper();
- HttpRequest request = HttpRequestImpl.of(helper.getRequestAsByteBuffer());
- Map<String, Collection<String>> params = request.getParameters();
- assertNotNull(params);
- assertEquals(0, getSize(params));
- }
-
- @Test(expected = UnsupportedOperationException.class)
- public void testImmutableParameters() {
- HttpRequestHelper helper = new HttpRequestHelper();
- helper.addGetParameter("letter", "x");
-
- HttpRequest request = HttpRequestImpl.of(helper.getRequestAsByteBuffer());
- Map<String, Collection<String>> params = request.getParameters();
- params.put("not", new ArrayList<String>());
- }
-
- @Test
- public void testHostVerification_exists_HTTP_1_0() {
- HttpRequestHelper helper = new HttpRequestHelper();
- helper.setVersion("1.0");
- HttpRequest request = HttpRequestImpl.of(helper.getRequestAsByteBuffer());
- boolean requestOk = HttpUtil.verifyRequest(request);
- assertTrue(requestOk);
- }
-
- @Test
- public void testHostVerification_nonExisting_HTTP_1_0() {
- HttpRequestHelper helper = new HttpRequestHelper();
- helper.setVersion("1.0");
- helper.removeHeader("Host");
- HttpRequest request = HttpRequestImpl.of(helper.getRequestAsByteBuffer());
- boolean requestOk = HttpUtil.verifyRequest(request);
- assertTrue(requestOk);
- }
-
- @Test
- public void testHostVerification_exists_HTTP_1_1() {
- HttpRequestHelper helper = new HttpRequestHelper();
- HttpRequest request = HttpRequestImpl.of(helper.getRequestAsByteBuffer());
- boolean requestOk = HttpUtil.verifyRequest(request);
- assertTrue(requestOk);
- }
-
- @Test
- public void testHostVerification_nonExisting_HTTP_1_1() {
- HttpRequestHelper helper = new HttpRequestHelper();
- helper.removeHeader("Host");
- HttpRequest request = HttpRequestImpl.of(helper.getRequestAsByteBuffer());
- boolean requestOk = HttpUtil.verifyRequest(request);
- assertFalse(requestOk);
- }
-
- @Test
- public void testGarbageRequest() {
- HttpRequestImpl.of(ByteBuffer.wrap(new byte[] { 1, 1, 1, 1 } // garbage
- ));
- }
-
- /**
- * Ensure that header keys are converted to lower case, to facilitate
- * case-insensitive retrieval through
- * {@link HttpRequestImpl#getHeader(String)}.
- */
- @Test
- public void testOfConvertsHeaderKeysToLowerCase() {
-
- HttpRequestHelper helper = new HttpRequestHelper();
- helper.addHeader("TESTKEY", "unimportant");
- HttpRequest request = HttpRequestImpl.of(helper.getRequestAsByteBuffer());
-
- assertFalse(request.getHeaders().containsKey("TESTKEY"));
- assertTrue(request.getHeaders().containsKey("testkey"));
- }
-
- /**
- * Ensure that the case of any header values is correctly maintained.
- */
- @Test
- public void testOfMaintainsHeaderValueCase() {
-
- String expected = "vAlUe";
-
- HttpRequestHelper helper = new HttpRequestHelper();
- helper.addHeader("TESTKEY", expected);
- HttpRequest request = HttpRequestImpl.of(helper.getRequestAsByteBuffer());
-
- String actual = request.getHeader("TESTKEY");
- assertEquals(expected, actual);
- }
-
- /**
- * Ensure that case for any key passed to the method is unimportant for its
- * retrieval.
- */
- @Test
- public void testGetHeader() {
-
- String expected = "value";
-
- HttpRequestHelper helper = new HttpRequestHelper();
- helper.addHeader("TESTKEY", expected);
- HttpRequest request = HttpRequestImpl.of(helper.getRequestAsByteBuffer());
-
- assertEquals(expected, request.getHeader("TESTKEY"));
- assertEquals(expected, request.getHeader("testkey"));
- }
-
- @Test
public void testHttpRequestNoQueryString() {
String requestLine = "GET /foobar HTTP/1.1 ";
- HttpRequest request = new HttpRequestImpl(requestLine, new HashMap<String, String>());
+ HttpRequest request = new HttpRequestImpl(requestLine, new HashMap<String, String> ());
Assert.assertEquals("/foobar", request.getRequestedPath());
}
@@ -373,35 +48,30 @@ public class HttpRequestImplTest {
}
@Test
- public void testNoCookies() {
- HttpRequestHelper hrh = new HttpRequestHelper();
- HttpRequest hr = HttpRequestImpl.of(hrh.getRequestAsByteBuffer());
- Assert.assertEquals(0, hr.getCookies().size());
- }
+ public void doNotExpectContinueWhenBodyNotEmptyWithExpectHeader(){
+ HttpRequestImpl request = new HttpRequestImpl();
+ request.pushToHeaders("content-length", "12");
+ request.pushToHeaders("expect", "niniin");
+ request.getContentLength();
+ request.getBodyBuffer().put("12345".getBytes());
+ Assert.assertFalse("Expect continue should be false when body is submitted", request.expectContinue());
- @Test
- public void testOneCookie() {
- HttpRequestHelper hrh = new HttpRequestHelper();
- hrh.addHeader("Cookie", "one=value");
- HttpRequest hr = HttpRequestImpl.of(hrh.getRequestAsByteBuffer());
- Assert.assertEquals("value", hr.getCookie("one"));
}
@Test
- public void testOneCookieWithoutValue() {
- HttpRequestHelper hrh = new HttpRequestHelper();
- hrh.addHeader("Cookie", "one=");
- HttpRequest hr = HttpRequestImpl.of(hrh.getRequestAsByteBuffer());
- Assert.assertEquals("", hr.getCookie("one"));
+ public void expectContinueWhenBodyNotNullButEmptyWithExpectHeader(){
+ HttpRequestImpl request = new HttpRequestImpl();
+ request.pushToHeaders("content-length", "12");
+ request.pushToHeaders("expect", "niniin");
+ request.getContentLength();
+ Assert.assertTrue("Expect continue should be false when body bot submitted", request.expectContinue());
}
@Test
- public void testMultipleCookies() {
- HttpRequestHelper hrh = new HttpRequestHelper();
- hrh.addHeader("Cookie", "one=value;two=value2");
- HttpRequest hr = HttpRequestImpl.of(hrh.getRequestAsByteBuffer());
- Assert.assertEquals("value", hr.getCookie("one"));
- Assert.assertEquals("value2", hr.getCookie("two"));
+ public void expectContinueWhenBodyNullWithExpectHeader(){
+ HttpRequestImpl request = new HttpRequestImpl();
+ request.pushToHeaders("expect", "niniin");
+ request.getContentLength();
+ Assert.assertTrue("Expect continue should be false when body is submitted", request.expectContinue());
}
-
}