You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2014/10/24 09:15:20 UTC
svn commit: r1634010 - in /httpcomponents/httpcore/trunk:
httpcore-ab/src/main/java/org/apache/http/benchmark/
httpcore/src/main/java/org/apache/http/
httpcore/src/main/java/org/apache/http/impl/
httpcore/src/main/java/org/apache/http/impl/io/ httpcore...
Author: olegk
Date: Fri Oct 24 07:15:19 2014
New Revision: 1634010
URL: http://svn.apache.org/r1634010
Log:
Refactored message element iterator classes
Added:
httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/AbstractHeaderElementIterator.java
- copied, changed from r1634009, httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHeaderElementIterator.java
Removed:
httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HeaderElementIterator.java
httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HeaderIterator.java
httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/TokenIterator.java
Modified:
httpcomponents/httpcore/trunk/httpcore-ab/src/main/java/org/apache/http/benchmark/BenchmarkWorker.java
httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpMessage.java
httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/DefaultConnectionReuseStrategy.java
httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/io/AbstractMessageWriter.java
httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/AbstractHttpMessage.java
httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHeaderElementIterator.java
httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHeaderIterator.java
httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicListHeaderIterator.java
httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicTokenIterator.java
httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/HeaderGroup.java
httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/impl/TestDefaultConnectionReuseStrategy.java
httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicHeaderElementIterator.java
httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicHeaderIterator.java
httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicTokenIterator.java
httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestHeaderGroup.java
Modified: httpcomponents/httpcore/trunk/httpcore-ab/src/main/java/org/apache/http/benchmark/BenchmarkWorker.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-ab/src/main/java/org/apache/http/benchmark/BenchmarkWorker.java?rev=1634010&r1=1634009&r2=1634010&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-ab/src/main/java/org/apache/http/benchmark/BenchmarkWorker.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-ab/src/main/java/org/apache/http/benchmark/BenchmarkWorker.java Fri Oct 24 07:15:19 2014
@@ -31,12 +31,12 @@ import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.charset.Charset;
+import java.util.Iterator;
import javax.net.SocketFactory;
import org.apache.http.ConnectionReuseStrategy;
import org.apache.http.Header;
-import org.apache.http.HeaderIterator;
import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.HttpHost;
@@ -254,8 +254,8 @@ class BenchmarkWorker implements Runnabl
}
private static void resetHeader(final HttpRequest request) {
- for (final HeaderIterator it = request.headerIterator(); it.hasNext();) {
- final Header header = it.nextHeader();
+ for (final Iterator<Header> it = request.headerIterator(); it.hasNext();) {
+ final Header header = it.next();
if (!(header instanceof DefaultHeader)) {
it.remove();
}
Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpMessage.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpMessage.java?rev=1634010&r1=1634009&r2=1634010&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpMessage.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/HttpMessage.java Fri Oct 24 07:15:19 2014
@@ -27,6 +27,8 @@
package org.apache.http;
+import java.util.Iterator;
+
/**
* HTTP messages consist of requests from client to server and responses
* from server to client.
@@ -171,7 +173,7 @@ public interface HttpMessage {
* @return Iterator that returns Header objects in the sequence they are
* sent over a connection.
*/
- HeaderIterator headerIterator();
+ Iterator<Header> headerIterator();
/**
* Returns an iterator of the headers with a given name.
@@ -182,6 +184,6 @@ public interface HttpMessage {
* @return Iterator that returns Header objects with the argument name
* in the sequence they are sent over a connection.
*/
- HeaderIterator headerIterator(String name);
+ Iterator<Header> headerIterator(String name);
}
Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/DefaultConnectionReuseStrategy.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/DefaultConnectionReuseStrategy.java?rev=1634010&r1=1634009&r2=1634010&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/DefaultConnectionReuseStrategy.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/DefaultConnectionReuseStrategy.java Fri Oct 24 07:15:19 2014
@@ -27,15 +27,14 @@
package org.apache.http.impl;
+import java.util.Iterator;
+
import org.apache.http.ConnectionReuseStrategy;
import org.apache.http.Header;
-import org.apache.http.HeaderIterator;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.HttpVersion;
-import org.apache.http.ParseException;
import org.apache.http.ProtocolVersion;
-import org.apache.http.TokenIterator;
import org.apache.http.annotation.Immutable;
import org.apache.http.message.BasicTokenIterator;
import org.apache.http.protocol.HTTP;
@@ -69,6 +68,11 @@ public class DefaultConnectionReuseStrat
super();
}
+ @Override
+ public int hashCode() {
+ return super.hashCode();
+ }
+
// see interface ConnectionReuseStrategy
@Override
public boolean keepAlive(final HttpResponse response,
@@ -107,7 +111,7 @@ public class DefaultConnectionReuseStrat
// Check for the "Connection" header. If that is absent, check for
// the "Proxy-Connection" header. The latter is an unspecified and
// broken but unfortunately common extension of HTTP.
- HeaderIterator hit = response.headerIterator(HTTP.CONN_DIRECTIVE);
+ Iterator<Header> hit = response.headerIterator(HTTP.CONN_DIRECTIVE);
if (!hit.hasNext()) {
hit = response.headerIterator("Proxy-Connection");
}
@@ -136,28 +140,20 @@ public class DefaultConnectionReuseStrat
// If there is no "close" but a "keep-alive", we take the hint.
if (hit.hasNext()) {
- try {
- final TokenIterator ti = createTokenIterator(hit);
- boolean keepalive = false;
- while (ti.hasNext()) {
- final String token = ti.nextToken();
- if (HTTP.CONN_CLOSE.equalsIgnoreCase(token)) {
- return false;
- } else if (HTTP.CONN_KEEP_ALIVE.equalsIgnoreCase(token)) {
- // continue the loop, there may be a "close" afterwards
- keepalive = true;
- }
+ final Iterator<String> ti = new BasicTokenIterator(hit);
+ boolean keepalive = false;
+ while (ti.hasNext()) {
+ final String token = ti.next();
+ if (HTTP.CONN_CLOSE.equalsIgnoreCase(token)) {
+ return false;
+ } else if (HTTP.CONN_KEEP_ALIVE.equalsIgnoreCase(token)) {
+ // continue the loop, there may be a "close" afterwards
+ keepalive = true;
}
- if (keepalive)
- {
- return true;
+ }
+ if (keepalive) {
// neither "close" nor "keep-alive", use default policy
- }
-
- } catch (final ParseException px) {
- // invalid connection header means no persistent connection
- // we don't have logging in HttpCore, so the exception is lost
- return false;
+ return true;
}
}
@@ -165,20 +161,6 @@ public class DefaultConnectionReuseStrat
return !ver.lessEquals(HttpVersion.HTTP_1_0);
}
-
- /**
- * Creates a token iterator from a header iterator.
- * This method can be overridden to replace the implementation of
- * the token iterator.
- *
- * @param hit the header iterator
- *
- * @return the token iterator
- */
- protected TokenIterator createTokenIterator(final HeaderIterator hit) {
- return new BasicTokenIterator(hit);
- }
-
private boolean canResponseHaveBody(final HttpResponse response) {
final int status = response.getStatusLine().getStatusCode();
return status >= HttpStatus.SC_OK
Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/io/AbstractMessageWriter.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/io/AbstractMessageWriter.java?rev=1634010&r1=1634009&r2=1634010&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/io/AbstractMessageWriter.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/io/AbstractMessageWriter.java Fri Oct 24 07:15:19 2014
@@ -28,9 +28,9 @@
package org.apache.http.impl.io;
import java.io.IOException;
+import java.util.Iterator;
import org.apache.http.Header;
-import org.apache.http.HeaderIterator;
import org.apache.http.HttpException;
import org.apache.http.HttpMessage;
import org.apache.http.annotation.NotThreadSafe;
@@ -85,8 +85,8 @@ public abstract class AbstractMessageWri
public void write(final T message) throws IOException, HttpException {
Args.notNull(message, "HTTP message");
writeHeadLine(message);
- for (final HeaderIterator it = message.headerIterator(); it.hasNext(); ) {
- final Header header = it.nextHeader();
+ for (final Iterator<Header> it = message.headerIterator(); it.hasNext(); ) {
+ final Header header = it.next();
this.sessionBuffer.writeLine
(lineFormatter.formatHeader(this.lineBuf, header));
}
Copied: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/AbstractHeaderElementIterator.java (from r1634009, httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHeaderElementIterator.java)
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/AbstractHeaderElementIterator.java?p2=httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/AbstractHeaderElementIterator.java&p1=httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHeaderElementIterator.java&r1=1634009&r2=1634010&rev=1634010&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHeaderElementIterator.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/AbstractHeaderElementIterator.java Fri Oct 24 07:15:19 2014
@@ -27,53 +27,41 @@
package org.apache.http.message;
+import java.util.Iterator;
import java.util.NoSuchElementException;
import org.apache.http.FormattedHeader;
import org.apache.http.Header;
-import org.apache.http.HeaderElement;
-import org.apache.http.HeaderElementIterator;
-import org.apache.http.HeaderIterator;
import org.apache.http.annotation.NotThreadSafe;
import org.apache.http.util.Args;
import org.apache.http.util.CharArrayBuffer;
/**
- * Basic implementation of a {@link HeaderElementIterator}.
+ * {@link java.util.Iterator} of {@link org.apache.http.HeaderElement}s.
*
- * @since 4.0
+ * @since 5.0
*/
@NotThreadSafe
-public class BasicHeaderElementIterator implements HeaderElementIterator {
+abstract class AbstractHeaderElementIterator<T> implements Iterator<T> {
- private final HeaderIterator headerIt;
- private final HeaderValueParser parser;
+ private final Iterator<Header> headerIt;
- private HeaderElement currentElement = null;
+ private T currentElement = null;
private CharArrayBuffer buffer = null;
private ParserCursor cursor = null;
/**
* Creates a new instance of BasicHeaderElementIterator
*/
- public BasicHeaderElementIterator(
- final HeaderIterator headerIterator,
- final HeaderValueParser parser) {
+ AbstractHeaderElementIterator(final Iterator<Header> headerIterator) {
this.headerIt = Args.notNull(headerIterator, "Header iterator");
- this.parser = Args.notNull(parser, "Parser");
}
-
- public BasicHeaderElementIterator(final HeaderIterator headerIterator) {
- this(headerIterator, BasicHeaderValueParser.INSTANCE);
- }
-
-
private void bufferHeaderValue() {
this.cursor = null;
this.buffer = null;
while (this.headerIt.hasNext()) {
- final Header h = this.headerIt.nextHeader();
+ final Header h = this.headerIt.next();
if (h instanceof FormattedHeader) {
this.buffer = ((FormattedHeader) h).getBuffer();
this.cursor = new ParserCursor(0, this.buffer.length());
@@ -91,6 +79,8 @@ public class BasicHeaderElementIterator
}
}
+ abstract T parseHeaderElement(CharArrayBuffer buf, ParserCursor cursor);
+
private void parseNextElement() {
// loop while there are headers left to parse
while (this.headerIt.hasNext() || this.cursor != null) {
@@ -102,8 +92,8 @@ public class BasicHeaderElementIterator
if (this.cursor != null) {
// loop while there is data in the buffer
while (!this.cursor.atEnd()) {
- final HeaderElement e = this.parser.parseHeaderElement(this.buffer, this.cursor);
- if (!(e.getName().length() == 0 && e.getValue() == null)) {
+ final T e = parseHeaderElement(this.buffer, this.cursor);
+ if (e != null) {
// Found something
this.currentElement = e;
return;
@@ -128,7 +118,7 @@ public class BasicHeaderElementIterator
}
@Override
- public HeaderElement nextElement() throws NoSuchElementException {
+ public T next() throws NoSuchElementException {
if (this.currentElement == null) {
parseNextElement();
}
@@ -137,17 +127,12 @@ public class BasicHeaderElementIterator
throw new NoSuchElementException("No more header elements available");
}
- final HeaderElement element = this.currentElement;
+ final T element = this.currentElement;
this.currentElement = null;
return element;
}
@Override
- public final Object next() throws NoSuchElementException {
- return nextElement();
- }
-
- @Override
public void remove() throws UnsupportedOperationException {
throw new UnsupportedOperationException("Remove not supported");
}
Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/AbstractHttpMessage.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/AbstractHttpMessage.java?rev=1634010&r1=1634009&r2=1634010&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/AbstractHttpMessage.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/AbstractHttpMessage.java Fri Oct 24 07:15:19 2014
@@ -27,8 +27,9 @@
package org.apache.http.message;
+import java.util.Iterator;
+
import org.apache.http.Header;
-import org.apache.http.HeaderIterator;
import org.apache.http.HttpMessage;
import org.apache.http.annotation.NotThreadSafe;
import org.apache.http.util.Args;
@@ -121,8 +122,8 @@ public abstract class AbstractHttpMessag
if (name == null) {
return;
}
- for (final HeaderIterator i = this.headergroup.iterator(); i.hasNext(); ) {
- final Header header = i.nextHeader();
+ for (final Iterator<Header> i = this.headergroup.iterator(); i.hasNext(); ) {
+ final Header header = i.next();
if (name.equalsIgnoreCase(header.getName())) {
i.remove();
}
@@ -131,13 +132,13 @@ public abstract class AbstractHttpMessag
// non-javadoc, see interface HttpMessage
@Override
- public HeaderIterator headerIterator() {
+ public Iterator<Header> headerIterator() {
return this.headergroup.iterator();
}
// non-javadoc, see interface HttpMessage
@Override
- public HeaderIterator headerIterator(final String name) {
+ public Iterator<Header> headerIterator(final String name) {
return this.headergroup.iterator(name);
}
Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHeaderElementIterator.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHeaderElementIterator.java?rev=1634010&r1=1634009&r2=1634010&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHeaderElementIterator.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHeaderElementIterator.java Fri Oct 24 07:15:19 2014
@@ -27,129 +27,46 @@
package org.apache.http.message;
-import java.util.NoSuchElementException;
+import java.util.Iterator;
-import org.apache.http.FormattedHeader;
import org.apache.http.Header;
import org.apache.http.HeaderElement;
-import org.apache.http.HeaderElementIterator;
-import org.apache.http.HeaderIterator;
import org.apache.http.annotation.NotThreadSafe;
import org.apache.http.util.Args;
import org.apache.http.util.CharArrayBuffer;
/**
- * Basic implementation of a {@link HeaderElementIterator}.
+ * {@link java.util.Iterator} of {@link org.apache.http.HeaderElement}s.
*
* @since 4.0
*/
@NotThreadSafe
-public class BasicHeaderElementIterator implements HeaderElementIterator {
+public class BasicHeaderElementIterator extends AbstractHeaderElementIterator<HeaderElement> {
- private final HeaderIterator headerIt;
private final HeaderValueParser parser;
- private HeaderElement currentElement = null;
- private CharArrayBuffer buffer = null;
- private ParserCursor cursor = null;
-
/**
* Creates a new instance of BasicHeaderElementIterator
*/
public BasicHeaderElementIterator(
- final HeaderIterator headerIterator,
+ final Iterator<Header> headerIterator,
final HeaderValueParser parser) {
- this.headerIt = Args.notNull(headerIterator, "Header iterator");
+ super(headerIterator);
this.parser = Args.notNull(parser, "Parser");
}
-
- public BasicHeaderElementIterator(final HeaderIterator headerIterator) {
+ public BasicHeaderElementIterator(final Iterator<Header> headerIterator) {
this(headerIterator, BasicHeaderValueParser.INSTANCE);
}
-
- private void bufferHeaderValue() {
- this.cursor = null;
- this.buffer = null;
- while (this.headerIt.hasNext()) {
- final Header h = this.headerIt.nextHeader();
- if (h instanceof FormattedHeader) {
- this.buffer = ((FormattedHeader) h).getBuffer();
- this.cursor = new ParserCursor(0, this.buffer.length());
- this.cursor.updatePos(((FormattedHeader) h).getValuePos());
- break;
- } else {
- final String value = h.getValue();
- if (value != null) {
- this.buffer = new CharArrayBuffer(value.length());
- this.buffer.append(value);
- this.cursor = new ParserCursor(0, this.buffer.length());
- break;
- }
- }
- }
- }
-
- private void parseNextElement() {
- // loop while there are headers left to parse
- while (this.headerIt.hasNext() || this.cursor != null) {
- if (this.cursor == null || this.cursor.atEnd()) {
- // get next header value
- bufferHeaderValue();
- }
- // Anything buffered?
- if (this.cursor != null) {
- // loop while there is data in the buffer
- while (!this.cursor.atEnd()) {
- final HeaderElement e = this.parser.parseHeaderElement(this.buffer, this.cursor);
- if (!(e.getName().length() == 0 && e.getValue() == null)) {
- // Found something
- this.currentElement = e;
- return;
- }
- }
- // if at the end of the buffer
- if (this.cursor.atEnd()) {
- // discard it
- this.cursor = null;
- this.buffer = null;
- }
- }
- }
- }
-
- @Override
- public boolean hasNext() {
- if (this.currentElement == null) {
- parseNextElement();
- }
- return this.currentElement != null;
- }
-
@Override
- public HeaderElement nextElement() throws NoSuchElementException {
- if (this.currentElement == null) {
- parseNextElement();
- }
-
- if (this.currentElement == null) {
- throw new NoSuchElementException("No more header elements available");
+ HeaderElement parseHeaderElement(final CharArrayBuffer buf, final ParserCursor cursor) {
+ final HeaderElement e = this.parser.parseHeaderElement(buf, cursor);
+ if (!(e.getName().length() == 0 && e.getValue() == null)) {
+ return e;
+ } else {
+ return null;
}
-
- final HeaderElement element = this.currentElement;
- this.currentElement = null;
- return element;
- }
-
- @Override
- public final Object next() throws NoSuchElementException {
- return nextElement();
- }
-
- @Override
- public void remove() throws UnsupportedOperationException {
- throw new UnsupportedOperationException("Remove not supported");
}
}
Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHeaderIterator.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHeaderIterator.java?rev=1634010&r1=1634009&r2=1634010&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHeaderIterator.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHeaderIterator.java Fri Oct 24 07:15:19 2014
@@ -27,20 +27,20 @@
package org.apache.http.message;
+import java.util.Iterator;
import java.util.NoSuchElementException;
import org.apache.http.Header;
-import org.apache.http.HeaderIterator;
import org.apache.http.annotation.NotThreadSafe;
import org.apache.http.util.Args;
/**
- * Basic implementation of a {@link HeaderIterator}.
+ * {@link java.util.Iterator} of {@link org.apache.http.Header}s.
*
* @since 4.0
*/
@NotThreadSafe
-public class BasicHeaderIterator implements HeaderIterator {
+public class BasicHeaderIterator implements Iterator<Header> {
/**
* An array of headers to iterate over.
@@ -48,23 +48,19 @@ public class BasicHeaderIterator impleme
* This array will never be modified by the iterator.
* Derived implementations are expected to adhere to this restriction.
*/
- protected final Header[] allHeaders;
-
+ private final Header[] allHeaders;
/**
* The position of the next header in {@link #allHeaders allHeaders}.
* Negative if the iteration is over.
*/
- protected int currentIndex;
-
+ private int currentIndex;
/**
* The header name to filter by.
* {@code null} to iterate over all headers in the array.
*/
- protected String headerName;
-
-
+ private String headerName;
/**
* Creates a new header iterator.
@@ -80,7 +76,6 @@ public class BasicHeaderIterator impleme
this.currentIndex = findNext(-1);
}
-
/**
* Determines the index of the next header.
*
@@ -90,7 +85,7 @@ public class BasicHeaderIterator impleme
* @return the index of the next header that matches the filter name,
* or negative if there are no more headers
*/
- protected int findNext(final int pos) {
+ private int findNext(final int pos) {
int from = pos;
if (from < -1) {
return -1;
@@ -105,7 +100,6 @@ public class BasicHeaderIterator impleme
return found ? from : -1;
}
-
/**
* Checks whether a header is part of the iteration.
*
@@ -114,19 +108,16 @@ public class BasicHeaderIterator impleme
* @return {@code true} if the header should be part of the
* iteration, {@code false} to skip
*/
- protected boolean filterHeader(final int index) {
+ private boolean filterHeader(final int index) {
return (this.headerName == null) ||
this.headerName.equalsIgnoreCase(this.allHeaders[index].getName());
}
-
- // non-javadoc, see interface HeaderIterator
@Override
public boolean hasNext() {
return (this.currentIndex >= 0);
}
-
/**
* Obtains the next header from this iteration.
*
@@ -135,8 +126,7 @@ public class BasicHeaderIterator impleme
* @throws NoSuchElementException if there are no more headers
*/
@Override
- public Header nextHeader()
- throws NoSuchElementException {
+ public Header next() throws NoSuchElementException {
final int current = this.currentIndex;
if (current < 0) {
@@ -148,32 +138,14 @@ public class BasicHeaderIterator impleme
return this.allHeaders[current];
}
-
- /**
- * Returns the next header.
- * Same as {@link #nextHeader nextHeader}, but not type-safe.
- *
- * @return the next header in this iteration
- *
- * @throws NoSuchElementException if there are no more headers
- */
- @Override
- public final Object next()
- throws NoSuchElementException {
- return nextHeader();
- }
-
-
/**
* Removing headers is not supported.
*
* @throws UnsupportedOperationException always
*/
@Override
- public void remove()
- throws UnsupportedOperationException {
-
- throw new UnsupportedOperationException
- ("Removing headers is not supported.");
+ public void remove() throws UnsupportedOperationException {
+ throw new UnsupportedOperationException("Removing headers is not supported.");
}
+
}
Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicListHeaderIterator.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicListHeaderIterator.java?rev=1634010&r1=1634009&r2=1634010&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicListHeaderIterator.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicListHeaderIterator.java Fri Oct 24 07:15:19 2014
@@ -27,52 +27,46 @@
package org.apache.http.message;
+import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import org.apache.http.Header;
-import org.apache.http.HeaderIterator;
import org.apache.http.annotation.NotThreadSafe;
import org.apache.http.util.Args;
import org.apache.http.util.Asserts;
/**
- * Implementation of a {@link HeaderIterator} based on a {@link List}.
- * For use by {@link HeaderGroup}.
+ * {@link java.util.Iterator} of {@link org.apache.http.Header}s. For use by {@link HeaderGroup}.
*
* @since 4.0
*/
@NotThreadSafe
-public class BasicListHeaderIterator implements HeaderIterator {
+class BasicListHeaderIterator implements Iterator<Header> {
/**
* A list of headers to iterate over.
* Not all elements of this array are necessarily part of the iteration.
*/
- protected final List<Header> allHeaders;
-
+ private final List<Header> allHeaders;
/**
* The position of the next header in {@link #allHeaders allHeaders}.
* Negative if the iteration is over.
*/
- protected int currentIndex;
-
+ private int currentIndex;
/**
* The position of the last returned header.
* Negative if none has been returned so far.
*/
- protected int lastIndex;
-
+ private int lastIndex;
/**
* The header name to filter by.
* {@code null} to iterate over all headers in the array.
*/
- protected String headerName;
-
-
+ private String headerName;
/**
* Creates a new header iterator.
@@ -89,7 +83,6 @@ public class BasicListHeaderIterator imp
this.lastIndex = -1;
}
-
/**
* Determines the index of the next header.
*
@@ -114,7 +107,6 @@ public class BasicListHeaderIterator imp
return found ? from : -1;
}
-
/**
* Checks whether a header is part of the iteration.
*
@@ -123,7 +115,7 @@ public class BasicListHeaderIterator imp
* @return {@code true} if the header should be part of the
* iteration, {@code false} to skip
*/
- protected boolean filterHeader(final int index) {
+ private boolean filterHeader(final int index) {
if (this.headerName == null) {
return true;
}
@@ -134,14 +126,11 @@ public class BasicListHeaderIterator imp
return this.headerName.equalsIgnoreCase(name);
}
-
- // non-javadoc, see interface HeaderIterator
@Override
public boolean hasNext() {
return (this.currentIndex >= 0);
}
-
/**
* Obtains the next header from this iteration.
*
@@ -150,9 +139,7 @@ public class BasicListHeaderIterator imp
* @throws NoSuchElementException if there are no more headers
*/
@Override
- public Header nextHeader()
- throws NoSuchElementException {
-
+ public Header next() throws NoSuchElementException {
final int current = this.currentIndex;
if (current < 0) {
throw new NoSuchElementException("Iteration already finished.");
@@ -164,31 +151,15 @@ public class BasicListHeaderIterator imp
return this.allHeaders.get(current);
}
-
- /**
- * Returns the next header.
- * Same as {@link #nextHeader nextHeader}, but not type-safe.
- *
- * @return the next header in this iteration
- *
- * @throws NoSuchElementException if there are no more headers
- */
- @Override
- public final Object next()
- throws NoSuchElementException {
- return nextHeader();
- }
-
-
/**
* Removes the header that was returned last.
*/
@Override
- public void remove()
- throws UnsupportedOperationException {
+ public void remove() throws UnsupportedOperationException {
Asserts.check(this.lastIndex >= 0, "No header to remove");
this.allHeaders.remove(this.lastIndex);
this.lastIndex = -1;
this.currentIndex--; // adjust for the removed element
}
+
}
Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicTokenIterator.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicTokenIterator.java?rev=1634010&r1=1634009&r2=1634010&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicTokenIterator.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicTokenIterator.java Fri Oct 24 07:15:19 2014
@@ -27,393 +27,47 @@
package org.apache.http.message;
-import java.util.NoSuchElementException;
+import java.util.BitSet;
+import java.util.Iterator;
-import org.apache.http.HeaderIterator;
-import org.apache.http.ParseException;
-import org.apache.http.TokenIterator;
+import org.apache.http.Header;
import org.apache.http.annotation.NotThreadSafe;
-import org.apache.http.util.Args;
+import org.apache.http.util.CharArrayBuffer;
+import org.apache.http.util.TextUtils;
/**
- * Basic implementation of a {@link TokenIterator}.
- * This implementation parses {@code #token} sequences as
- * defined by RFC 2616, section 2.
- * It extends that definition somewhat beyond US-ASCII.
+ * {@link java.util.Iterator} of {@link org.apache.http.Header} tokens..
*
* @since 4.0
*/
@NotThreadSafe
-public class BasicTokenIterator implements TokenIterator {
+public class BasicTokenIterator extends AbstractHeaderElementIterator<String> {
- /** The HTTP separator characters. Defined in RFC 2616, section 2.2. */
- // the order of the characters here is adjusted to put the
- // most likely candidates at the beginning of the collection
- public final static String HTTP_SEPARATORS = " ,;=()<>@:\\\"/[]?{}\t";
-
-
- /** The iterator from which to obtain the next header. */
- protected final HeaderIterator headerIt;
-
- /**
- * The value of the current header.
- * This is the header value that includes {@link #currentToken}.
- * Undefined if the iteration is over.
- */
- protected String currentHeader;
-
- /**
- * The token to be returned by the next call to {@link #nextToken()}.
- * {@code null} if the iteration is over.
- */
- protected String currentToken;
-
- /**
- * The position after {@link #currentToken} in {@link #currentHeader}.
- * Undefined if the iteration is over.
- */
- protected int searchPos;
+ private static final BitSet COMMA = TokenParser.INIT_BITSET(',');
+ private final TokenParser parser;
/**
* Creates a new instance of {@link BasicTokenIterator}.
*
* @param headerIterator the iterator for the headers to tokenize
*/
- public BasicTokenIterator(final HeaderIterator headerIterator) {
- super();
- this.headerIt = Args.notNull(headerIterator, "Header iterator");
- this.searchPos = findNext(-1);
- }
-
-
- // non-javadoc, see interface TokenIterator
- @Override
- public boolean hasNext() {
- return (this.currentToken != null);
- }
-
-
- /**
- * Obtains the next token from this iteration.
- *
- * @return the next token in this iteration
- *
- * @throws NoSuchElementException if the iteration is already over
- * @throws ParseException if an invalid header value is encountered
- */
- @Override
- public String nextToken()
- throws NoSuchElementException, ParseException {
-
- if (this.currentToken == null) {
- throw new NoSuchElementException("Iteration already finished.");
- }
-
- final String result = this.currentToken;
- // updates currentToken, may trigger ParseException:
- this.searchPos = findNext(this.searchPos);
-
- return result;
- }
-
-
- /**
- * Returns the next token.
- * Same as {@link #nextToken}, but with generic return type.
- *
- * @return the next token in this iteration
- *
- * @throws NoSuchElementException if there are no more tokens
- * @throws ParseException if an invalid header value is encountered
- */
- @Override
- public final Object next()
- throws NoSuchElementException, ParseException {
- return nextToken();
+ public BasicTokenIterator(final Iterator<Header> headerIterator) {
+ super(headerIterator);
+ this.parser = TokenParser.INSTANCE;
}
-
- /**
- * Removing tokens is not supported.
- *
- * @throws UnsupportedOperationException always
- */
@Override
- public final void remove()
- throws UnsupportedOperationException {
-
- throw new UnsupportedOperationException
- ("Removing tokens is not supported.");
- }
-
-
- /**
- * Determines the next token.
- * If found, the token is stored in {@link #currentToken}.
- * The return value indicates the position after the token
- * in {@link #currentHeader}. If necessary, the next header
- * will be obtained from {@link #headerIt}.
- * If not found, {@link #currentToken} is set to {@code null}.
- *
- * @param pos the position in the current header at which to
- * start the search, -1 to search in the first header
- *
- * @return the position after the found token in the current header, or
- * negative if there was no next token
- *
- * @throws ParseException if an invalid header value is encountered
- */
- protected int findNext(final int pos) throws ParseException {
- int from = pos;
- if (from < 0) {
- // called from the constructor, initialize the first header
- if (!this.headerIt.hasNext()) {
- return -1;
+ String parseHeaderElement(final CharArrayBuffer buf, final ParserCursor cursor) {
+ final String token = this.parser.parseToken(buf, cursor, COMMA);
+ if (!cursor.atEnd()) {
+ final int pos = cursor.getPos();
+ if (buf.charAt(pos) == ',') {
+ cursor.updatePos(pos + 1);
}
- this.currentHeader = this.headerIt.nextHeader().getValue();
- from = 0;
- } else {
- // called after a token, make sure there is a separator
- from = findTokenSeparator(from);
}
-
- final int start = findTokenStart(from);
- if (start < 0) {
- this.currentToken = null;
- return -1; // nothing found
- }
-
- final int end = findTokenEnd(start);
- this.currentToken = createToken(this.currentHeader, start, end);
- return end;
- }
-
-
- /**
- * Creates a new token to be returned.
- * Called from {@link #findNext findNext} after the token is identified.
- * The default implementation simply calls
- * {@link java.lang.String#substring String.substring}.
- * <p>
- * If header values are significantly longer than tokens, and some
- * tokens are permanently referenced by the application, there can
- * be problems with garbage collection. A substring will hold a
- * reference to the full characters of the original string and
- * therefore occupies more memory than might be expected.
- * To avoid this, override this method and create a new string
- * instead of a substring.
- * </p>
- *
- * @param value the full header value from which to create a token
- * @param start the index of the first token character
- * @param end the index after the last token character
- *
- * @return a string representing the token identified by the arguments
- */
- protected String createToken(final String value, final int start, final int end) {
- return value.substring(start, end);
+ return !TextUtils.isBlank(token) ? token : null;
}
-
- /**
- * Determines the starting position of the next token.
- * This method will iterate over headers if necessary.
- *
- * @param pos the position in the current header at which to
- * start the search
- *
- * @return the position of the token start in the current header,
- * negative if no token start could be found
- */
- protected int findTokenStart(final int pos) {
- int from = Args.notNegative(pos, "Search position");
- boolean found = false;
- while (!found && (this.currentHeader != null)) {
-
- final int to = this.currentHeader.length();
- while (!found && (from < to)) {
-
- final char ch = this.currentHeader.charAt(from);
- if (isTokenSeparator(ch) || isWhitespace(ch)) {
- // whitspace and token separators are skipped
- from++;
- } else if (isTokenChar(this.currentHeader.charAt(from))) {
- // found the start of a token
- found = true;
- } else {
- throw new ParseException
- ("Invalid character before token (pos " + from +
- "): " + this.currentHeader);
- }
- }
- if (!found) {
- if (this.headerIt.hasNext()) {
- this.currentHeader = this.headerIt.nextHeader().getValue();
- from = 0;
- } else {
- this.currentHeader = null;
- }
- }
- } // while headers
-
- return found ? from : -1;
- }
-
-
- /**
- * Determines the position of the next token separator.
- * Because of multi-header joining rules, the end of a
- * header value is a token separator. This method does
- * therefore not need to iterate over headers.
- *
- * @param pos the position in the current header at which to
- * start the search
- *
- * @return the position of a token separator in the current header,
- * or at the end
- *
- * @throws ParseException
- * if a new token is found before a token separator.
- * RFC 2616, section 2.1 explicitly requires a comma between
- * tokens for {@code #}.
- */
- protected int findTokenSeparator(final int pos) {
- int from = Args.notNegative(pos, "Search position");
- boolean found = false;
- final int to = this.currentHeader.length();
- while (!found && (from < to)) {
- final char ch = this.currentHeader.charAt(from);
- if (isTokenSeparator(ch)) {
- found = true;
- } else if (isWhitespace(ch)) {
- from++;
- } else if (isTokenChar(ch)) {
- throw new ParseException
- ("Tokens without separator (pos " + from +
- "): " + this.currentHeader);
- } else {
- throw new ParseException
- ("Invalid character after token (pos " + from +
- "): " + this.currentHeader);
- }
- }
-
- return from;
- }
-
-
- /**
- * Determines the ending position of the current token.
- * This method will not leave the current header value,
- * since the end of the header value is a token boundary.
- *
- * @param from the position of the first character of the token
- *
- * @return the position after the last character of the token.
- * The behavior is undefined if {@code from} does not
- * point to a token character in the current header value.
- */
- protected int findTokenEnd(final int from) {
- Args.notNegative(from, "Search position");
- final int to = this.currentHeader.length();
- int end = from+1;
- while ((end < to) && isTokenChar(this.currentHeader.charAt(end))) {
- end++;
- }
-
- return end;
- }
-
-
- /**
- * Checks whether a character is a token separator.
- * RFC 2616, section 2.1 defines comma as the separator for
- * {@code #token} sequences. The end of a header value will
- * also separate tokens, but that is not a character check.
- *
- * @param ch the character to check
- *
- * @return {@code true} if the character is a token separator,
- * {@code false} otherwise
- */
- protected boolean isTokenSeparator(final char ch) {
- return (ch == ',');
- }
-
-
- /**
- * Checks whether a character is a whitespace character.
- * RFC 2616, section 2.2 defines space and horizontal tab as whitespace.
- * The optional preceeding line break is irrelevant, since header
- * continuation is handled transparently when parsing messages.
- *
- * @param ch the character to check
- *
- * @return {@code true} if the character is whitespace,
- * {@code false} otherwise
- */
- protected boolean isWhitespace(final char ch) {
-
- // we do not use Character.isWhitspace(ch) here, since that allows
- // many control characters which are not whitespace as per RFC 2616
- return ((ch == '\t') || Character.isSpaceChar(ch));
- }
-
-
- /**
- * Checks whether a character is a valid token character.
- * Whitespace, control characters, and HTTP separators are not
- * valid token characters. The HTTP specification (RFC 2616, section 2.2)
- * defines tokens only for the US-ASCII character set, this
- * method extends the definition to other character sets.
- *
- * @param ch the character to check
- *
- * @return {@code true} if the character is a valid token start,
- * {@code false} otherwise
- */
- protected boolean isTokenChar(final char ch) {
-
- // common sense extension of ALPHA + DIGIT
- if (Character.isLetterOrDigit(ch)) {
- return true;
- }
-
- // common sense extension of CTL
- if (Character.isISOControl(ch)) {
- return false;
- }
-
- // no common sense extension for this
- if (isHttpSeparator(ch)) {
- return false;
- }
-
- // RFC 2616, section 2.2 defines a token character as
- // "any CHAR except CTLs or separators". The controls
- // and separators are included in the checks above.
- // This will yield unexpected results for Unicode format characters.
- // If that is a problem, overwrite isHttpSeparator(char) to filter
- // out the false positives.
- return true;
- }
-
-
- /**
- * Checks whether a character is an HTTP separator.
- * The implementation in this class checks only for the HTTP separators
- * defined in RFC 2616, section 2.2. If you need to detect other
- * separators beyond the US-ASCII character set, override this method.
- *
- * @param ch the character to check
- *
- * @return {@code true} if the character is an HTTP separator
- */
- protected boolean isHttpSeparator(final char ch) {
- return (HTTP_SEPARATORS.indexOf(ch) >= 0);
- }
-
-
-} // class BasicTokenIterator
+}
Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/HeaderGroup.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/HeaderGroup.java?rev=1634010&r1=1634009&r2=1634010&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/HeaderGroup.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/HeaderGroup.java Fri Oct 24 07:15:19 2014
@@ -30,11 +30,11 @@ package org.apache.http.message;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import org.apache.http.Header;
-import org.apache.http.HeaderIterator;
import org.apache.http.annotation.NotThreadSafe;
import org.apache.http.util.CharArrayBuffer;
@@ -267,7 +267,7 @@ public class HeaderGroup implements Clon
*
* @since 4.0
*/
- public HeaderIterator iterator() {
+ public Iterator<Header> iterator() {
return new BasicListHeaderIterator(this.headers, null);
}
@@ -281,7 +281,7 @@ public class HeaderGroup implements Clon
*
* @since 4.0
*/
- public HeaderIterator iterator(final String name) {
+ public Iterator<Header> iterator(final String name) {
return new BasicListHeaderIterator(this.headers, name);
}
Modified: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/impl/TestDefaultConnectionReuseStrategy.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/impl/TestDefaultConnectionReuseStrategy.java?rev=1634010&r1=1634009&r2=1634010&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/impl/TestDefaultConnectionReuseStrategy.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/impl/TestDefaultConnectionReuseStrategy.java Fri Oct 24 07:15:19 2014
@@ -211,15 +211,6 @@ public class TestDefaultConnectionReuseS
}
@Test
- public void testConnectionTokensInvalid() throws Exception {
- // Use HTTP 1.1
- final HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK");
- response.addHeader("Transfer-Encoding", "chunked");
- response.addHeader("Connection", "keep-alive=true");
- Assert.assertFalse(reuseStrategy.keepAlive(response, context));
- }
-
- @Test
public void testMultipleContentLength() throws Exception {
// Use HTTP 1.1
final HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK");
Modified: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicHeaderElementIterator.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicHeaderElementIterator.java?rev=1634010&r1=1634009&r2=1634010&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicHeaderElementIterator.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicHeaderElementIterator.java Fri Oct 24 07:15:19 2014
@@ -26,11 +26,11 @@
*/
package org.apache.http.message;
+import java.util.Iterator;
import java.util.NoSuchElementException;
import org.apache.http.Header;
import org.apache.http.HeaderElement;
-import org.apache.http.HeaderElementIterator;
import org.junit.Assert;
import org.junit.Test;
@@ -47,17 +47,16 @@ public class TestBasicHeaderElementItera
new BasicHeader("Name", "value1")
};
- final HeaderElementIterator hei =
- new BasicHeaderElementIterator(
- new BasicHeaderIterator(headers, "Name"));
+ final Iterator<HeaderElement> hei = new BasicHeaderElementIterator(
+ new BasicHeaderIterator(headers, "Name"));
Assert.assertTrue(hei.hasNext());
- HeaderElement elem = hei.nextElement();
+ HeaderElement elem = hei.next();
Assert.assertEquals("The two header values must be equal",
"value0", elem.getName());
Assert.assertTrue(hei.hasNext());
- elem = hei.nextElement();
+ elem = hei.next();
Assert.assertEquals("The two header values must be equal",
"value1", elem.getName());
@@ -85,22 +84,22 @@ public class TestBasicHeaderElementItera
new BasicHeader("nAme", "cookie1=1,cookie2=2")
};
- final HeaderElementIterator hei =
- new BasicHeaderElementIterator(new BasicHeaderIterator(headers, "Name"));
+ final Iterator<HeaderElement> hei = new BasicHeaderElementIterator(
+ new BasicHeaderIterator(headers, "Name"));
- HeaderElement elem = hei.nextElement();
+ HeaderElement elem = hei.next();
Assert.assertEquals("The two header values must be equal",
"value0", elem.getName());
- elem = hei.nextElement();
+ elem = hei.next();
Assert.assertEquals("The two header values must be equal",
"value1", elem.getName());
- elem = hei.nextElement();
+ elem = hei.next();
Assert.assertEquals("The two header values must be equal",
"cookie1", elem.getName());
Assert.assertEquals("The two header values must be equal",
"1", elem.getValue());
- elem = hei.nextElement();
+ elem = hei.next();
Assert.assertEquals("The two header values must be equal",
"cookie2", elem.getName());
Assert.assertEquals("The two header values must be equal",
@@ -115,9 +114,8 @@ public class TestBasicHeaderElementItera
new BasicHeader("Name", ",,,")
};
- final HeaderElementIterator hei =
- new BasicHeaderElementIterator(
- new BasicHeaderIterator(headers, "Name"));
+ final Iterator<HeaderElement> hei = new BasicHeaderElementIterator(
+ new BasicHeaderIterator(headers, "Name"));
Assert.assertFalse(hei.hasNext());
try {
Modified: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicHeaderIterator.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicHeaderIterator.java?rev=1634010&r1=1634009&r2=1634010&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicHeaderIterator.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicHeaderIterator.java Fri Oct 24 07:15:19 2014
@@ -26,16 +26,16 @@
*/
package org.apache.http.message;
+import java.util.Iterator;
import java.util.NoSuchElementException;
import org.apache.http.Header;
-import org.apache.http.HeaderIterator;
import org.junit.Assert;
import org.junit.Test;
/**
- * Tests for {@link BasicHeaderIterator}.
+ * Tests for {@link java.util.Iterator} of {@link org.apache.http.Header}s.
*
*/
public class TestBasicHeaderIterator {
@@ -50,27 +50,27 @@ public class TestBasicHeaderIterator {
};
// without filter
- HeaderIterator hit = new BasicHeaderIterator(headers, null);
+ Iterator<Header> hit = new BasicHeaderIterator(headers, null);
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("0", headers[0], hit.nextHeader());
+ Assert.assertEquals("0", headers[0], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("1", headers[1], hit.nextHeader());
+ Assert.assertEquals("1", headers[1], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("2", headers[2], hit.nextHeader());
+ Assert.assertEquals("2", headers[2], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("3", headers[3], hit.nextHeader());
+ Assert.assertEquals("3", headers[3], hit.next());
Assert.assertFalse(hit.hasNext());
// with filter
hit = new BasicHeaderIterator(headers, "name");
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("0", headers[0], hit.nextHeader());
+ Assert.assertEquals("0", headers[0], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("1", headers[1], hit.nextHeader());
+ Assert.assertEquals("1", headers[1], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("2", headers[2], hit.nextHeader());
+ Assert.assertEquals("2", headers[2], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("3", headers[3], hit.nextHeader());
+ Assert.assertEquals("3", headers[3], hit.next());
Assert.assertFalse(hit.hasNext());
}
@@ -85,29 +85,29 @@ public class TestBasicHeaderIterator {
};
// without filter
- HeaderIterator hit = new BasicHeaderIterator(headers, null);
+ Iterator<Header> hit = new BasicHeaderIterator(headers, null);
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("0", headers[0], hit.nextHeader());
+ Assert.assertEquals("0", headers[0], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("1", headers[1], hit.nextHeader());
+ Assert.assertEquals("1", headers[1], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("2", headers[2], hit.nextHeader());
+ Assert.assertEquals("2", headers[2], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("3", headers[3], hit.nextHeader());
+ Assert.assertEquals("3", headers[3], hit.next());
Assert.assertFalse(hit.hasNext());
// with filter, first & last
hit = new BasicHeaderIterator(headers, "match");
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("0", headers[0], hit.nextHeader());
+ Assert.assertEquals("0", headers[0], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("3", headers[3], hit.nextHeader());
+ Assert.assertEquals("3", headers[3], hit.next());
Assert.assertFalse(hit.hasNext());
// with filter, one match
hit = new BasicHeaderIterator(headers, "single");
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("2", headers[2], hit.nextHeader());
+ Assert.assertEquals("2", headers[2], hit.next());
Assert.assertFalse(hit.hasNext());
// with filter, no match
@@ -137,79 +137,79 @@ public class TestBasicHeaderIterator {
};
// without filter
- HeaderIterator hit = new BasicHeaderIterator(headers, null);
+ Iterator<Header> hit = new BasicHeaderIterator(headers, null);
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("0", headers[0], hit.nextHeader());
+ Assert.assertEquals("0", headers[0], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("1", headers[1], hit.nextHeader());
+ Assert.assertEquals("1", headers[1], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("2", headers[2], hit.nextHeader());
+ Assert.assertEquals("2", headers[2], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("3", headers[3], hit.nextHeader());
+ Assert.assertEquals("3", headers[3], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("4", headers[4], hit.nextHeader());
+ Assert.assertEquals("4", headers[4], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("5", headers[5], hit.nextHeader());
+ Assert.assertEquals("5", headers[5], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("6", headers[6], hit.nextHeader());
+ Assert.assertEquals("6", headers[6], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("7", headers[7], hit.nextHeader());
+ Assert.assertEquals("7", headers[7], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("8", headers[8], hit.nextHeader());
+ Assert.assertEquals("8", headers[8], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("9", headers[9], hit.nextHeader());
+ Assert.assertEquals("9", headers[9], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("a", headers[10], hit.nextHeader());
+ Assert.assertEquals("a", headers[10], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("b", headers[11], hit.nextHeader());
+ Assert.assertEquals("b", headers[11], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("c", headers[12], hit.nextHeader());
+ Assert.assertEquals("c", headers[12], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("d", headers[13], hit.nextHeader());
+ Assert.assertEquals("d", headers[13], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("e", headers[14], hit.nextHeader());
+ Assert.assertEquals("e", headers[14], hit.next());
Assert.assertFalse(hit.hasNext());
// yellow 0, 5, 9, 11, 13
hit = new BasicHeaderIterator(headers, "Yellow");
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("0", headers[0], hit.nextHeader());
+ Assert.assertEquals("0", headers[0], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("5", headers[5], hit.nextHeader());
+ Assert.assertEquals("5", headers[5], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("9", headers[9], hit.nextHeader());
+ Assert.assertEquals("9", headers[9], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("b", headers[11], hit.nextHeader());
+ Assert.assertEquals("b", headers[11], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("d", headers[13], hit.nextHeader());
+ Assert.assertEquals("d", headers[13], hit.next());
Assert.assertFalse(hit.hasNext());
// maroon 1, 6, 7, 8, 10
hit = new BasicHeaderIterator(headers, "marOOn");
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("1", headers[1], hit.nextHeader());
+ Assert.assertEquals("1", headers[1], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("6", headers[6], hit.nextHeader());
+ Assert.assertEquals("6", headers[6], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("7", headers[7], hit.nextHeader());
+ Assert.assertEquals("7", headers[7], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("8", headers[8], hit.nextHeader());
+ Assert.assertEquals("8", headers[8], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("a", headers[10], hit.nextHeader());
+ Assert.assertEquals("a", headers[10], hit.next());
Assert.assertFalse(hit.hasNext());
// orange 2, 3, 4, 12, 14
hit = new BasicHeaderIterator(headers, "OranGe");
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("2", headers[2], hit.nextHeader());
+ Assert.assertEquals("2", headers[2], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("3", headers[3], hit.nextHeader());
+ Assert.assertEquals("3", headers[3], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("4", headers[4], hit.nextHeader());
+ Assert.assertEquals("4", headers[4], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("b", headers[12], hit.nextHeader());
+ Assert.assertEquals("b", headers[12], hit.next());
Assert.assertTrue(hit.hasNext());
- Assert.assertEquals("e", headers[14], hit.nextHeader());
+ Assert.assertEquals("e", headers[14], hit.next());
Assert.assertFalse(hit.hasNext());
}
@@ -217,7 +217,7 @@ public class TestBasicHeaderIterator {
@Test
public void testInvalid() {
- HeaderIterator hit = null;
+ Iterator<Header> hit = null;
try {
hit = new BasicHeaderIterator(null, "whatever");
Assert.fail("null headers not detected");
@@ -231,7 +231,7 @@ public class TestBasicHeaderIterator {
// but this is
try {
- hit.nextHeader();
+ hit.next();
Assert.fail("next beyond end not detected");
} catch (final NoSuchElementException nsx) {
// expected
@@ -251,7 +251,7 @@ public class TestBasicHeaderIterator {
};
// without filter, using plain next()
- HeaderIterator hit = new BasicHeaderIterator(headers, null);
+ Iterator<Header> hit = new BasicHeaderIterator(headers, null);
Assert.assertTrue(hit.hasNext());
Assert.assertEquals("0", headers[0], hit.next());
Assert.assertTrue(hit.hasNext());
@@ -270,7 +270,5 @@ public class TestBasicHeaderIterator {
} catch (final UnsupportedOperationException uox) {
// expected
}
-
- Assert.assertTrue("no next", ((BasicHeaderIterator)hit).findNext(-3) < 0);
}
}
Modified: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicTokenIterator.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicTokenIterator.java?rev=1634010&r1=1634009&r2=1634010&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicTokenIterator.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicTokenIterator.java Fri Oct 24 07:15:19 2014
@@ -27,12 +27,10 @@
package org.apache.http.message;
+import java.util.Iterator;
import java.util.NoSuchElementException;
import org.apache.http.Header;
-import org.apache.http.HeaderIterator;
-import org.apache.http.ParseException;
-import org.apache.http.TokenIterator;
import org.junit.Assert;
import org.junit.Test;
@@ -48,17 +46,17 @@ public class TestBasicTokenIterator {
Header[] headers = new Header[]{
new BasicHeader("Name", "token0,token1, token2 , token3")
};
- HeaderIterator hit = new BasicHeaderIterator(headers, null);
- TokenIterator ti = new BasicTokenIterator(hit);
+ Iterator<Header> hit = new BasicHeaderIterator(headers, null);
+ Iterator<String> ti = new BasicTokenIterator(hit);
Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token0", "token0", ti.nextToken());
+ Assert.assertEquals("token0", "token0", ti.next());
Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token1", "token1", ti.nextToken());
+ Assert.assertEquals("token1", "token1", ti.next());
Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token2", "token2", ti.nextToken());
+ Assert.assertEquals("token2", "token2", ti.next());
Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token3", "token3", ti.nextToken());
+ Assert.assertEquals("token3", "token3", ti.next());
Assert.assertFalse(ti.hasNext());
@@ -69,7 +67,7 @@ public class TestBasicTokenIterator {
ti = new BasicTokenIterator(hit);
Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token0", "token0", ti.nextToken());
+ Assert.assertEquals("token0", "token0", ti.next());
Assert.assertFalse(ti.hasNext());
}
@@ -85,19 +83,19 @@ public class TestBasicTokenIterator {
new BasicHeader("Name", ","),
new BasicHeader("Name", "token4"),
};
- final HeaderIterator hit = new BasicHeaderIterator(headers, null);
- final TokenIterator ti = new BasicTokenIterator(hit);
+ final Iterator<Header> hit = new BasicHeaderIterator(headers, null);
+ final Iterator<String> ti = new BasicTokenIterator(hit);
Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token0", "token0", ti.nextToken());
+ Assert.assertEquals("token0", "token0", ti.next());
Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token1", "token1", ti.nextToken());
+ Assert.assertEquals("token1", "token1", ti.next());
Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token2", "token2", ti.nextToken());
+ Assert.assertEquals("token2", "token2", ti.next());
Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token3", "token3", ti.nextToken());
+ Assert.assertEquals("token3", "token3", ti.next());
Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token4", "token4", ti.nextToken());
+ Assert.assertEquals("token4", "token4", ti.next());
Assert.assertFalse(ti.hasNext());
}
@@ -110,8 +108,8 @@ public class TestBasicTokenIterator {
new BasicHeader("Name", ","),
new BasicHeader("Name", " ,, "),
};
- HeaderIterator hit = new BasicHeaderIterator(headers, null);
- TokenIterator ti = new BasicTokenIterator(hit);
+ Iterator<Header> hit = new BasicHeaderIterator(headers, null);
+ Iterator<String> ti = new BasicTokenIterator(hit);
Assert.assertFalse(ti.hasNext());
@@ -133,21 +131,21 @@ public class TestBasicTokenIterator {
new BasicHeader("Name", ", token4"),
new BasicHeader("Name", " , token5"),
};
- final HeaderIterator hit = new BasicHeaderIterator(headers, null);
- final TokenIterator ti = new BasicTokenIterator(hit);
+ final Iterator<Header> hit = new BasicHeaderIterator(headers, null);
+ final Iterator<String> ti = new BasicTokenIterator(hit);
Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token0", "token0", ti.nextToken());
+ Assert.assertEquals("token0", "token0", ti.next());
Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token1", "token1", ti.nextToken());
+ Assert.assertEquals("token1", "token1", ti.next());
Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token2", "token2", ti.nextToken());
+ Assert.assertEquals("token2", "token2", ti.next());
Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token3", "token3", ti.nextToken());
+ Assert.assertEquals("token3", "token3", ti.next());
Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token4", "token4", ti.nextToken());
+ Assert.assertEquals("token4", "token4", ti.next());
Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token5", "token5", ti.nextToken());
+ Assert.assertEquals("token5", "token5", ti.next());
Assert.assertFalse(ti.hasNext());
}
@@ -162,99 +160,24 @@ public class TestBasicTokenIterator {
new BasicHeader("Name", "token4, "),
new BasicHeader("Name", "token5 , "),
};
- final HeaderIterator hit = new BasicHeaderIterator(headers, null);
- final TokenIterator ti = new BasicTokenIterator(hit);
+ final Iterator<Header> hit = new BasicHeaderIterator(headers, null);
+ final Iterator<String> ti = new BasicTokenIterator(hit);
Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token0", "token0", ti.nextToken());
+ Assert.assertEquals("token0", "token0", ti.next());
Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token1", "token1", ti.nextToken());
+ Assert.assertEquals("token1", "token1", ti.next());
Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token2", "token2", ti.nextToken());
+ Assert.assertEquals("token2", "token2", ti.next());
Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token3", "token3", ti.nextToken());
+ Assert.assertEquals("token3", "token3", ti.next());
Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token4", "token4", ti.nextToken());
+ Assert.assertEquals("token4", "token4", ti.next());
Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token5", "token5", ti.nextToken());
+ Assert.assertEquals("token5", "token5", ti.next());
Assert.assertFalse(ti.hasNext());
}
-
- @Test
- public void testTokenChar() {
- final Header[] headers = new Header[]{
- new BasicHeader("Name", "token0")
- };
- final HeaderIterator hit = new BasicHeaderIterator(headers, null);
- final BasicTokenIterator bti = new BasicTokenIterator(hit);
-
- Assert.assertTrue ("letter" , bti.isTokenChar('j'));
- Assert.assertFalse("control" , bti.isTokenChar('\b'));
- Assert.assertFalse("separator", bti.isTokenChar('?'));
- Assert.assertTrue ("other" , bti.isTokenChar('-'));
- }
-
-
- @Test
- public void testInvalid() {
- final Header[] headers = new Header[]{
- new BasicHeader("in", "token0=token1"),
- new BasicHeader("no", "token0 token1"),
- new BasicHeader("pre", "<token0,token1"),
- new BasicHeader("post", "token0,token1="),
- };
- HeaderIterator hit = new BasicHeaderIterator(headers, "in");
- TokenIterator ti = new BasicTokenIterator(hit);
-
- // constructor located token0
- Assert.assertTrue(ti.hasNext());
- try {
- ti.nextToken();
- Assert.fail("invalid infix character not detected");
- } catch (final ParseException px) {
- // expected
- }
-
-
- // constructor located token0
- hit = new BasicHeaderIterator(headers, "no");
- ti = new BasicTokenIterator(hit);
- Assert.assertTrue(ti.hasNext());
- try {
- ti.nextToken();
- Assert.fail("missing token separator not detected");
- } catch (final ParseException px) {
- // expected
- }
-
-
- // constructor seeks for the first token
- hit = new BasicHeaderIterator(headers, "pre");
- try {
- new BasicTokenIterator(hit);
- Assert.fail("invalid prefix character not detected");
- } catch (final ParseException px) {
- // expected
- }
-
-
- hit = new BasicHeaderIterator(headers, "post");
- ti = new BasicTokenIterator(hit);
-
- Assert.assertTrue(ti.hasNext());
- Assert.assertEquals("token0", "token0", ti.nextToken());
- Assert.assertTrue(ti.hasNext());
- // failure after the last must not go unpunished
- try {
- ti.nextToken();
- Assert.fail("invalid postfix character not detected");
- } catch (final ParseException px) {
- // expected
- }
- }
-
-
@Test
public void testWrongPublic() {
@@ -271,11 +194,11 @@ public class TestBasicTokenIterator {
new BasicHeader("Name", ","),
new BasicHeader("Name", " ,, "),
};
- final HeaderIterator hit = new BasicHeaderIterator(headers, null);
- final TokenIterator ti = new BasicTokenIterator(hit);
+ final Iterator<Header> hit = new BasicHeaderIterator(headers, null);
+ final Iterator<String> ti = new BasicTokenIterator(hit);
try {
- // call next() instead of nextToken() to get that covered, too
+ // call next() instead of next() to get that covered, too
ti.next();
Assert.fail("next after end not detected");
} catch (final NoSuchElementException nsx) {
@@ -290,36 +213,4 @@ public class TestBasicTokenIterator {
}
}
-
- @Test
- public void testWrongProtected() {
-
- final Header[] headers = new Header[]{
- new BasicHeader("Name", "token1,token2")
- };
- final HeaderIterator hit = new BasicHeaderIterator(headers, null);
- final BasicTokenIterator bti = new BasicTokenIterator(hit);
-
- try {
- bti.findTokenStart(-1);
- Assert.fail("tokenStart: negative index not detected");
- } catch (final IllegalArgumentException iax) {
- // expected
- }
-
- try {
- bti.findTokenSeparator(-1);
- Assert.fail("tokenSeparator: negative index not detected");
- } catch (final IllegalArgumentException iax) {
- // expected
- }
-
- try {
- bti.findTokenEnd(-1);
- Assert.fail("tokenEnd: negative index not detected");
- } catch (final IllegalArgumentException iax) {
- // expected
- }
- }
-
}
Modified: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestHeaderGroup.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestHeaderGroup.java?rev=1634010&r1=1634009&r2=1634010&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestHeaderGroup.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestHeaderGroup.java Fri Oct 24 07:15:19 2014
@@ -31,9 +31,9 @@ import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+import java.util.Iterator;
import org.apache.http.Header;
-import org.apache.http.HeaderIterator;
import org.junit.Assert;
import org.junit.Test;
@@ -140,7 +140,7 @@ public class TestHeaderGroup {
@Test
public void testIterator() {
final HeaderGroup headergroup = new HeaderGroup();
- final HeaderIterator i = headergroup.iterator();
+ final Iterator<Header> i = headergroup.iterator();
Assert.assertNotNull(i);
Assert.assertFalse(i.hasNext());
}
@@ -152,7 +152,7 @@ public class TestHeaderGroup {
final Header header2 = new BasicHeader("name", "value2");
final Header header3 = new BasicHeader("name", "value3");
headergroup.setHeaders(new Header[] { header1, header2, header3 });
- final HeaderIterator i = headergroup.iterator();
+ final Iterator<Header> i = headergroup.iterator();
Assert.assertNotNull(i);
Assert.assertTrue(i.hasNext());
i.next();