@Override public Set<Entry<String, List<String>>> entrySet() { return this.headers.entrySet(); }
@Override public Set<Entry<String, List<String>>> entrySet() { return Collections.unmodifiableSet(this.headers.entrySet().stream() .map(AbstractMap.SimpleImmutableEntry::new) .collect(Collectors.toSet())); }
@Override public void addAll(MultiValueMap<K, V> values) { for (Entry<K, List<V>> entry : values.entrySet()) { addAll(entry.getKey(), entry.getValue()); } }
@Override public void addAll(MultiValueMap<K, V> values) { for (Entry<K, List<V>> entry : values.entrySet()) { addAll(entry.getKey(), entry.getValue()); } }
/** * Helps to format HTTP header values, as HTTP header values themselves can * contain comma-separated values, can become confusing with regular * {@link Map} formatting that also uses commas between entries. * @param headers the headers to format * @return the headers to a String * @since 5.1.4 */ public static String formatHeaders(MultiValueMap<String, String> headers) { return headers.entrySet().stream() .map(entry -> { List<String> values = entry.getValue(); return entry.getKey() + ":" + (values.size() == 1 ? "\"" + values.get(0) + "\"" : values.stream().map(s -> "\"" + s + "\"").collect(Collectors.joining(", "))); }) .collect(Collectors.joining(", ", "[", "]")); }
private static <K,V> void copy(MultiValueMap<K,V> src, MultiValueMap<K,V> dst) { if (!src.isEmpty()) { src.entrySet().stream() .filter(entry -> !dst.containsKey(entry.getKey())) .forEach(entry -> dst.put(entry.getKey(), entry.getValue())); } } }
private void writeParts(OutputStream os, MultiValueMap<String, Object> parts, byte[] boundary) throws IOException { for (Map.Entry<String, List<Object>> entry : parts.entrySet()) { String name = entry.getKey(); for (Object part : entry.getValue()) { if (part != null) { writeBoundary(os, boundary); writePart(name, getHttpEntity(part), os); writeNewLine(os); } } } }
static Map<String, List<String>> allImports() { return TestImportGroup.imports.entrySet() .stream() .collect(Collectors.toMap((entry) -> entry.getKey().getClassName(), Map.Entry::getValue)); } private final List<Entry> instanceImports = new ArrayList<>();
@RequestMapping("/multiValueMap") public void multiValueMap(@RequestParam MultiValueMap<String, String> params, Writer writer) throws IOException { for (Iterator<Map.Entry<String, List<String>>> it1 = params.entrySet().iterator(); it1.hasNext();) { Map.Entry<String, List<String>> entry = it1.next(); writer.write(entry.getKey() + "=["); for (Iterator<String> it2 = entry.getValue().iterator(); it2.hasNext();) { String value = it2.next(); writer.write(value); if (it2.hasNext()) { writer.write(','); } } writer.write(']'); if (it1.hasNext()) { writer.write(','); } } } }
@RequestMapping("/multiValueMap") public void multiValueMap(@RequestHeader MultiValueMap<String, String> headers, Writer writer) throws IOException { for (Iterator<Map.Entry<String, List<String>>> it1 = headers.entrySet().iterator(); it1.hasNext();) { Map.Entry<String, List<String>> entry = it1.next(); writer.write(entry.getKey() + "=["); for (Iterator<String> it2 = entry.getValue().iterator(); it2.hasNext();) { String value = it2.next(); writer.write(value); if (it2.hasNext()) { writer.write(','); } } writer.write(']'); if (it1.hasNext()) { writer.write(','); } } }
public void assertTotalEventsCount(int number) { int size = 0; for (Map.Entry<String, List<Object>> entry : this.events.entrySet()) { size += entry.getValue().size(); } assertEquals("Wrong number of total events (" + this.events.size() + ") " + "registered phase(s)", number, size); } }
/** * Assert the number of events received by this instance. Checks that * unexpected events have not been received. If an event is handled by * several listeners, each instance will be registered. */ public void assertTotalEventsCount(int number) { int actual = 0; for (Map.Entry<String, List<Object>> entry : this.content.entrySet()) { actual += entry.getValue().size(); } assertEquals("Wrong number of total events (" + this.content.size() + ") registered listener(s)", number, actual); }
private Mono<Void> writeMultipart( MultiValueMap<String, ?> map, ReactiveHttpOutputMessage outputMessage, Map<String, Object> hints) { byte[] boundary = generateMultipartBoundary(); Map<String, String> params = new HashMap<>(2); params.put("boundary", new String(boundary, StandardCharsets.US_ASCII)); params.put("charset", getCharset().name()); outputMessage.getHeaders().setContentType(new MediaType(MediaType.MULTIPART_FORM_DATA, params)); LogFormatUtils.traceDebug(logger, traceOn -> Hints.getLogPrefix(hints) + "Encoding " + (isEnableLoggingRequestDetails() ? LogFormatUtils.formatValue(map, !traceOn) : "parts " + map.keySet() + " (content masked)")); Flux<DataBuffer> body = Flux.fromIterable(map.entrySet()) .concatMap(entry -> encodePartValues(boundary, entry.getKey(), entry.getValue())) .concatWith(Mono.just(generateLastLine(boundary))); return outputMessage.writeWith(body); }
@Test public void minimalRegistration() { WebMvcStompWebSocketEndpointRegistration registration = new WebMvcStompWebSocketEndpointRegistration(new String[] {"/foo"}, this.handler, this.scheduler); MultiValueMap<HttpRequestHandler, String> mappings = registration.getMappings(); assertEquals(1, mappings.size()); Map.Entry<HttpRequestHandler, List<String>> entry = mappings.entrySet().iterator().next(); assertNotNull(((WebSocketHttpRequestHandler) entry.getKey()).getWebSocketHandler()); assertEquals(1, ((WebSocketHttpRequestHandler) entry.getKey()).getHandshakeInterceptors().size()); assertEquals(Arrays.asList("/foo"), entry.getValue()); }
@Test public void sameOrigin() { WebMvcStompWebSocketEndpointRegistration registration = new WebMvcStompWebSocketEndpointRegistration( new String[] {"/foo"}, this.handler, this.scheduler); registration.setAllowedOrigins(); MultiValueMap<HttpRequestHandler, String> mappings = registration.getMappings(); assertEquals(1, mappings.size()); HttpRequestHandler handler = mappings.entrySet().iterator().next().getKey(); WebSocketHttpRequestHandler wsHandler = (WebSocketHttpRequestHandler) handler; assertNotNull(wsHandler.getWebSocketHandler()); assertEquals(1, wsHandler.getHandshakeInterceptors().size()); assertEquals(OriginHandshakeInterceptor.class, wsHandler.getHandshakeInterceptors().get(0).getClass()); }
@Test public void allowedOrigins() { WebMvcStompWebSocketEndpointRegistration registration = new WebMvcStompWebSocketEndpointRegistration(new String[] {"/foo"}, this.handler, this.scheduler); registration.setAllowedOrigins(); MultiValueMap<HttpRequestHandler, String> mappings = registration.getMappings(); assertEquals(1, mappings.size()); HttpRequestHandler handler = mappings.entrySet().iterator().next().getKey(); WebSocketHttpRequestHandler wsHandler = (WebSocketHttpRequestHandler) handler; assertNotNull(wsHandler.getWebSocketHandler()); assertEquals(1, wsHandler.getHandshakeInterceptors().size()); assertEquals(OriginHandshakeInterceptor.class, wsHandler.getHandshakeInterceptors().get(0).getClass()); }
@Test // SPR-12283 public void disableCorsWithSockJsService() { WebMvcStompWebSocketEndpointRegistration registration = new WebMvcStompWebSocketEndpointRegistration(new String[] {"/foo"}, this.handler, this.scheduler); registration.withSockJS().setSupressCors(true); MultiValueMap<HttpRequestHandler, String> mappings = registration.getMappings(); assertEquals(1, mappings.size()); SockJsHttpRequestHandler requestHandler = (SockJsHttpRequestHandler)mappings.entrySet().iterator().next().getKey(); assertNotNull(requestHandler.getSockJsService()); DefaultSockJsService sockJsService = (DefaultSockJsService)requestHandler.getSockJsService(); assertTrue(sockJsService.shouldSuppressCors()); }
@Test // SPR-12665 public void findSubscriptionsReturnsMapSafeToIterate() throws Exception { this.registry.registerSubscription(subscribeMessage("sess1", "1", "/foo")); this.registry.registerSubscription(subscribeMessage("sess2", "1", "/foo")); MultiValueMap<String, String> subscriptions = this.registry.findSubscriptions(createMessage("/foo")); assertNotNull(subscriptions); assertEquals(2, subscriptions.size()); Iterator<Map.Entry<String, List<String>>> iterator = subscriptions.entrySet().iterator(); iterator.next(); this.registry.registerSubscription(subscribeMessage("sess3", "1", "/foo")); iterator.next(); // no ConcurrentModificationException }
@Test public void handshakeHandlerAndInterceptor() { WebMvcStompWebSocketEndpointRegistration registration = new WebMvcStompWebSocketEndpointRegistration(new String[] {"/foo"}, this.handler, this.scheduler); DefaultHandshakeHandler handshakeHandler = new DefaultHandshakeHandler(); HttpSessionHandshakeInterceptor interceptor = new HttpSessionHandshakeInterceptor(); registration.setHandshakeHandler(handshakeHandler).addInterceptors(interceptor); MultiValueMap<HttpRequestHandler, String> mappings = registration.getMappings(); assertEquals(1, mappings.size()); Map.Entry<HttpRequestHandler, List<String>> entry = mappings.entrySet().iterator().next(); assertEquals(Arrays.asList("/foo"), entry.getValue()); WebSocketHttpRequestHandler requestHandler = (WebSocketHttpRequestHandler) entry.getKey(); assertNotNull(requestHandler.getWebSocketHandler()); assertSame(handshakeHandler, requestHandler.getHandshakeHandler()); assertEquals(2, requestHandler.getHandshakeInterceptors().size()); assertEquals(interceptor, requestHandler.getHandshakeInterceptors().get(0)); assertEquals(OriginHandshakeInterceptor.class, requestHandler.getHandshakeInterceptors().get(1).getClass()); }
@Test public void handshakeHandlerAndInterceptorWithAllowedOrigins() { WebMvcStompWebSocketEndpointRegistration registration = new WebMvcStompWebSocketEndpointRegistration(new String[] {"/foo"}, this.handler, this.scheduler); DefaultHandshakeHandler handshakeHandler = new DefaultHandshakeHandler(); HttpSessionHandshakeInterceptor interceptor = new HttpSessionHandshakeInterceptor(); String origin = "http://mydomain.com"; registration.setHandshakeHandler(handshakeHandler).addInterceptors(interceptor).setAllowedOrigins(origin); MultiValueMap<HttpRequestHandler, String> mappings = registration.getMappings(); assertEquals(1, mappings.size()); Map.Entry<HttpRequestHandler, List<String>> entry = mappings.entrySet().iterator().next(); assertEquals(Arrays.asList("/foo"), entry.getValue()); WebSocketHttpRequestHandler requestHandler = (WebSocketHttpRequestHandler) entry.getKey(); assertNotNull(requestHandler.getWebSocketHandler()); assertSame(handshakeHandler, requestHandler.getHandshakeHandler()); assertEquals(2, requestHandler.getHandshakeInterceptors().size()); assertEquals(interceptor, requestHandler.getHandshakeInterceptors().get(0)); assertEquals(OriginHandshakeInterceptor.class, requestHandler.getHandshakeInterceptors().get(1).getClass()); }