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 } |