src/java.net.http/share/classes/java/net/http/HttpHeaders.java
branchhttp-client-branch
changeset 56089 42208b2f224e
parent 56087 e73e506a1969
child 56099 41ba54ac9403
equal deleted inserted replaced
56088:38fac6d0521d 56089:42208b2f224e
       
     1 /*
       
     2  * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.  Oracle designates this
       
     8  * particular file as subject to the "Classpath" exception as provided
       
     9  * by Oracle in the LICENSE file that accompanied this code.
       
    10  *
       
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    14  * version 2 for more details (a copy is included in the LICENSE file that
       
    15  * accompanied this code).
       
    16  *
       
    17  * You should have received a copy of the GNU General Public License version
       
    18  * 2 along with this work; if not, write to the Free Software Foundation,
       
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    20  *
       
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    22  * or visit www.oracle.com if you need additional information or have any
       
    23  * questions.
       
    24  */
       
    25 
       
    26 package java.net.http;
       
    27 
       
    28 import java.util.List;
       
    29 import java.util.Map;
       
    30 import java.util.Optional;
       
    31 import java.util.OptionalLong;
       
    32 import static java.util.Collections.emptyList;
       
    33 import static java.util.Collections.unmodifiableList;
       
    34 import static java.util.Objects.requireNonNull;
       
    35 
       
    36 /**
       
    37  * A read-only view of a set of HTTP headers.
       
    38  *
       
    39  * <p> The methods of this class ( that accept a String header name ), and the
       
    40  * Map returned by the {@linkplain #map() map} method, operate without regard to
       
    41  * case when retrieving the header value.
       
    42  *
       
    43  * <p> HttpHeaders instances are immutable.
       
    44  *
       
    45  * @since 11
       
    46  */
       
    47 public abstract class HttpHeaders {
       
    48 
       
    49     /**
       
    50      * Creates an HttpHeaders.
       
    51      */
       
    52     protected HttpHeaders() {}
       
    53 
       
    54     /**
       
    55      * Returns an {@link Optional} containing the first value of the given named
       
    56      * (and possibly multi-valued) header. If the header is not present, then
       
    57      * the returned {@code Optional} is empty.
       
    58      *
       
    59      * @implSpec
       
    60      * The default implementation invokes
       
    61      * {@code allValues(name).stream().findFirst()}
       
    62      *
       
    63      * @param name the header name
       
    64      * @return an {@code Optional<String>} for the first named value
       
    65      */
       
    66     public Optional<String> firstValue(String name) {
       
    67         return allValues(name).stream().findFirst();
       
    68     }
       
    69 
       
    70     /**
       
    71      * Returns an {@link OptionalLong} containing the first value of the
       
    72      * named header field. If the header is not present, then the Optional is
       
    73      * empty. If the header is present but contains a value that does not parse
       
    74      * as a {@code Long} value, then an exception is thrown.
       
    75      *
       
    76      * @implSpec
       
    77      * The default implementation invokes
       
    78      * {@code allValues(name).stream().mapToLong(Long::valueOf).findFirst()}
       
    79      *
       
    80      * @param name the header name
       
    81      * @return  an {@code OptionalLong}
       
    82      * @throws NumberFormatException if a value is found, but does not parse as
       
    83      *                               a Long
       
    84      */
       
    85     public OptionalLong firstValueAsLong(String name) {
       
    86         return allValues(name).stream().mapToLong(Long::valueOf).findFirst();
       
    87     }
       
    88 
       
    89     /**
       
    90      * Returns an unmodifiable List of all of the values of the given named
       
    91      * header. Always returns a List, which may be empty if the header is not
       
    92      * present.
       
    93      *
       
    94      * @implSpec
       
    95      * The default implementation invokes, among other things, the
       
    96      * {@code map().get(name)} to retrieve the list of header values.
       
    97      *
       
    98      * @param name the header name
       
    99      * @return a List of String values
       
   100      */
       
   101     public List<String> allValues(String name) {
       
   102         requireNonNull(name);
       
   103         List<String> values = map().get(name);
       
   104         // Making unmodifiable list out of empty in order to make a list which
       
   105         // throws UOE unconditionally
       
   106         return values != null ? values : unmodifiableList(emptyList());
       
   107     }
       
   108 
       
   109     /**
       
   110      * Returns an unmodifiable multi Map view of this HttpHeaders.
       
   111      *
       
   112      * @return the Map
       
   113      */
       
   114     public abstract Map<String, List<String>> map();
       
   115 
       
   116     /**
       
   117      * Tests this HTTP headers instance for equality with the given object.
       
   118      *
       
   119      * <p> If the given object is not an {@code HttpHeaders} then this
       
   120      * method returns {@code false}. Two HTTP headers are equal if each
       
   121      * of their corresponding {@linkplain #map() maps} are equal.
       
   122      *
       
   123      * <p> This method satisfies the general contract of the {@link
       
   124      * Object#equals(Object) Object.equals} method.
       
   125      *
       
   126      * @param obj the object to which this object is to be compared
       
   127      * @return {@code true} if, and only if, the given object is an {@code
       
   128      *         HttpHeaders} that is equal to this HTTP headers
       
   129      */
       
   130     public final boolean equals(Object obj) {
       
   131         if (!(obj instanceof HttpHeaders))
       
   132             return false;
       
   133         HttpHeaders that = (HttpHeaders)obj;
       
   134         return this.map().equals(that.map());
       
   135     }
       
   136 
       
   137     /**
       
   138      * Computes a hash code for this HTTP headers instance.
       
   139      *
       
   140      * <p> The hash code is based upon the components of the HTTP headers
       
   141      * {@linkplain #map() map}, and satisfies the general contract of the
       
   142      * {@link Object#hashCode Object.hashCode} method.
       
   143      *
       
   144      * @return the hash-code value for this HTTP headers
       
   145      */
       
   146     public final int hashCode() {
       
   147         return map().hashCode();
       
   148     }
       
   149 
       
   150     /**
       
   151      * Returns this HTTP headers as a string.
       
   152      *
       
   153      * @return a string describing the HTTP headers
       
   154      */
       
   155     @Override
       
   156     public String toString() {
       
   157         StringBuilder sb = new StringBuilder();
       
   158         sb.append(super.toString()).append(" { ");
       
   159         sb.append(map());
       
   160         sb.append(" }");
       
   161         return sb.toString();
       
   162     }
       
   163 }