src/java.net.http/share/classes/jdk/internal/net/http/ImmutableHeaders.java
branchhttp-client-branch
changeset 56342 5c2ea761455b
parent 56092 fd85b2bf2b0d
child 56451 9585061fdb04
equal deleted inserted replaced
56341:10fcbe13cd19 56342:5c2ea761455b
    26 package jdk.internal.net.http;
    26 package jdk.internal.net.http;
    27 
    27 
    28 import java.util.ArrayList;
    28 import java.util.ArrayList;
    29 import java.util.List;
    29 import java.util.List;
    30 import java.util.Map;
    30 import java.util.Map;
       
    31 import java.util.Objects;
    31 import java.util.TreeMap;
    32 import java.util.TreeMap;
    32 import java.util.function.BiPredicate;
    33 import java.util.function.BiPredicate;
    33 import java.util.function.Predicate;
    34 import java.util.function.Predicate;
    34 import java.net.http.HttpHeaders;
    35 import java.net.http.HttpHeaders;
       
    36 import jdk.internal.net.http.common.HttpHeadersImpl;
       
    37 import jdk.internal.net.http.common.Utils;
    35 import static java.util.Collections.emptyMap;
    38 import static java.util.Collections.emptyMap;
    36 import static java.util.Collections.unmodifiableList;
    39 import static java.util.Collections.unmodifiableList;
    37 import static java.util.Collections.unmodifiableMap;
    40 import static java.util.Collections.unmodifiableMap;
    38 import static java.util.Objects.requireNonNull;
    41 import static java.util.Objects.requireNonNull;
    39 
    42 
    53         return (headers instanceof ImmutableHeaders)
    56         return (headers instanceof ImmutableHeaders)
    54                 ? (ImmutableHeaders)headers
    57                 ? (ImmutableHeaders)headers
    55                 : of(headers.map());
    58                 : of(headers.map());
    56     }
    59     }
    57 
    60 
       
    61     static ImmutableHeaders validate(HttpHeaders headers) {
       
    62         if (headers instanceof ImmutableHeaders) {
       
    63             return of(headers);
       
    64         }
       
    65         if (headers instanceof HttpHeadersImpl) {
       
    66             return of(headers);
       
    67         }
       
    68         Map<String, List<String>> map = headers.map();
       
    69         return new ImmutableHeaders(map, Utils.VALIDATE_USER_HEADER);
       
    70     }
       
    71 
    58     public static ImmutableHeaders of(Map<String, List<String>> src,
    72     public static ImmutableHeaders of(Map<String, List<String>> src,
    59                                       Predicate<? super String> keyAllowed) {
    73                                       Predicate<? super String> keyAllowed) {
    60         requireNonNull(src, "src");
    74         requireNonNull(src, "src");
    61         requireNonNull(keyAllowed, "keyAllowed");
    75         requireNonNull(keyAllowed, "keyAllowed");
    62         return new ImmutableHeaders(src, headerAllowed(keyAllowed));
    76         return new ImmutableHeaders(src, headerAllowed(keyAllowed));
    71 
    85 
    72     private ImmutableHeaders(Map<String, List<String>> src,
    86     private ImmutableHeaders(Map<String, List<String>> src,
    73                              BiPredicate<? super String, ? super List<String>> headerAllowed) {
    87                              BiPredicate<? super String, ? super List<String>> headerAllowed) {
    74         Map<String, List<String>> m = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
    88         Map<String, List<String>> m = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
    75         src.entrySet().stream()
    89         src.entrySet().stream()
    76                 .filter(e -> headerAllowed.test(e.getKey(), e.getValue()))
    90                 .forEach(e -> addIfAllowed(e, headerAllowed, m));
    77                 .forEach(e ->
       
    78                         {
       
    79                             List<String> values = new ArrayList<>(e.getValue());
       
    80                             m.put(e.getKey(), unmodifiableList(values));
       
    81                         }
       
    82                 );
       
    83         this.map = unmodifiableMap(m);
    91         this.map = unmodifiableMap(m);
       
    92     }
       
    93 
       
    94     private static void addIfAllowed(Map.Entry<String, List<String>> e,
       
    95                                      BiPredicate<? super String, ? super List<String>> headerAllowed,
       
    96                                      Map<String, List<String>> map) {
       
    97         String key = e.getKey();
       
    98         List<String> values = unmodifiableValues(e.getValue());
       
    99         if (headerAllowed.test(key, values)) {
       
   100             map.put(key, values);
       
   101         }
       
   102     }
       
   103 
       
   104     private static List<String> unmodifiableValues(List<String> values) {
       
   105         return unmodifiableList(new ArrayList<>(Objects.requireNonNull(values)));
    84     }
   106     }
    85 
   107 
    86     private static BiPredicate<String, List<String>> headerAllowed(Predicate<? super String> keyAllowed) {
   108     private static BiPredicate<String, List<String>> headerAllowed(Predicate<? super String> keyAllowed) {
    87         return (n,v) -> keyAllowed.test(n);
   109         return (n,v) -> keyAllowed.test(n);
    88     }
   110     }