diff --git a/codec/src/main/java/io/netty/handler/codec/DefaultTextHeaders.java b/codec/src/main/java/io/netty/handler/codec/DefaultTextHeaders.java index 64fa6010bc..450fac31e3 100644 --- a/codec/src/main/java/io/netty/handler/codec/DefaultTextHeaders.java +++ b/codec/src/main/java/io/netty/handler/codec/DefaultTextHeaders.java @@ -377,16 +377,20 @@ public class DefaultTextHeaders implements TextHeaders { } @Override - public int getInt(CharSequence name) { + public Integer getInt(CharSequence name) { CharSequence v = getUnconverted(name); if (v == null) { - throw new NoSuchElementException(String.valueOf(name)); + return null; } - if (v instanceof AsciiString) { - return ((AsciiString) v).parseInt(); - } else { - return Integer.parseInt(v.toString()); + try { + if (v instanceof AsciiString) { + return ((AsciiString) v).parseInt(); + } else { + return Integer.parseInt(v.toString()); + } + } catch (NumberFormatException ignored) { + return null; } } @@ -409,16 +413,20 @@ public class DefaultTextHeaders implements TextHeaders { } @Override - public long getLong(CharSequence name) { + public Long getLong(CharSequence name) { CharSequence v = getUnconverted(name); if (v == null) { - throw new NoSuchElementException(String.valueOf(name)); + return null; } - if (v instanceof AsciiString) { - return ((AsciiString) v).parseLong(); - } else { - return Long.parseLong(v.toString()); + try { + if (v instanceof AsciiString) { + return ((AsciiString) v).parseLong(); + } else { + return Long.parseLong(v.toString()); + } + } catch (NumberFormatException ignored) { + return null; } } @@ -441,13 +449,17 @@ public class DefaultTextHeaders implements TextHeaders { } @Override - public long getTimeMillis(CharSequence name) { + public Long getTimeMillis(CharSequence name) { CharSequence v = getUnconverted(name); if (v == null) { - throw new NoSuchElementException(String.valueOf(name)); + return null; } - return HttpHeaderDateFormat.get().parse(v.toString()); + try { + return HttpHeaderDateFormat.get().parse(v.toString()); + } catch (ParseException ignored) { + return null; + } } @Override @@ -529,16 +541,20 @@ public class DefaultTextHeaders implements TextHeaders { } @Override - public int getIntAndRemove(CharSequence name) { + public Integer getIntAndRemove(CharSequence name) { CharSequence v = getUnconvertedAndRemove(name); if (v == null) { - throw new NoSuchElementException(String.valueOf(name)); + return null; } - if (v instanceof AsciiString) { - return ((AsciiString) v).parseInt(); - } else { - return Integer.parseInt(v.toString()); + try { + if (v instanceof AsciiString) { + return ((AsciiString) v).parseInt(); + } else { + return Integer.parseInt(v.toString()); + } + } catch (NumberFormatException ignored) { + return null; } } @@ -561,16 +577,20 @@ public class DefaultTextHeaders implements TextHeaders { } @Override - public long getLongAndRemove(CharSequence name) { + public Long getLongAndRemove(CharSequence name) { CharSequence v = getUnconvertedAndRemove(name); if (v == null) { - throw new NoSuchElementException(String.valueOf(name)); + return null; } - if (v instanceof AsciiString) { - return ((AsciiString) v).parseLong(); - } else { - return Long.parseLong(v.toString()); + try { + if (v instanceof AsciiString) { + return ((AsciiString) v).parseLong(); + } else { + return Long.parseLong(v.toString()); + } + } catch (NumberFormatException ignored) { + return null; } } @@ -593,13 +613,17 @@ public class DefaultTextHeaders implements TextHeaders { } @Override - public long getTimeMillisAndRemove(CharSequence name) { + public Long getTimeMillisAndRemove(CharSequence name) { CharSequence v = getUnconvertedAndRemove(name); if (v == null) { - throw new NoSuchElementException(String.valueOf(name)); + return null; } - return HttpHeaderDateFormat.get().parse(v.toString()); + try { + return HttpHeaderDateFormat.get().parse(v.toString()); + } catch (ParseException ignored) { + return null; + } } @Override @@ -1074,7 +1098,7 @@ public class DefaultTextHeaders implements TextHeaders { dateFormat3.setTimeZone(tz); } - long parse(String text) { + long parse(String text) throws ParseException { Date date = dateFormat1.parse(text, parsePos); if (date == null) { date = dateFormat2.parse(text, parsePos); @@ -1083,7 +1107,7 @@ public class DefaultTextHeaders implements TextHeaders { date = dateFormat3.parse(text, parsePos); } if (date == null) { - PlatformDependent.throwException(new ParseException(text, 0)); + throw new ParseException(text, 0); } return date.getTime(); } diff --git a/codec/src/main/java/io/netty/handler/codec/EmptyTextHeaders.java b/codec/src/main/java/io/netty/handler/codec/EmptyTextHeaders.java index b0249083d0..307f85415c 100644 --- a/codec/src/main/java/io/netty/handler/codec/EmptyTextHeaders.java +++ b/codec/src/main/java/io/netty/handler/codec/EmptyTextHeaders.java @@ -20,7 +20,6 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map.Entry; -import java.util.NoSuchElementException; import java.util.Set; public class EmptyTextHeaders implements TextHeaders { @@ -38,8 +37,8 @@ public class EmptyTextHeaders implements TextHeaders { } @Override - public int getInt(CharSequence name) { - throw new NoSuchElementException(String.valueOf(name)); + public Integer getInt(CharSequence name) { + return null; } @Override @@ -48,8 +47,8 @@ public class EmptyTextHeaders implements TextHeaders { } @Override - public long getLong(CharSequence name) { - throw new NoSuchElementException(String.valueOf(name)); + public Long getLong(CharSequence name) { + return null; } @Override @@ -58,8 +57,8 @@ public class EmptyTextHeaders implements TextHeaders { } @Override - public long getTimeMillis(CharSequence name) { - throw new NoSuchElementException(String.valueOf(name)); + public Long getTimeMillis(CharSequence name) { + return null; } @Override @@ -78,8 +77,8 @@ public class EmptyTextHeaders implements TextHeaders { } @Override - public int getIntAndRemove(CharSequence name) { - throw new NoSuchElementException(String.valueOf(name)); + public Integer getIntAndRemove(CharSequence name) { + return null; } @Override @@ -88,8 +87,8 @@ public class EmptyTextHeaders implements TextHeaders { } @Override - public long getLongAndRemove(CharSequence name) { - throw new NoSuchElementException(String.valueOf(name)); + public Long getLongAndRemove(CharSequence name) { + return null; } @Override @@ -98,8 +97,8 @@ public class EmptyTextHeaders implements TextHeaders { } @Override - public long getTimeMillisAndRemove(CharSequence name) { - throw new NoSuchElementException(String.valueOf(name)); + public Long getTimeMillisAndRemove(CharSequence name) { + return null; } @Override diff --git a/codec/src/main/java/io/netty/handler/codec/TextHeaders.java b/codec/src/main/java/io/netty/handler/codec/TextHeaders.java index 97d9740f5e..06d9f3d212 100644 --- a/codec/src/main/java/io/netty/handler/codec/TextHeaders.java +++ b/codec/src/main/java/io/netty/handler/codec/TextHeaders.java @@ -35,104 +35,165 @@ public interface TextHeaders extends Iterable> { * Returns the value of a header with the specified name. If there are * more than one values for the specified name, the first value is returned. * - * @param name The name of the header to search - * @return The first header value or {@code null} if there is no such header + * @param name the name of the header to search + * @return the first header value if the header is found. + * {@code null} if there's no such header. */ String get(CharSequence name); + /** + * Returns the value of a header with the specified name. If there are + * more than one values for the specified name, the first value is returned. + * + * @param name the name of the header to search + * @param defaultValue the default value + * @return the first header value if the header is found. + * {@code defaultValue} if there's no such header. + */ String get(CharSequence name, String defaultValue); - int getInt(CharSequence name); - int getInt(CharSequence name, int defaultValue); - long getLong(CharSequence name); - long getLong(CharSequence name, long defaultValue); - long getTimeMillis(CharSequence name); - long getTimeMillis(CharSequence name, long defaultValue); /** - * Returns and Removes the value of a header with the specified name. If there are + * Returns the integer value of a header with the specified name. If there are + * more than one values for the specified name, the first value is returned. + * + * @param name the name of the header to search + * @return the first header value if the header is found and its value is an integer. + * {@code null} if there's no such header or its value is not an integer. + */ + Integer getInt(CharSequence name); + + /** + * Returns the integer value of a header with the specified name. If there are + * more than one values for the specified name, the first value is returned. + * + * @param name the name of the header to search + * @param defaultValue the default value + * @return the first header value if the header is found and its value is an integer. + * {@code defaultValue} if there's no such header or its value is not an integer. + */ + int getInt(CharSequence name, int defaultValue); + + /** + * Returns the long integer value of a header with the specified name. If there are + * more than one values for the specified name, the first value is returned. + * + * @param name the name of the header to search + * @return the first header value if the header is found and its value is a long integer. + * {@code null} if there's no such header or its value is not a long integer. + */ + Long getLong(CharSequence name); + + /** + * Returns the long integer value of a header with the specified name. If there are + * more than one values for the specified name, the first value is returned. + * + * @param name the name of the header to search + * @param defaultValue the default value + * @return the first header value if the header is found and its value is a long integer. + * {@code defaultValue} if there's no such header or its value is not a long integer. + */ + long getLong(CharSequence name, long defaultValue); + + /** + * Returns the date value of a header with the specified name as milliseconds. If there are * more than one values for the specified name, the first value is returned. * * @param name The name of the header to search - * @return The first header value or {@code null} if there is no such header + * @return the first header value in milliseconds if the header is found and its value is a date. + * {@code null} if there's no such header or its value is not a date. + */ + Long getTimeMillis(CharSequence name); + + /** + * Returns the date value of a header with the specified name as milliseconds. If there are + * more than one values for the specified name, the first value is returned. + * + * @param name The name of the header to search + * @param defaultValue default value + * @return the first header value in milliseconds if the header is found and its value is a date. + * {@code defaultValue} if there's no such header or its value is not a date. + */ + long getTimeMillis(CharSequence name, long defaultValue); + + /** + * Returns and removes the value of a header with the specified name. If there are + * more than one values for the specified name, the first value is returned. + * + * @param name the name of the header to search + * @return the first header value or {@code null} if there is no such header */ String getAndRemove(CharSequence name); /** - * Returns and Removes the value of a header with the specified name. If there are + * Returns and removes the value of a header with the specified name. If there are * more than one values for the specified name, the first value is returned. * - * @param name The name of the header to search - * @param defaultValue default value - * @return The first header value or {@code defaultValue} if there is no such header + * @param name the name of the header to search + * @param defaultValue the default value + * @return the first header value or {@code defaultValue} if there is no such header */ String getAndRemove(CharSequence name, String defaultValue); /** - * Returns and Removes the integer value of a header with the specified name. If there are + * Returns and removes the integer value of a header with the specified name. If there are * more than one values for the specified name, the first value is returned. * - * @param name The name of the header to search - * @return The first header value - * @throws java.util.NoSuchElementException - * if no such header - * @throws NumberFormatException - * if the value of header is not number + * @param name the name of the header to search + * @return the first header value if the header is found and its value is an integer. + * {@code null} if there's no such header or its value is not an integer. */ - int getIntAndRemove(CharSequence name); + Integer getIntAndRemove(CharSequence name); /** - * Returns and Removes the integer value of a header with the specified name. If there are more than one values for + * Returns and removes the integer value of a header with the specified name. If there are more than one values for * the specified name, the first value is returned. * - * @param name The name of the header to search - * @param defaultValue default value - * @return The first header value or {@code defaultValue} if there is no such header or the value of header is not - * number + * @param name the name of the header to search + * @param defaultValue the default value + * @return the first header value if the header is found and its value is an integer. + * {@code defaultValue} if there is no such header or its value of header is not an integer. */ int getIntAndRemove(CharSequence name, int defaultValue); /** - * Returns and Removes the long value of a header with the specified name. If there are + * Returns and removes the long value of a header with the specified name. If there are * more than one values for the specified name, the first value is returned. * - * @param name The name of the header to search - * @return The first header value - * @throws java.util.NoSuchElementException - * if no such header - * @throws NumberFormatException - * if the value of header is not number + * @param name the name of the header to search + * @return the first header value if the header is found and its value is an integer. + * {@code null} if there's no such header or its value is not an integer. */ - long getLongAndRemove(CharSequence name); + Long getLongAndRemove(CharSequence name); /** - * Returns and Removes the long value of a header with the specified name. If there are more than one values for + * Returns and removes the long value of a header with the specified name. If there are more than one values for * the specified name, the first value is returned. * - * @param name The name of the header to search - * @param defaultValue default value - * @return The first header value or {@code defaultValue} if there is no such header or the value of header is not - * number + * @param name the name of the header to search + * @param defaultValue the default value + * @return the first header value if the header is found and its value is an integer. + * {@code defaultValue} if there's no such header or its value is not an integer. */ long getLongAndRemove(CharSequence name, long defaultValue); /** - * Returns and Removes the millisecond value of a header with the specified name. If there are + * Returns and removes the date value of a header with the specified name as milliseconds. If there are * more than one values for the specified name, the first value is returned. * * @param name The name of the header to search - * @return The first header value - * @throws java.util.NoSuchElementException - * if no such header + * @return the first header value in milliseconds if the header is found and its value is a date. + * {@code null} if there's no such header or its value is not a date. */ - long getTimeMillisAndRemove(CharSequence name); + Long getTimeMillisAndRemove(CharSequence name); /** - * Returns and Removes the millisecond value of a header with the specified name. If there are more than one values - * for the specified name, the first value is returned. + * Returns and removes the date value of a header with the specified name as milliseconds. If there are + * more than one values for the specified name, the first value is returned. * * @param name The name of the header to search * @param defaultValue default value - * @return The first header value or {@code defaultValue} if there is no such header + * @return the first header value in milliseconds if the header is found and its value is a date. + * {@code defaultValue} if there's no such header or its value is not a date. */ long getTimeMillisAndRemove(CharSequence name, long defaultValue); @@ -201,17 +262,20 @@ public interface TextHeaders extends Iterable> { List> unconvertedEntries(); /** - * Checks to see if there is a header with the specified name + * Returns {@code true} if and only if this collection contains the header with the specified name. * * @param name The name of the header to search for - * @return True if at least one header is found + * @return {@code true} if at least one header is found */ boolean contains(CharSequence name); + /** + * Returns the number of header entries in this collection. + */ int size(); /** - * Checks if no header exists. + * Returns {@code true} if and only if this collection contains no header entries. */ boolean isEmpty(); @@ -237,8 +301,8 @@ public interface TextHeaders extends Iterable> { * of {@link java.util.Date} and {@link java.util.Calendar}, which are formatted to the date * format defined in RFC2616. * - * @param name The name of the header being added - * @param value The value of the header being added + * @param name the name of the header being added + * @param value the value of the header being added * * @return {@code this} */ @@ -257,12 +321,29 @@ public interface TextHeaders extends Iterable> { * } * * - * @param name The name of the headepublic abstract rs being set - * @param values The values of the headers being set + * @param name the name of the headepublic abstract rs being set + * @param values the values of the headers being set * @return {@code this} */ TextHeaders add(CharSequence name, Iterable values); + /** + * Adds a new header with the specified name and values. + * + * This getMethod can be represented approximately as the following code: + *
+     * for (Object v: values) {
+     *     if (v == null) {
+     *         break;
+     *     }
+     *     headers.add(name, v);
+     * }
+     * 
+ * + * @param name the name of the headepublic abstract rs being set + * @param values the values of the headers being set + * @return {@code this} + */ TextHeaders add(CharSequence name, Object... values); /** @@ -302,12 +383,31 @@ public interface TextHeaders extends Iterable> { * } * * - * @param name The name of the headers being set - * @param values The values of the headers being set + * @param name the name of the headers being set + * @param values the values of the headers being set * @return {@code this} */ TextHeaders set(CharSequence name, Iterable values); + /** + * Sets a header with the specified name and values. + * + * If there is an existing header with the same name, it is removed. + * This getMethod can be represented approximately as the following code: + *
+     * headers.remove(name);
+     * for (Object v: values) {
+     *     if (v == null) {
+     *         break;
+     *     }
+     *     headers.add(name, v);
+     * }
+     * 
+ * + * @param name the name of the headers being set + * @param values the values of the headers being set + * @return {@code this} + */ TextHeaders set(CharSequence name, Object... values); /** @@ -335,12 +435,19 @@ public interface TextHeaders extends Iterable> { /** * Returns {@code true} if a header with the name and value exists. * - * @param name the headername - * @param value the value + * @param name the header name + * @param value the header value * @return {@code true} if it contains it {@code false} otherwise */ boolean contains(CharSequence name, Object value); + /** + * Returns {@code true} if a header with the name and value exists. + * + * @param name the header name + * @param value the header value + * @return {@code true} if it contains it {@code false} otherwise + */ boolean contains(CharSequence name, Object value, boolean ignoreCase); @Override