Overall clean-up on Headers and its subtypes

Motivation:

- There are still various inspector warnings to fix.
- ValueConverter.convert() methods need to end with the type name like
  other methods in Headers, such as setInt() and addInt(), for more
  consistency

Modifications:

- Fix all inspector warnings
- Rename ValueConverter.convert() to convert<type>()

Result:

- Cleaner code
- Consistency
This commit is contained in:
Trustin Lee 2014-10-22 15:04:14 +09:00
parent a1d7a84271
commit 36b41570a4
14 changed files with 239 additions and 233 deletions

View File

@ -47,12 +47,12 @@ public class DefaultHttpHeaders extends DefaultTextHeaders implements HttpHeader
private static final class HttpHeadersValidationConverter extends DefaultTextValueTypeConverter { private static final class HttpHeadersValidationConverter extends DefaultTextValueTypeConverter {
private final boolean validate; private final boolean validate;
public HttpHeadersValidationConverter(boolean validate) { HttpHeadersValidationConverter(boolean validate) {
this.validate = validate; this.validate = validate;
} }
@Override @Override
public CharSequence convert(Object value) { public CharSequence convertObject(Object value) {
if (value == null) { if (value == null) {
throw new NullPointerException("value"); throw new NullPointerException("value");
} }
@ -80,12 +80,90 @@ public class DefaultHttpHeaders extends DefaultTextHeaders implements HttpHeader
return seq; return seq;
} }
private static void validateValue(AsciiString seq) {
int state = 0;
// Start looping through each of the character
final int start = seq.arrayOffset();
final int end = start + seq.length();
final byte[] array = seq.array();
for (int index = start; index < end; index++) {
state = validateValueChar(seq, state, (char) (array[index] & 0xFF));
}
if (state != 0) {
throw new IllegalArgumentException("a header value must not end with '\\r' or '\\n':" + seq);
}
}
private static void validateValue(CharSequence seq) {
int state = 0;
// Start looping through each of the character
for (int index = 0; index < seq.length(); index++) {
state = validateValueChar(seq, state, seq.charAt(index));
}
if (state != 0) {
throw new IllegalArgumentException("a header value must not end with '\\r' or '\\n':" + seq);
}
}
private static int validateValueChar(CharSequence seq, int state, char character) {
/*
* State:
* 0: Previous character was neither CR nor LF
* 1: The previous character was CR
* 2: The previous character was LF
*/
if ((character & HIGHEST_INVALID_VALUE_CHAR_MASK) == 0) {
// Check the absolutely prohibited characters.
switch (character) {
case 0x0b: // Vertical tab
throw new IllegalArgumentException("a header value contains a prohibited character '\\v': " + seq);
case '\f':
throw new IllegalArgumentException("a header value contains a prohibited character '\\f': " + seq);
}
}
// Check the CRLF (HT | SP) pattern
switch (state) {
case 0:
switch (character) {
case '\r':
state = 1;
break;
case '\n':
state = 2;
break;
}
break;
case 1:
switch (character) {
case '\n':
state = 2;
break;
default:
throw new IllegalArgumentException("only '\\n' is allowed after '\\r': " + seq);
}
break;
case 2:
switch (character) {
case '\t':
case ' ':
state = 0;
break;
default:
throw new IllegalArgumentException("only ' ' and '\\t' are allowed after '\\n': " + seq);
}
}
return state;
}
} }
static class HttpHeadersNameConverter implements NameConverter<CharSequence> { static class HttpHeadersNameConverter implements NameConverter<CharSequence> {
protected final boolean validate; protected final boolean validate;
public HttpHeadersNameConverter(boolean validate) { HttpHeadersNameConverter(boolean validate) {
this.validate = validate; this.validate = validate;
} }
@ -101,6 +179,47 @@ public class DefaultHttpHeaders extends DefaultTextHeaders implements HttpHeader
return name; return name;
} }
private static void validateName(AsciiString name) {
// Go through each characters in the name
final int start = name.arrayOffset();
final int end = start + name.length();
final byte[] array = name.array();
for (int index = start; index < end; index ++) {
byte b = array[index];
// Check to see if the character is not an ASCII character
if (b < 0) {
throw new IllegalArgumentException("a header name cannot contain non-ASCII characters: " + name);
}
// Check for prohibited characters.
validateNameChar(name, b);
}
}
private static void validateName(CharSequence name) {
// Go through each characters in the name
for (int index = 0; index < name.length(); index++) {
char character = name.charAt(index);
// Check to see if the character is not an ASCII character
if (character > 127) {
throw new IllegalArgumentException("a header name cannot contain non-ASCII characters: " + name);
}
// Check for prohibited characters.
validateNameChar(name, character);
}
}
private static void validateNameChar(CharSequence name, int character) {
if ((character & HIGHEST_INVALID_NAME_CHAR_MASK) == 0 && LOOKUP_TABLE[character] != 0) {
throw new IllegalArgumentException(
"a header name cannot contain the following prohibited characters: =,;: \\t\\r\\n\\v\\f: " +
name);
}
}
} }
private static final HttpHeadersValidationConverter private static final HttpHeadersValidationConverter
@ -115,129 +234,13 @@ public class DefaultHttpHeaders extends DefaultTextHeaders implements HttpHeader
} }
public DefaultHttpHeaders(boolean validate) { public DefaultHttpHeaders(boolean validate) {
this(true, validate ? VALIDATE_NAME_CONVERTER : NO_VALIDATE_NAME_CONVERTER); this(true, validate? VALIDATE_NAME_CONVERTER : NO_VALIDATE_NAME_CONVERTER);
} }
protected DefaultHttpHeaders(boolean validate, NameConverter<CharSequence> nameConverter) { protected DefaultHttpHeaders(boolean validate, NameConverter<CharSequence> nameConverter) {
super(true, validate ? VALIDATE_OBJECT_CONVERTER : NO_VALIDATE_OBJECT_CONVERTER, nameConverter); super(true, validate ? VALIDATE_OBJECT_CONVERTER : NO_VALIDATE_OBJECT_CONVERTER, nameConverter);
} }
private static void validateName(AsciiString name) {
// Go through each characters in the name
final int start = name.arrayOffset();
final int end = start + name.length();
final byte[] array = name.array();
for (int index = start; index < end; index ++) {
byte b = array[index];
// Check to see if the character is not an ASCII character
if (b < 0) {
throw new IllegalArgumentException("a header name cannot contain non-ASCII characters: " + name);
}
// Check for prohibited characters.
validateNameChar(name, b);
}
}
private static void validateName(CharSequence name) {
// Go through each characters in the name
for (int index = 0; index < name.length(); index++) {
char character = name.charAt(index);
// Check to see if the character is not an ASCII character
if (character > 127) {
throw new IllegalArgumentException("a header name cannot contain non-ASCII characters: " + name);
}
// Check for prohibited characters.
validateNameChar(name, character);
}
}
private static void validateNameChar(CharSequence name, int character) {
if ((character & HIGHEST_INVALID_NAME_CHAR_MASK) == 0 && LOOKUP_TABLE[character] != 0) {
throw new IllegalArgumentException("a header name cannot contain the following prohibited characters: "
+ "=,;: \\t\\r\\n\\v\\f: " + name);
}
}
private static void validateValue(AsciiString seq) {
int state = 0;
// Start looping through each of the character
final int start = seq.arrayOffset();
final int end = start + seq.length();
final byte[] array = seq.array();
for (int index = start; index < end; index++) {
state = validateValueChar(seq, state, (char) (array[index] & 0xFF));
}
if (state != 0) {
throw new IllegalArgumentException("a header value must not end with '\\r' or '\\n':" + seq);
}
}
private static void validateValue(CharSequence seq) {
int state = 0;
// Start looping through each of the character
for (int index = 0; index < seq.length(); index++) {
state = validateValueChar(seq, state, seq.charAt(index));
}
if (state != 0) {
throw new IllegalArgumentException("a header value must not end with '\\r' or '\\n':" + seq);
}
}
private static int validateValueChar(CharSequence seq, int state, char character) {
/*
* State: 0: Previous character was neither CR nor LF 1: The previous character was CR 2: The previous character
* was LF
*/
if ((character & HIGHEST_INVALID_VALUE_CHAR_MASK) == 0) {
// Check the absolutely prohibited characters.
switch (character) {
case 0x0b: // Vertical tab
throw new IllegalArgumentException("a header value contains a prohibited character '\\v': " + seq);
case '\f':
throw new IllegalArgumentException("a header value contains a prohibited character '\\f': " + seq);
}
}
// Check the CRLF (HT | SP) pattern
switch (state) {
case 0:
switch (character) {
case '\r':
state = 1;
break;
case '\n':
state = 2;
break;
}
break;
case 1:
switch (character) {
case '\n':
state = 2;
break;
default:
throw new IllegalArgumentException("only '\\n' is allowed after '\\r': " + seq);
}
break;
case 2:
switch (character) {
case '\t':
case ' ':
state = 0;
break;
default:
throw new IllegalArgumentException("only ' ' and '\\t' are allowed after '\\n': " + seq);
}
}
return state;
}
@Override @Override
public HttpHeaders add(CharSequence name, CharSequence value) { public HttpHeaders add(CharSequence name, CharSequence value) {
super.add(name, value); super.add(name, value);

View File

@ -15,9 +15,6 @@
*/ */
package io.netty.handler.codec.http; package io.netty.handler.codec.http;
import static io.netty.handler.codec.http.HttpHeaders.Names.CONTENT_LENGTH;
import static io.netty.handler.codec.http.HttpHeaders.Names.TRAILER;
import static io.netty.handler.codec.http.HttpHeaders.Names.TRANSFER_ENCODING;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
import io.netty.handler.codec.AsciiString; import io.netty.handler.codec.AsciiString;
@ -25,6 +22,8 @@ import io.netty.util.internal.StringUtil;
import java.util.Map; import java.util.Map;
import static io.netty.handler.codec.http.HttpHeaders.Names.*;
/** /**
* The default {@link LastHttpContent} implementation. * The default {@link LastHttpContent} implementation.
*/ */
@ -112,7 +111,7 @@ public class DefaultLastHttpContent extends DefaultHttpContent implements LastHt
private static final class TrailingHttpHeaders extends DefaultHttpHeaders { private static final class TrailingHttpHeaders extends DefaultHttpHeaders {
private static final class TrailingHttpHeadersNameConverter extends HttpHeadersNameConverter { private static final class TrailingHttpHeadersNameConverter extends HttpHeadersNameConverter {
public TrailingHttpHeadersNameConverter(boolean validate) { TrailingHttpHeadersNameConverter(boolean validate) {
super(validate); super(validate);
} }

View File

@ -510,27 +510,27 @@ public interface HttpHeaders extends TextHeaders {
public static final AsciiString WEBSOCKET = new AsciiString("WebSocket"); public static final AsciiString WEBSOCKET = new AsciiString("WebSocket");
/** /**
* {@code "name"} * {@code "name"}
* See {@link #HttpHeaders.Names.CONTENT_DISPOSITION} * See {@link Names#CONTENT_DISPOSITION}
*/ */
public static final AsciiString NAME = new AsciiString("name"); public static final AsciiString NAME = new AsciiString("name");
/** /**
* {@code "filename"} * {@code "filename"}
* See {@link #HttpHeaders.Names.CONTENT_DISPOSITION} * See {@link Names#CONTENT_DISPOSITION}
*/ */
public static final AsciiString FILENAME = new AsciiString("filename"); public static final AsciiString FILENAME = new AsciiString("filename");
/** /**
* {@code "form-data"} * {@code "form-data"}
* See {@link #HttpHeaders.Names.CONTENT_DISPOSITION} * See {@link Names#CONTENT_DISPOSITION}
*/ */
public static final AsciiString FORM_DATA = new AsciiString("form-data"); public static final AsciiString FORM_DATA = new AsciiString("form-data");
/** /**
* {@code "attachment"} * {@code "attachment"}
* See {@link #HttpHeaders.Names.CONTENT_DISPOSITION} * See {@link Names#CONTENT_DISPOSITION}
*/ */
public static final AsciiString ATTACHMENT = new AsciiString("attachment"); public static final AsciiString ATTACHMENT = new AsciiString("attachment");
/** /**
* {@code "file"} * {@code "file"}
* See {@link #HttpHeaders.Names.CONTENT_DISPOSITION} * See {@link Names#CONTENT_DISPOSITION}
*/ */
public static final AsciiString FILE = new AsciiString("file"); public static final AsciiString FILE = new AsciiString("file");

View File

@ -26,7 +26,7 @@ public class DefaultSpdyHeaders extends DefaultTextHeaders implements SpdyHeader
private static final Headers.ValueConverter<CharSequence> SPDY_VALUE_CONVERTER = private static final Headers.ValueConverter<CharSequence> SPDY_VALUE_CONVERTER =
new DefaultTextValueTypeConverter() { new DefaultTextValueTypeConverter() {
@Override @Override
public CharSequence convert(Object value) { public CharSequence convertObject(Object value) {
CharSequence seq; CharSequence seq;
if (value instanceof CharSequence) { if (value instanceof CharSequence) {
seq = (CharSequence) value; seq = (CharSequence) value;

View File

@ -29,7 +29,7 @@ public interface Http2Headers extends BinaryHeaders {
/** /**
* HTTP/2 pseudo-headers names. * HTTP/2 pseudo-headers names.
*/ */
public enum PseudoHeaderName { enum PseudoHeaderName {
/** /**
* {@code :method}. * {@code :method}.
*/ */

View File

@ -25,13 +25,13 @@ public interface BinaryHeaders extends Headers<AsciiString> {
/** /**
* A visitor that helps reduce GC pressure while iterating over a collection of {@link Headers}. * A visitor that helps reduce GC pressure while iterating over a collection of {@link Headers}.
*/ */
public interface EntryVisitor extends Headers.EntryVisitor<AsciiString> { interface EntryVisitor extends Headers.EntryVisitor<AsciiString> {
} }
/** /**
* A visitor that helps reduce GC pressure while iterating over a collection of {@link Headers}. * A visitor that helps reduce GC pressure while iterating over a collection of {@link Headers}.
*/ */
public interface NameVisitor extends Headers.NameVisitor<AsciiString> { interface NameVisitor extends Headers.NameVisitor<AsciiString> {
} }
@Override @Override

View File

@ -30,7 +30,7 @@ public interface ConvertibleHeaders<UnconvertedType, ConvertedType> extends Head
/** /**
* Interface to do conversions to and from the two generic type parameters * Interface to do conversions to and from the two generic type parameters
*/ */
public interface TypeConverter<UnconvertedType, ConvertedType> { interface TypeConverter<UnconvertedType, ConvertedType> {
/** /**
* Convert a native value * Convert a native value
* @param value The value to be converted * @param value The value to be converted
@ -91,21 +91,21 @@ public interface ConvertibleHeaders<UnconvertedType, ConvertedType> extends Head
/** /**
* Invokes {@link Headers#entries()} and lazily does a conversion on the results as they are accessed * Invokes {@link Headers#entries()} and lazily does a conversion on the results as they are accessed
* @param name The name of entry to get *
* @return The values corresponding to {@code name} and then lazily converted * @return The values corresponding to {@code name} and then lazily converted
*/ */
List<Map.Entry<ConvertedType, ConvertedType>> entriesConverted(); List<Map.Entry<ConvertedType, ConvertedType>> entriesConverted();
/** /**
* Invokes {@link Headers#iterator()} and lazily does a conversion on the results as they are accessed * Invokes {@link Headers#iterator()} and lazily does a conversion on the results as they are accessed
* @param name The name of entry to get *
* @return Iterator which will provide converted values corresponding to {@code name} * @return Iterator which will provide converted values corresponding to {@code name}
*/ */
Iterator<Entry<ConvertedType, ConvertedType>> iteratorConverted(); Iterator<Entry<ConvertedType, ConvertedType>> iteratorConverted();
/** /**
* Invokes {@link Headers#names()} and does a conversion on the results * Invokes {@link Headers#names()} and does a conversion on the results
* @param name The name of entry to get *
* @return The values corresponding to {@code name} and then converted * @return The values corresponding to {@code name} and then converted
*/ */
Set<ConvertedType> namesAndConvert(Comparator<ConvertedType> comparator); Set<ConvertedType> namesAndConvert(Comparator<ConvertedType> comparator);

View File

@ -14,11 +14,12 @@
*/ */
package io.netty.handler.codec; package io.netty.handler.codec;
import static io.netty.handler.codec.AsciiString.CASE_INSENSITIVE_ORDER;
import io.netty.util.internal.PlatformDependent; import io.netty.util.internal.PlatformDependent;
import java.text.ParseException; import java.text.ParseException;
import static io.netty.handler.codec.AsciiString.*;
public class DefaultBinaryHeaders extends DefaultHeaders<AsciiString> implements BinaryHeaders { public class DefaultBinaryHeaders extends DefaultHeaders<AsciiString> implements BinaryHeaders {
private static final HashCodeGenerator<AsciiString> ASCII_HASH_CODE_GENERATOR = private static final HashCodeGenerator<AsciiString> ASCII_HASH_CODE_GENERATOR =
new HashCodeGenerator<AsciiString>() { new HashCodeGenerator<AsciiString>() {
@ -30,42 +31,43 @@ public class DefaultBinaryHeaders extends DefaultHeaders<AsciiString> implements
private static final ValueConverter<AsciiString> OBJECT_TO_ASCII = new ValueConverter<AsciiString>() { private static final ValueConverter<AsciiString> OBJECT_TO_ASCII = new ValueConverter<AsciiString>() {
@Override @Override
public AsciiString convert(Object value) { public AsciiString convertObject(Object value) {
if (value instanceof AsciiString) { if (value instanceof AsciiString) {
return (AsciiString) value; return (AsciiString) value;
} else if (value instanceof CharSequence) { }
if (value instanceof CharSequence) {
return new AsciiString((CharSequence) value); return new AsciiString((CharSequence) value);
} }
return new AsciiString(value.toString()); return new AsciiString(value.toString());
} }
@Override @Override
public AsciiString convert(int value) { public AsciiString convertInt(int value) {
return new AsciiString(String.valueOf(value)); return new AsciiString(String.valueOf(value));
} }
@Override @Override
public AsciiString convert(long value) { public AsciiString convertLong(long value) {
return new AsciiString(String.valueOf(value)); return new AsciiString(String.valueOf(value));
} }
@Override @Override
public AsciiString convert(double value) { public AsciiString convertDouble(double value) {
return new AsciiString(String.valueOf(value)); return new AsciiString(String.valueOf(value));
} }
@Override @Override
public AsciiString convert(char value) { public AsciiString convertChar(char value) {
return new AsciiString(String.valueOf(value)); return new AsciiString(String.valueOf(value));
} }
@Override @Override
public AsciiString convert(boolean value) { public AsciiString convertBoolean(boolean value) {
return new AsciiString(String.valueOf(value)); return new AsciiString(String.valueOf(value));
} }
@Override @Override
public AsciiString convert(float value) { public AsciiString convertFloat(float value) {
return new AsciiString(String.valueOf(value)); return new AsciiString(String.valueOf(value));
} }
@ -110,7 +112,7 @@ public class DefaultBinaryHeaders extends DefaultHeaders<AsciiString> implements
} }
@Override @Override
public AsciiString convert(short value) { public AsciiString convertShort(short value) {
return new AsciiString(String.valueOf(value)); return new AsciiString(String.valueOf(value));
} }
@ -120,7 +122,7 @@ public class DefaultBinaryHeaders extends DefaultHeaders<AsciiString> implements
} }
@Override @Override
public AsciiString convert(byte value) { public AsciiString convertByte(byte value) {
return new AsciiString(String.valueOf(value)); return new AsciiString(String.valueOf(value));
} }

View File

@ -121,7 +121,7 @@ public class DefaultConvertibleHeaders<UnconvertedType, ConvertedType> extends D
} }
private final class ConvertedIterator implements Iterator<Entry<ConvertedType, ConvertedType>> { private final class ConvertedIterator implements Iterator<Entry<ConvertedType, ConvertedType>> {
private Iterator<Entry<UnconvertedType, UnconvertedType>> iter = iterator(); private final Iterator<Entry<UnconvertedType, UnconvertedType>> iter = iterator();
@Override @Override
public boolean hasNext() { public boolean hasNext() {
@ -146,7 +146,7 @@ public class DefaultConvertibleHeaders<UnconvertedType, ConvertedType> extends D
private ConvertedType name; private ConvertedType name;
private ConvertedType value; private ConvertedType value;
public ConvertedEntry(Entry<UnconvertedType, UnconvertedType> entry) { ConvertedEntry(Entry<UnconvertedType, UnconvertedType> entry) {
this.entry = entry; this.entry = entry;
} }

View File

@ -14,7 +14,6 @@
*/ */
package io.netty.handler.codec; package io.netty.handler.codec;
import static io.netty.util.internal.ObjectUtil.checkNotNull;
import io.netty.util.collection.CollectionUtils; import io.netty.util.collection.CollectionUtils;
import io.netty.util.collection.IntObjectHashMap; import io.netty.util.collection.IntObjectHashMap;
import io.netty.util.collection.IntObjectMap; import io.netty.util.collection.IntObjectMap;
@ -39,6 +38,8 @@ import java.util.Set;
import java.util.TimeZone; import java.util.TimeZone;
import java.util.TreeSet; import java.util.TreeSet;
import static io.netty.util.internal.ObjectUtil.*;
public class DefaultHeaders<T> implements Headers<T> { public class DefaultHeaders<T> implements Headers<T> {
/** /**
* Allows users of this interface to specify a hash code other than the default {@link Object#hashCode()} * Allows users of this interface to specify a hash code other than the default {@link Object#hashCode()}
@ -85,7 +86,7 @@ public class DefaultHeaders<T> implements Headers<T> {
private final EntryVisitor<T> setAllVisitor = new EntryVisitor<T>() { private final EntryVisitor<T> setAllVisitor = new EntryVisitor<T>() {
@Override @Override
public boolean visit(Entry<T, T> entry) { public boolean visit(Entry<T, T> entry) {
DefaultHeaders.this.set(entry.getKey(), entry.getValue()); set(entry.getKey(), entry.getValue());
return true; return true;
} }
}; };
@ -93,7 +94,7 @@ public class DefaultHeaders<T> implements Headers<T> {
private final EntryVisitor<T> addAllVisitor = new EntryVisitor<T>() { private final EntryVisitor<T> addAllVisitor = new EntryVisitor<T>() {
@Override @Override
public boolean visit(Entry<T, T> entry) { public boolean visit(Entry<T, T> entry) {
DefaultHeaders.this.add(entry.getKey(), entry.getValue()); add(entry.getKey(), entry.getValue());
return true; return true;
} }
}; };
@ -335,47 +336,47 @@ public class DefaultHeaders<T> implements Headers<T> {
@Override @Override
public boolean containsObject(T name, Object value) { public boolean containsObject(T name, Object value) {
return contains(name, valueConverter.convert(checkNotNull(value, "value"))); return contains(name, valueConverter.convertObject(checkNotNull(value, "value")));
} }
@Override @Override
public boolean containsBoolean(T name, int value) { public boolean containsBoolean(T name, int value) {
return contains(name, valueConverter.convert(checkNotNull(value, "value"))); return contains(name, valueConverter.convertObject(checkNotNull(value, "value")));
} }
@Override @Override
public boolean containsByte(T name, byte value) { public boolean containsByte(T name, byte value) {
return contains(name, valueConverter.convert(checkNotNull(value, "value"))); return contains(name, valueConverter.convertObject(checkNotNull(value, "value")));
} }
@Override @Override
public boolean containsChar(T name, char value) { public boolean containsChar(T name, char value) {
return contains(name, valueConverter.convert(checkNotNull(value, "value"))); return contains(name, valueConverter.convertObject(checkNotNull(value, "value")));
} }
@Override @Override
public boolean containsShort(T name, byte value) { public boolean containsShort(T name, byte value) {
return contains(name, valueConverter.convert(checkNotNull(value, "value"))); return contains(name, valueConverter.convertObject(checkNotNull(value, "value")));
} }
@Override @Override
public boolean containsInt(T name, int value) { public boolean containsInt(T name, int value) {
return contains(name, valueConverter.convert(checkNotNull(value, "value"))); return contains(name, valueConverter.convertObject(checkNotNull(value, "value")));
} }
@Override @Override
public boolean containsLong(T name, long value) { public boolean containsLong(T name, long value) {
return contains(name, valueConverter.convert(checkNotNull(value, "value"))); return contains(name, valueConverter.convertObject(checkNotNull(value, "value")));
} }
@Override @Override
public boolean containsFloat(T name, float value) { public boolean containsFloat(T name, float value) {
return contains(name, valueConverter.convert(checkNotNull(value, "value"))); return contains(name, valueConverter.convertObject(checkNotNull(value, "value")));
} }
@Override @Override
public boolean containsDouble(T name, double value) { public boolean containsDouble(T name, double value) {
return contains(name, valueConverter.convert(checkNotNull(value, "value"))); return contains(name, valueConverter.convertObject(checkNotNull(value, "value")));
} }
@Override @Override
@ -412,7 +413,8 @@ public class DefaultHeaders<T> implements Headers<T> {
@Override @Override
public boolean containsObject(T name, Object value, Comparator<? super T> keyComparator, public boolean containsObject(T name, Object value, Comparator<? super T> keyComparator,
Comparator<? super T> valueComparator) { Comparator<? super T> valueComparator) {
return contains(name, valueConverter.convert(checkNotNull(value, "value")), keyComparator, valueComparator); return contains(
name, valueConverter.convertObject(checkNotNull(value, "value")), keyComparator, valueComparator);
} }
@Override @Override
@ -495,7 +497,7 @@ public class DefaultHeaders<T> implements Headers<T> {
@Override @Override
public Headers<T> addObject(T name, Object value) { public Headers<T> addObject(T name, Object value) {
return add(name, valueConverter.convert(checkNotNull(value, "value"))); return add(name, valueConverter.convertObject(checkNotNull(value, "value")));
} }
@Override @Override
@ -509,7 +511,7 @@ public class DefaultHeaders<T> implements Headers<T> {
if (o == null) { if (o == null) {
break; break;
} }
T converted = valueConverter.convert(o); T converted = valueConverter.convertObject(o);
checkNotNull(converted, "converted"); checkNotNull(converted, "converted");
add0(h, i, name, converted); add0(h, i, name, converted);
} }
@ -527,7 +529,7 @@ public class DefaultHeaders<T> implements Headers<T> {
if (o == null) { if (o == null) {
break; break;
} }
T converted = valueConverter.convert(o); T converted = valueConverter.convertObject(o);
checkNotNull(converted, "converted"); checkNotNull(converted, "converted");
add0(h, i, name, converted); add0(h, i, name, converted);
} }
@ -536,42 +538,42 @@ public class DefaultHeaders<T> implements Headers<T> {
@Override @Override
public Headers<T> addInt(T name, int value) { public Headers<T> addInt(T name, int value) {
return add(name, valueConverter.convert(value)); return add(name, valueConverter.convertInt(value));
} }
@Override @Override
public Headers<T> addLong(T name, long value) { public Headers<T> addLong(T name, long value) {
return add(name, valueConverter.convert(value)); return add(name, valueConverter.convertLong(value));
} }
@Override @Override
public Headers<T> addDouble(T name, double value) { public Headers<T> addDouble(T name, double value) {
return add(name, valueConverter.convert(value)); return add(name, valueConverter.convertDouble(value));
} }
@Override @Override
public Headers<T> addChar(T name, char value) { public Headers<T> addChar(T name, char value) {
return add(name, valueConverter.convert(value)); return add(name, valueConverter.convertChar(value));
} }
@Override @Override
public Headers<T> addBoolean(T name, boolean value) { public Headers<T> addBoolean(T name, boolean value) {
return add(name, valueConverter.convert(value)); return add(name, valueConverter.convertBoolean(value));
} }
@Override @Override
public Headers<T> addFloat(T name, float value) { public Headers<T> addFloat(T name, float value) {
return add(name, valueConverter.convert(value)); return add(name, valueConverter.convertFloat(value));
} }
@Override @Override
public Headers<T> addByte(T name, byte value) { public Headers<T> addByte(T name, byte value) {
return add(name, valueConverter.convert(value)); return add(name, valueConverter.convertByte(value));
} }
@Override @Override
public Headers<T> addShort(T name, short value) { public Headers<T> addShort(T name, short value) {
return add(name, valueConverter.convert(value)); return add(name, valueConverter.convertShort(value));
} }
@Override @Override
@ -631,7 +633,7 @@ public class DefaultHeaders<T> implements Headers<T> {
@Override @Override
public Headers<T> setObject(T name, Object value) { public Headers<T> setObject(T name, Object value) {
return set(name, valueConverter.convert(checkNotNull(value, "value"))); return set(name, valueConverter.convertObject(checkNotNull(value, "value")));
} }
@Override @Override
@ -646,7 +648,7 @@ public class DefaultHeaders<T> implements Headers<T> {
if (o == null) { if (o == null) {
break; break;
} }
T converted = valueConverter.convert(o); T converted = valueConverter.convertObject(o);
checkNotNull(converted, "converted"); checkNotNull(converted, "converted");
add0(h, i, name, converted); add0(h, i, name, converted);
} }
@ -666,7 +668,7 @@ public class DefaultHeaders<T> implements Headers<T> {
if (o == null) { if (o == null) {
break; break;
} }
T converted = valueConverter.convert(o); T converted = valueConverter.convertObject(o);
checkNotNull(converted, "converted"); checkNotNull(converted, "converted");
add0(h, i, name, converted); add0(h, i, name, converted);
} }
@ -676,42 +678,42 @@ public class DefaultHeaders<T> implements Headers<T> {
@Override @Override
public Headers<T> setInt(T name, int value) { public Headers<T> setInt(T name, int value) {
return set(name, valueConverter.convert(value)); return set(name, valueConverter.convertInt(value));
} }
@Override @Override
public Headers<T> setLong(T name, long value) { public Headers<T> setLong(T name, long value) {
return set(name, valueConverter.convert(value)); return set(name, valueConverter.convertLong(value));
} }
@Override @Override
public Headers<T> setDouble(T name, double value) { public Headers<T> setDouble(T name, double value) {
return set(name, valueConverter.convert(value)); return set(name, valueConverter.convertDouble(value));
} }
@Override @Override
public Headers<T> setFloat(T name, float value) { public Headers<T> setFloat(T name, float value) {
return set(name, valueConverter.convert(value)); return set(name, valueConverter.convertFloat(value));
} }
@Override @Override
public Headers<T> setChar(T name, char value) { public Headers<T> setChar(T name, char value) {
return set(name, valueConverter.convert(value)); return set(name, valueConverter.convertChar(value));
} }
@Override @Override
public Headers<T> setBoolean(T name, boolean value) { public Headers<T> setBoolean(T name, boolean value) {
return set(name, valueConverter.convert(value)); return set(name, valueConverter.convertBoolean(value));
} }
@Override @Override
public Headers<T> setByte(T name, byte value) { public Headers<T> setByte(T name, byte value) {
return set(name, valueConverter.convert(value)); return set(name, valueConverter.convertByte(value));
} }
@Override @Override
public Headers<T> setShort(T name, short value) { public Headers<T> setShort(T name, short value) {
return set(name, valueConverter.convert(value)); return set(name, valueConverter.convertShort(value));
} }
@Override @Override
@ -799,7 +801,7 @@ public class DefaultHeaders<T> implements Headers<T> {
} }
try { try {
return valueConverter.convertToBoolean(v); return valueConverter.convertToBoolean(v);
} catch (Throwable t) { } catch (Throwable ignored) {
return null; return null;
} }
} }
@ -818,7 +820,7 @@ public class DefaultHeaders<T> implements Headers<T> {
} }
try { try {
return valueConverter.convertToByte(v); return valueConverter.convertToByte(v);
} catch (Throwable t) { } catch (Throwable ignored) {
return null; return null;
} }
} }
@ -837,7 +839,7 @@ public class DefaultHeaders<T> implements Headers<T> {
} }
try { try {
return valueConverter.convertToChar(v); return valueConverter.convertToChar(v);
} catch (Throwable t) { } catch (Throwable ignored) {
return null; return null;
} }
} }
@ -856,7 +858,7 @@ public class DefaultHeaders<T> implements Headers<T> {
} }
try { try {
return valueConverter.convertToShort(v); return valueConverter.convertToShort(v);
} catch (Throwable t) { } catch (Throwable ignored) {
return null; return null;
} }
} }
@ -875,7 +877,7 @@ public class DefaultHeaders<T> implements Headers<T> {
} }
try { try {
return valueConverter.convertToInt(v); return valueConverter.convertToInt(v);
} catch (Throwable t) { } catch (Throwable ignored) {
return null; return null;
} }
} }
@ -894,7 +896,7 @@ public class DefaultHeaders<T> implements Headers<T> {
} }
try { try {
return valueConverter.convertToLong(v); return valueConverter.convertToLong(v);
} catch (Throwable t) { } catch (Throwable ignored) {
return null; return null;
} }
} }
@ -913,7 +915,7 @@ public class DefaultHeaders<T> implements Headers<T> {
} }
try { try {
return valueConverter.convertToFloat(v); return valueConverter.convertToFloat(v);
} catch (Throwable t) { } catch (Throwable ignored) {
return null; return null;
} }
} }
@ -932,7 +934,7 @@ public class DefaultHeaders<T> implements Headers<T> {
} }
try { try {
return valueConverter.convertToDouble(v); return valueConverter.convertToDouble(v);
} catch (Throwable t) { } catch (Throwable ignored) {
return null; return null;
} }
} }
@ -951,7 +953,7 @@ public class DefaultHeaders<T> implements Headers<T> {
} }
try { try {
return valueConverter.convertToTimeMillis(v); return valueConverter.convertToTimeMillis(v);
} catch (Throwable t) { } catch (Throwable ignored) {
return null; return null;
} }
} }
@ -970,7 +972,7 @@ public class DefaultHeaders<T> implements Headers<T> {
} }
try { try {
return valueConverter.convertToBoolean(v); return valueConverter.convertToBoolean(v);
} catch (Throwable t) { } catch (Throwable ignored) {
return null; return null;
} }
} }
@ -989,7 +991,7 @@ public class DefaultHeaders<T> implements Headers<T> {
} }
try { try {
return valueConverter.convertToByte(v); return valueConverter.convertToByte(v);
} catch (Throwable t) { } catch (Throwable ignored) {
return null; return null;
} }
} }
@ -1008,7 +1010,7 @@ public class DefaultHeaders<T> implements Headers<T> {
} }
try { try {
return valueConverter.convertToChar(v); return valueConverter.convertToChar(v);
} catch (Throwable t) { } catch (Throwable ignored) {
return null; return null;
} }
} }
@ -1027,7 +1029,7 @@ public class DefaultHeaders<T> implements Headers<T> {
} }
try { try {
return valueConverter.convertToShort(v); return valueConverter.convertToShort(v);
} catch (Throwable t) { } catch (Throwable ignored) {
return null; return null;
} }
} }
@ -1046,7 +1048,7 @@ public class DefaultHeaders<T> implements Headers<T> {
} }
try { try {
return valueConverter.convertToInt(v); return valueConverter.convertToInt(v);
} catch (Throwable t) { } catch (Throwable ignored) {
return null; return null;
} }
} }
@ -1065,7 +1067,7 @@ public class DefaultHeaders<T> implements Headers<T> {
} }
try { try {
return valueConverter.convertToLong(v); return valueConverter.convertToLong(v);
} catch (Throwable t) { } catch (Throwable ignored) {
return null; return null;
} }
} }
@ -1084,7 +1086,7 @@ public class DefaultHeaders<T> implements Headers<T> {
} }
try { try {
return valueConverter.convertToFloat(v); return valueConverter.convertToFloat(v);
} catch (Throwable t) { } catch (Throwable ignored) {
return null; return null;
} }
} }
@ -1103,7 +1105,7 @@ public class DefaultHeaders<T> implements Headers<T> {
} }
try { try {
return valueConverter.convertToDouble(v); return valueConverter.convertToDouble(v);
} catch (Throwable t) { } catch (Throwable ignored) {
return null; return null;
} }
} }
@ -1122,7 +1124,7 @@ public class DefaultHeaders<T> implements Headers<T> {
} }
try { try {
return valueConverter.convertToTimeMillis(v); return valueConverter.convertToTimeMillis(v);
} catch (Throwable t) { } catch (Throwable ignored) {
return null; return null;
} }
} }

View File

@ -16,13 +16,13 @@
package io.netty.handler.codec; package io.netty.handler.codec;
import static io.netty.handler.codec.AsciiString.CHARSEQUENCE_CASE_INSENSITIVE_ORDER;
import static io.netty.handler.codec.AsciiString.CHARSEQUENCE_CASE_SENSITIVE_ORDER;
import io.netty.util.internal.PlatformDependent; import io.netty.util.internal.PlatformDependent;
import java.text.ParseException; import java.text.ParseException;
import java.util.Comparator; import java.util.Comparator;
import static io.netty.handler.codec.AsciiString.*;
public class DefaultTextHeaders extends DefaultConvertibleHeaders<CharSequence, String> implements TextHeaders { public class DefaultTextHeaders extends DefaultConvertibleHeaders<CharSequence, String> implements TextHeaders {
private static final HashCodeGenerator<CharSequence> CHARSEQUECE_CASE_INSENSITIVE_HASH_CODE_GENERATOR = private static final HashCodeGenerator<CharSequence> CHARSEQUECE_CASE_INSENSITIVE_HASH_CODE_GENERATOR =
new HashCodeGenerator<CharSequence>() { new HashCodeGenerator<CharSequence>() {
@ -42,7 +42,7 @@ public class DefaultTextHeaders extends DefaultConvertibleHeaders<CharSequence,
public static class DefaultTextValueTypeConverter implements ValueConverter<CharSequence> { public static class DefaultTextValueTypeConverter implements ValueConverter<CharSequence> {
@Override @Override
public CharSequence convert(Object value) { public CharSequence convertObject(Object value) {
if (value instanceof CharSequence) { if (value instanceof CharSequence) {
return (CharSequence) value; return (CharSequence) value;
} }
@ -50,32 +50,32 @@ public class DefaultTextHeaders extends DefaultConvertibleHeaders<CharSequence,
} }
@Override @Override
public CharSequence convert(int value) { public CharSequence convertInt(int value) {
return String.valueOf(value); return String.valueOf(value);
} }
@Override @Override
public CharSequence convert(long value) { public CharSequence convertLong(long value) {
return String.valueOf(value); return String.valueOf(value);
} }
@Override @Override
public CharSequence convert(double value) { public CharSequence convertDouble(double value) {
return String.valueOf(value); return String.valueOf(value);
} }
@Override @Override
public CharSequence convert(char value) { public CharSequence convertChar(char value) {
return String.valueOf(value); return String.valueOf(value);
} }
@Override @Override
public CharSequence convert(boolean value) { public CharSequence convertBoolean(boolean value) {
return String.valueOf(value); return String.valueOf(value);
} }
@Override @Override
public CharSequence convert(float value) { public CharSequence convertFloat(float value) {
return String.valueOf(value); return String.valueOf(value);
} }
@ -85,7 +85,7 @@ public class DefaultTextHeaders extends DefaultConvertibleHeaders<CharSequence,
} }
@Override @Override
public CharSequence convert(byte value) { public CharSequence convertByte(byte value) {
return String.valueOf(value); return String.valueOf(value);
} }
@ -100,7 +100,7 @@ public class DefaultTextHeaders extends DefaultConvertibleHeaders<CharSequence,
} }
@Override @Override
public CharSequence convert(short value) { public CharSequence convertShort(short value) {
return String.valueOf(value); return String.valueOf(value);
} }

View File

@ -505,12 +505,12 @@ public class EmptyHeaders<T> implements Headers<T> {
} }
@Override @Override
public Entry<T, T> forEachEntry(io.netty.handler.codec.Headers.EntryVisitor<T> visitor) throws Exception { public Entry<T, T> forEachEntry(Headers.EntryVisitor<T> visitor) throws Exception {
return null; return null;
} }
@Override @Override
public T forEachName(io.netty.handler.codec.Headers.NameVisitor<T> visitor) throws Exception { public T forEachName(Headers.NameVisitor<T> visitor) throws Exception {
return null; return null;
} }

View File

@ -25,7 +25,7 @@ public interface Headers<T> extends Iterable<Map.Entry<T, T>> {
/** /**
* A visitor that helps reduce GC pressure while iterating over a collection of {@link Headers}. * A visitor that helps reduce GC pressure while iterating over a collection of {@link Headers}.
*/ */
public interface EntryVisitor<T> { interface EntryVisitor<T> {
/** /**
* @return <ul> * @return <ul>
* <li>{@code true} if the processor wants to continue the loop and handle the entry.</li> * <li>{@code true} if the processor wants to continue the loop and handle the entry.</li>
@ -38,7 +38,7 @@ public interface Headers<T> extends Iterable<Map.Entry<T, T>> {
/** /**
* A visitor that helps reduce GC pressure while iterating over a collection of {@link Headers}. * A visitor that helps reduce GC pressure while iterating over a collection of {@link Headers}.
*/ */
public interface NameVisitor<T> { interface NameVisitor<T> {
/** /**
* @return <ul> * @return <ul>
* <li>{@code true} if the processor wants to continue the loop and handle the entry.</li> * <li>{@code true} if the processor wants to continue the loop and handle the entry.</li>
@ -51,40 +51,40 @@ public interface Headers<T> extends Iterable<Map.Entry<T, T>> {
/** /**
* Converts to/from a generic object to the type of the name for this map * Converts to/from a generic object to the type of the name for this map
*/ */
public interface ValueConverter<T> { interface ValueConverter<T> {
T convert(Object value); T convertObject(Object value);
T convert(boolean value); T convertBoolean(boolean value);
boolean convertToBoolean(T value); boolean convertToBoolean(T value);
T convert(byte value); T convertByte(byte value);
byte convertToByte(T value); byte convertToByte(T value);
T convert(char value); T convertChar(char value);
char convertToChar(T value); char convertToChar(T value);
T convert(short value); T convertShort(short value);
short convertToShort(T value); short convertToShort(T value);
T convert(int value); T convertInt(int value);
int convertToInt(T value); int convertToInt(T value);
T convert(long value); T convertLong(long value);
long convertToLong(T value); long convertToLong(T value);
long convertToTimeMillis(T value); long convertToTimeMillis(T value);
T convert(float value); T convertFloat(float value);
float convertToFloat(T value); float convertToFloat(T value);
T convert(double value); T convertDouble(double value);
double convertToDouble(T value); double convertToDouble(T value);
} }
@ -1042,9 +1042,9 @@ public interface Headers<T> extends Iterable<Map.Entry<T, T>> {
Headers<T> set(Headers<T> headers); Headers<T> set(Headers<T> headers);
/** /**
* Retains all current headers but calls {@link #set(AsciiString, Object)} for each entry in {@code headers} * Retains all current headers but calls {@link #set(Object, Object)} for each entry in {@code headers}
* *
* @param headers The headers used to {@link #set(AsciiString, Object)} values in this instance * @param headers The headers used to {@link #set(Object, Object)} values in this instance
* @return {@code this} * @return {@code this}
*/ */
Headers<T> setAll(Headers<T> headers); Headers<T> setAll(Headers<T> headers);

View File

@ -19,7 +19,7 @@ package io.netty.handler.codec;
/** /**
* A typical string multimap used by text protocols such as HTTP for the representation of arbitrary key-value data. One * A typical string multimap used by text protocols such as HTTP for the representation of arbitrary key-value data. One
* thing to note is that it uses {@link CharSequence} as its primary key and value type rather than {@link String}. When * thing to note is that it uses {@link CharSequence} as its primary key and value type rather than {@link String}. When
* you invoke the operations that produce {@link String}s such as {@link #get(CharSequence)}, a {@link CharSequence} is * you invoke the operations that produce {@link String}s such as {@link #get(Object)}, a {@link CharSequence} is
* implicitly converted to a {@link String}. This is particularly useful for speed optimization because this multimap * implicitly converted to a {@link String}. This is particularly useful for speed optimization because this multimap
* can hold a special {@link CharSequence} implementation that a codec can treat specially, such as {@link CharSequence} * can hold a special {@link CharSequence} implementation that a codec can treat specially, such as {@link CharSequence}
* . * .
@ -28,13 +28,13 @@ public interface TextHeaders extends ConvertibleHeaders<CharSequence, String> {
/** /**
* A visitor that helps reduce GC pressure while iterating over a collection of {@link Headers}. * A visitor that helps reduce GC pressure while iterating over a collection of {@link Headers}.
*/ */
public interface EntryVisitor extends Headers.EntryVisitor<CharSequence> { interface EntryVisitor extends Headers.EntryVisitor<CharSequence> {
} }
/** /**
* A visitor that helps reduce GC pressure while iterating over a collection of {@link Headers}. * A visitor that helps reduce GC pressure while iterating over a collection of {@link Headers}.
*/ */
public interface NameVisitor extends Headers.NameVisitor<CharSequence> { interface NameVisitor extends Headers.NameVisitor<CharSequence> {
} }
/** /**