Jakarta EE 9 migration
Upgrades many dependency declarations; removes old EJB 2.x support and outdated Servlet-based integrations (Commons FileUpload, FreeMarker JSP support, Tiles). Closes gh-22093 Closes gh-25354 Closes gh-26185 Closes gh-27423 See gh-27424
This commit is contained in:
@@ -180,9 +180,8 @@ public class MultipartHttpMessageWriterTests extends AbstractLeakCheckingTests {
|
||||
assertThat(value).isEqualTo("AaBbCc");
|
||||
}
|
||||
|
||||
@Test // gh-24582
|
||||
@Test // gh-24582
|
||||
public void writeMultipartRelated() {
|
||||
|
||||
MediaType mediaType = MediaType.parseMediaType("multipart/related;type=foo");
|
||||
|
||||
MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder();
|
||||
@@ -297,9 +296,9 @@ public class MultipartHttpMessageWriterTests extends AbstractLeakCheckingTests {
|
||||
MediaType contentType = response.getHeaders().getContentType();
|
||||
assertThat(contentType.getParameter("boundary")).as("No boundary found").isNotNull();
|
||||
|
||||
// see if Synchronoss NIO Multipart can read what we wrote
|
||||
SynchronossPartHttpMessageReader synchronossReader = new SynchronossPartHttpMessageReader();
|
||||
MultipartHttpMessageReader reader = new MultipartHttpMessageReader(synchronossReader);
|
||||
// see if we can read what we wrote
|
||||
DefaultPartHttpMessageReader partReader = new DefaultPartHttpMessageReader();
|
||||
MultipartHttpMessageReader reader = new MultipartHttpMessageReader(partReader);
|
||||
|
||||
MockServerHttpRequest request = MockServerHttpRequest.post("/")
|
||||
.contentType(MediaType.parseMediaType(contentType.toString()))
|
||||
|
||||
@@ -1,237 +0,0 @@
|
||||
/*
|
||||
* Copyright 2002-2021 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.http.codec.multipart;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.channels.ReadableByteChannel;
|
||||
import java.time.Duration;
|
||||
import java.util.Map;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.reactivestreams.Subscription;
|
||||
import reactor.core.publisher.BaseSubscriber;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
import reactor.test.StepVerifier;
|
||||
|
||||
import org.springframework.core.ResolvableType;
|
||||
import org.springframework.core.codec.DecodingException;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.core.io.buffer.DataBuffer;
|
||||
import org.springframework.core.io.buffer.DataBufferUtils;
|
||||
import org.springframework.core.testfixture.io.buffer.AbstractLeakCheckingTests;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.client.MultipartBodyBuilder;
|
||||
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||
import org.springframework.util.MultiValueMap;
|
||||
import org.springframework.web.testfixture.http.client.reactive.MockClientHttpRequest;
|
||||
import org.springframework.web.testfixture.http.server.reactive.MockServerHttpRequest;
|
||||
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
import static java.util.Collections.emptyMap;
|
||||
import static java.util.Collections.singletonMap;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.springframework.core.ResolvableType.forClassWithGenerics;
|
||||
import static org.springframework.http.HttpHeaders.CONTENT_TYPE;
|
||||
import static org.springframework.http.MediaType.MULTIPART_FORM_DATA;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link SynchronossPartHttpMessageReader}.
|
||||
*
|
||||
* @author Sebastien Deleuze
|
||||
* @author Rossen Stoyanchev
|
||||
* @author Brian Clozel
|
||||
*/
|
||||
public class SynchronossPartHttpMessageReaderTests extends AbstractLeakCheckingTests {
|
||||
|
||||
private final MultipartHttpMessageReader reader =
|
||||
new MultipartHttpMessageReader(new SynchronossPartHttpMessageReader());
|
||||
|
||||
private static final ResolvableType PARTS_ELEMENT_TYPE =
|
||||
forClassWithGenerics(MultiValueMap.class, String.class, Part.class);
|
||||
|
||||
|
||||
@Test
|
||||
void canRead() {
|
||||
assertThat(this.reader.canRead(PARTS_ELEMENT_TYPE, MediaType.MULTIPART_FORM_DATA)).isTrue();
|
||||
assertThat(this.reader.canRead(PARTS_ELEMENT_TYPE, MediaType.MULTIPART_MIXED)).isTrue();
|
||||
assertThat(this.reader.canRead(PARTS_ELEMENT_TYPE, MediaType.MULTIPART_RELATED)).isTrue();
|
||||
assertThat(this.reader.canRead(PARTS_ELEMENT_TYPE, null)).isTrue();
|
||||
|
||||
assertThat(this.reader.canRead(
|
||||
forClassWithGenerics(MultiValueMap.class, String.class, Object.class),
|
||||
MediaType.MULTIPART_FORM_DATA)).isFalse();
|
||||
|
||||
assertThat(this.reader.canRead(
|
||||
forClassWithGenerics(MultiValueMap.class, String.class, String.class),
|
||||
MediaType.MULTIPART_FORM_DATA)).isFalse();
|
||||
|
||||
assertThat(this.reader.canRead(
|
||||
forClassWithGenerics(Map.class, String.class, String.class),
|
||||
MediaType.MULTIPART_FORM_DATA)).isFalse();
|
||||
|
||||
assertThat(this.reader.canRead(
|
||||
forClassWithGenerics(MultiValueMap.class, String.class, Part.class),
|
||||
MediaType.APPLICATION_FORM_URLENCODED)).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
void resolveParts() {
|
||||
ServerHttpRequest request = generateMultipartRequest();
|
||||
MultiValueMap<String, Part> parts = this.reader.readMono(PARTS_ELEMENT_TYPE, request, emptyMap()).block();
|
||||
|
||||
assertThat(parts).containsOnlyKeys("filePart", "textPart");
|
||||
|
||||
Part part = parts.getFirst("filePart");
|
||||
assertThat(part).isInstanceOf(FilePart.class);
|
||||
assertThat(part.name()).isEqualTo("filePart");
|
||||
assertThat(((FilePart) part).filename()).isEqualTo("foo.txt");
|
||||
DataBuffer buffer = DataBufferUtils.join(part.content()).block();
|
||||
assertThat(buffer.toString(UTF_8)).isEqualTo("Lorem Ipsum.");
|
||||
DataBufferUtils.release(buffer);
|
||||
|
||||
part = parts.getFirst("textPart");
|
||||
assertThat(part).isInstanceOf(FormFieldPart.class);
|
||||
assertThat(part.name()).isEqualTo("textPart");
|
||||
assertThat(((FormFieldPart) part).value()).isEqualTo("sample-text");
|
||||
}
|
||||
|
||||
@Test // SPR-16545
|
||||
void transferTo() throws IOException {
|
||||
ServerHttpRequest request = generateMultipartRequest();
|
||||
MultiValueMap<String, Part> parts = this.reader.readMono(PARTS_ELEMENT_TYPE, request, emptyMap()).block();
|
||||
|
||||
assertThat(parts).isNotNull();
|
||||
FilePart part = (FilePart) parts.getFirst("filePart");
|
||||
assertThat(part).isNotNull();
|
||||
|
||||
File dest = File.createTempFile(part.filename(), "multipart");
|
||||
part.transferTo(dest).block(Duration.ofSeconds(5));
|
||||
|
||||
assertThat(dest.exists()).isTrue();
|
||||
assertThat(dest.length()).isEqualTo(12);
|
||||
assertThat(dest.delete()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void bodyError() {
|
||||
ServerHttpRequest request = generateErrorMultipartRequest();
|
||||
StepVerifier.create(this.reader.readMono(PARTS_ELEMENT_TYPE, request, emptyMap())).verifyError();
|
||||
}
|
||||
|
||||
@Test
|
||||
void readPartsWithoutDemand() {
|
||||
ServerHttpRequest request = generateMultipartRequest();
|
||||
Mono<MultiValueMap<String, Part>> parts = this.reader.readMono(PARTS_ELEMENT_TYPE, request, emptyMap());
|
||||
ZeroDemandSubscriber subscriber = new ZeroDemandSubscriber();
|
||||
parts.subscribe(subscriber);
|
||||
subscriber.cancel();
|
||||
}
|
||||
|
||||
@Test
|
||||
void gh23768() throws IOException {
|
||||
ReadableByteChannel channel = new ClassPathResource("invalid.multipart", getClass()).readableChannel();
|
||||
Flux<DataBuffer> body = DataBufferUtils.readByteChannel(() -> channel, this.bufferFactory, 1024);
|
||||
|
||||
MediaType contentType = new MediaType("multipart", "form-data",
|
||||
singletonMap("boundary", "NbjrKgjbsaMLdnMxMfDpD6myWomYc0qNX0w"));
|
||||
ServerHttpRequest request = MockServerHttpRequest.post("/")
|
||||
.contentType(contentType)
|
||||
.body(body);
|
||||
|
||||
Mono<MultiValueMap<String, Part>> parts = this.reader.readMono(PARTS_ELEMENT_TYPE, request, emptyMap());
|
||||
|
||||
StepVerifier.create(parts)
|
||||
.assertNext(result -> assertThat(result).isEmpty())
|
||||
.verifyComplete();
|
||||
}
|
||||
|
||||
@Test
|
||||
void readTooManyParts() {
|
||||
testMultipartExceptions(reader -> reader.setMaxParts(1),
|
||||
ex -> assertThat(ex)
|
||||
.isInstanceOf(DecodingException.class)
|
||||
.hasMessageStartingWith("Failure while parsing part[2]")
|
||||
.hasRootCauseMessage("Too many parts: Part[2] but maxParts=1")
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
void readFilePartTooBig() {
|
||||
testMultipartExceptions(reader -> reader.setMaxDiskUsagePerPart(5),
|
||||
ex -> assertThat(ex)
|
||||
.isInstanceOf(DecodingException.class)
|
||||
.hasMessageStartingWith("Failure while parsing part[1]")
|
||||
.hasRootCauseMessage("Part[1] exceeded the disk usage limit of 5 bytes")
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
void readPartHeadersTooBig() {
|
||||
testMultipartExceptions(reader -> reader.setMaxInMemorySize(1),
|
||||
ex -> assertThat(ex)
|
||||
.isInstanceOf(DecodingException.class)
|
||||
.hasMessageStartingWith("Failure while parsing part[1]")
|
||||
.hasRootCauseMessage("Part[1] exceeded the in-memory limit of 1 bytes")
|
||||
);
|
||||
}
|
||||
|
||||
private void testMultipartExceptions(
|
||||
Consumer<SynchronossPartHttpMessageReader> configurer, Consumer<Throwable> assertions) {
|
||||
|
||||
SynchronossPartHttpMessageReader reader = new SynchronossPartHttpMessageReader();
|
||||
configurer.accept(reader);
|
||||
MultipartHttpMessageReader multipartReader = new MultipartHttpMessageReader(reader);
|
||||
StepVerifier.create(multipartReader.readMono(PARTS_ELEMENT_TYPE, generateMultipartRequest(), emptyMap()))
|
||||
.consumeErrorWith(assertions)
|
||||
.verify();
|
||||
}
|
||||
|
||||
private ServerHttpRequest generateMultipartRequest() {
|
||||
MultipartBodyBuilder partsBuilder = new MultipartBodyBuilder();
|
||||
partsBuilder.part("filePart", new ClassPathResource("org/springframework/http/codec/multipart/foo.txt"));
|
||||
partsBuilder.part("textPart", "sample-text");
|
||||
|
||||
MockClientHttpRequest outputMessage = new MockClientHttpRequest(HttpMethod.POST, "/");
|
||||
new MultipartHttpMessageWriter()
|
||||
.write(Mono.just(partsBuilder.build()), null, MediaType.MULTIPART_FORM_DATA, outputMessage, null)
|
||||
.block(Duration.ofSeconds(5));
|
||||
Flux<DataBuffer> requestBody = outputMessage.getBody()
|
||||
.map(buffer -> this.bufferFactory.wrap(buffer.asByteBuffer()));
|
||||
return MockServerHttpRequest.post("/")
|
||||
.contentType(outputMessage.getHeaders().getContentType())
|
||||
.body(requestBody);
|
||||
}
|
||||
|
||||
private ServerHttpRequest generateErrorMultipartRequest() {
|
||||
return MockServerHttpRequest.post("/")
|
||||
.header(CONTENT_TYPE, MULTIPART_FORM_DATA.toString())
|
||||
.body(Flux.just(this.bufferFactory.wrap("invalid content".getBytes())));
|
||||
}
|
||||
|
||||
private static class ZeroDemandSubscriber extends BaseSubscriber<MultiValueMap<String, Part>> {
|
||||
|
||||
@Override
|
||||
protected void hookOnSubscribe(Subscription subscription) {
|
||||
// Just subscribe without requesting
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -253,7 +253,7 @@ public class Jaxb2XmlDecoderTests extends AbstractLeakCheckingTests {
|
||||
}
|
||||
|
||||
|
||||
@javax.xml.bind.annotation.XmlType(name = "pojo")
|
||||
@jakarta.xml.bind.annotation.XmlType(name = "pojo")
|
||||
public static class TypePojo {
|
||||
|
||||
private String foo;
|
||||
|
||||
@@ -20,10 +20,9 @@ import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import javax.xml.bind.annotation.XmlElement;
|
||||
import javax.xml.bind.annotation.XmlElements;
|
||||
import javax.xml.bind.annotation.XmlRootElement;
|
||||
|
||||
import jakarta.xml.bind.annotation.XmlElement;
|
||||
import jakarta.xml.bind.annotation.XmlElements;
|
||||
import jakarta.xml.bind.annotation.XmlRootElement;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
@@ -19,7 +19,7 @@ package org.springframework.http.codec.xml.jaxb;
|
||||
/**
|
||||
* @author Arjen Poutsma
|
||||
*/
|
||||
@javax.xml.bind.annotation.XmlRootElement
|
||||
@jakarta.xml.bind.annotation.XmlRootElement
|
||||
public class XmlRootElement {
|
||||
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
package org.springframework.http.codec.xml.jaxb;
|
||||
|
||||
import javax.xml.bind.annotation.XmlRootElement;
|
||||
import jakarta.xml.bind.annotation.XmlRootElement;
|
||||
|
||||
/**
|
||||
* @author Arjen Poutsma
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
package org.springframework.http.codec.xml.jaxb;
|
||||
|
||||
import javax.xml.bind.annotation.XmlRootElement;
|
||||
import jakarta.xml.bind.annotation.XmlRootElement;
|
||||
|
||||
/**
|
||||
* @author Arjen Poutsma
|
||||
|
||||
@@ -19,7 +19,7 @@ package org.springframework.http.codec.xml.jaxb;
|
||||
/**
|
||||
* @author Arjen Poutsma
|
||||
*/
|
||||
@javax.xml.bind.annotation.XmlType
|
||||
@jakarta.xml.bind.annotation.XmlType
|
||||
public class XmlType {
|
||||
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
package org.springframework.http.codec.xml.jaxb;
|
||||
|
||||
import javax.xml.bind.annotation.XmlType;
|
||||
import jakarta.xml.bind.annotation.XmlType;
|
||||
|
||||
/**
|
||||
* @author Arjen Poutsma
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
package org.springframework.http.codec.xml.jaxb;
|
||||
|
||||
import javax.xml.bind.annotation.XmlType;
|
||||
import jakarta.xml.bind.annotation.XmlType;
|
||||
|
||||
/**
|
||||
* @author Arjen Poutsma
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
@javax.xml.bind.annotation.XmlSchema(namespace = "namespace")
|
||||
@jakarta.xml.bind.annotation.XmlSchema(namespace = "namespace")
|
||||
package org.springframework.http.codec.xml.jaxb;
|
||||
|
||||
@@ -29,11 +29,12 @@ import java.util.Map;
|
||||
import javax.xml.transform.Source;
|
||||
import javax.xml.transform.stream.StreamSource;
|
||||
|
||||
import org.apache.commons.fileupload.FileItem;
|
||||
import org.apache.commons.fileupload.FileItemFactory;
|
||||
import org.apache.commons.fileupload.FileUpload;
|
||||
import org.apache.commons.fileupload.RequestContext;
|
||||
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
|
||||
import org.apache.tomcat.util.http.fileupload.FileItem;
|
||||
import org.apache.tomcat.util.http.fileupload.FileItemFactory;
|
||||
import org.apache.tomcat.util.http.fileupload.FileUpload;
|
||||
import org.apache.tomcat.util.http.fileupload.RequestContext;
|
||||
import org.apache.tomcat.util.http.fileupload.UploadContext;
|
||||
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
@@ -327,16 +328,17 @@ public class FormHttpMessageConverterTests {
|
||||
}
|
||||
|
||||
|
||||
private static class MockHttpOutputMessageRequestContext implements RequestContext {
|
||||
private static class MockHttpOutputMessageRequestContext implements UploadContext {
|
||||
|
||||
private final MockHttpOutputMessage outputMessage;
|
||||
|
||||
private final byte[] body;
|
||||
|
||||
private MockHttpOutputMessageRequestContext(MockHttpOutputMessage outputMessage) {
|
||||
this.outputMessage = outputMessage;
|
||||
this.body = this.outputMessage.getBodyAsBytes();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getCharacterEncoding() {
|
||||
MediaType type = this.outputMessage.getHeaders().getContentType();
|
||||
@@ -350,17 +352,17 @@ public class FormHttpMessageConverterTests {
|
||||
}
|
||||
|
||||
@Override
|
||||
@Deprecated
|
||||
public int getContentLength() {
|
||||
return this.outputMessage.getBodyAsBytes().length;
|
||||
public InputStream getInputStream() throws IOException {
|
||||
return new ByteArrayInputStream(body);
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputStream getInputStream() throws IOException {
|
||||
return new ByteArrayInputStream(this.outputMessage.getBodyAsBytes());
|
||||
public long contentLength() {
|
||||
return body.length;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static class MyBean {
|
||||
|
||||
private String string;
|
||||
|
||||
@@ -162,7 +162,7 @@ public class JsonbHttpMessageConverterTests {
|
||||
MockHttpOutputMessage outputMessage = new MockHttpOutputMessage();
|
||||
String body = "H\u00e9llo W\u00f6rld";
|
||||
this.converter.write(body, contentType, outputMessage);
|
||||
assertThat(outputMessage.getBodyAsString(StandardCharsets.UTF_16BE)).as("Invalid result").isEqualTo(body);
|
||||
assertThat(outputMessage.getBodyAsString(StandardCharsets.UTF_16BE)).as("Invalid result").isEqualTo("\"" + body + "\"");
|
||||
assertThat(outputMessage.getHeaders().getContentType()).as("Invalid content-type").isEqualTo(contentType);
|
||||
}
|
||||
|
||||
@@ -260,7 +260,7 @@ public class JsonbHttpMessageConverterTests {
|
||||
MockHttpOutputMessage outputMessage = new MockHttpOutputMessage();
|
||||
this.converter.setPrefixJson(true);
|
||||
this.converter.writeInternal("foo", null, outputMessage);
|
||||
assertThat(outputMessage.getBodyAsString(StandardCharsets.UTF_8)).isEqualTo(")]}', foo");
|
||||
assertThat(outputMessage.getBodyAsString(StandardCharsets.UTF_8)).isEqualTo(")]}', \"foo\"");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -268,7 +268,7 @@ public class JsonbHttpMessageConverterTests {
|
||||
MockHttpOutputMessage outputMessage = new MockHttpOutputMessage();
|
||||
this.converter.setJsonPrefix(")))");
|
||||
this.converter.writeInternal("foo", null, outputMessage);
|
||||
assertThat(outputMessage.getBodyAsString(StandardCharsets.UTF_8)).isEqualTo(")))foo");
|
||||
assertThat(outputMessage.getBodyAsString(StandardCharsets.UTF_8)).isEqualTo(")))\"foo\"");
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -21,12 +21,12 @@ import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.xml.bind.annotation.XmlAttribute;
|
||||
import javax.xml.bind.annotation.XmlElement;
|
||||
import javax.xml.bind.annotation.XmlRootElement;
|
||||
import javax.xml.bind.annotation.XmlType;
|
||||
import javax.xml.stream.XMLInputFactory;
|
||||
|
||||
import jakarta.xml.bind.annotation.XmlAttribute;
|
||||
import jakarta.xml.bind.annotation.XmlElement;
|
||||
import jakarta.xml.bind.annotation.XmlRootElement;
|
||||
import jakarta.xml.bind.annotation.XmlType;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
|
||||
@@ -18,15 +18,14 @@ package org.springframework.http.converter.xml;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
import javax.xml.bind.Marshaller;
|
||||
import javax.xml.bind.Unmarshaller;
|
||||
import javax.xml.bind.annotation.XmlAttribute;
|
||||
import javax.xml.bind.annotation.XmlElement;
|
||||
import javax.xml.bind.annotation.XmlRootElement;
|
||||
import javax.xml.bind.annotation.XmlType;
|
||||
import javax.xml.bind.annotation.adapters.XmlAdapter;
|
||||
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
|
||||
|
||||
import jakarta.xml.bind.Marshaller;
|
||||
import jakarta.xml.bind.Unmarshaller;
|
||||
import jakarta.xml.bind.annotation.XmlAttribute;
|
||||
import jakarta.xml.bind.annotation.XmlElement;
|
||||
import jakarta.xml.bind.annotation.XmlRootElement;
|
||||
import jakarta.xml.bind.annotation.XmlType;
|
||||
import jakarta.xml.bind.annotation.adapters.XmlAdapter;
|
||||
import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.xmlunit.diff.DifferenceEvaluator;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
* Copyright 2002-2021 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -70,7 +70,7 @@ class ErrorHandlerIntegrationTests extends AbstractHttpHandlerIntegrationTests {
|
||||
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR);
|
||||
}
|
||||
|
||||
@ParameterizedHttpServerTest // SPR-15560
|
||||
@ParameterizedHttpServerTest // SPR-15560
|
||||
void emptyPathSegments(HttpServer httpServer) throws Exception {
|
||||
startServer(httpServer);
|
||||
|
||||
|
||||
@@ -136,7 +136,7 @@ class HeadersAdaptersTests {
|
||||
arguments("Netty", new NettyHeadersAdapter(new DefaultHttpHeaders())),
|
||||
arguments("Tomcat", new TomcatHeadersAdapter(new MimeHeaders())),
|
||||
arguments("Undertow", new UndertowHeadersAdapter(new HeaderMap())),
|
||||
arguments("Jetty", new JettyHeadersAdapter(new HttpFields()))
|
||||
arguments("Jetty", new JettyHeadersAdapter(HttpFields.build()))
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -21,11 +21,10 @@ import java.net.URI;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
|
||||
import javax.servlet.AsyncContext;
|
||||
import javax.servlet.ReadListener;
|
||||
import javax.servlet.ServletInputStream;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import jakarta.servlet.AsyncContext;
|
||||
import jakarta.servlet.ReadListener;
|
||||
import jakarta.servlet.ServletInputStream;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.core.io.buffer.DefaultDataBufferFactory;
|
||||
|
||||
@@ -18,12 +18,11 @@ package org.springframework.web.bind.support;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.servlet.MultipartConfigElement;
|
||||
import javax.servlet.http.HttpServlet;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.servlet.http.Part;
|
||||
|
||||
import jakarta.servlet.MultipartConfigElement;
|
||||
import jakarta.servlet.http.HttpServlet;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.servlet.http.Part;
|
||||
import org.eclipse.jetty.server.Connector;
|
||||
import org.eclipse.jetty.server.NetworkConnector;
|
||||
import org.eclipse.jetty.server.Server;
|
||||
|
||||
@@ -18,9 +18,8 @@ package org.springframework.web.context;
|
||||
|
||||
import java.util.EventListener;
|
||||
|
||||
import javax.servlet.ServletContextEvent;
|
||||
import javax.servlet.ServletException;
|
||||
|
||||
import jakarta.servlet.ServletContextEvent;
|
||||
import jakarta.servlet.ServletException;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2019 the original author or authors.
|
||||
* Copyright 2002-2021 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -16,8 +16,7 @@
|
||||
|
||||
package org.springframework.web.context.request;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.beans.factory.BeanCreationException;
|
||||
@@ -38,7 +37,7 @@ public class RequestAndSessionScopedBeanTests {
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("resource")
|
||||
public void testPutBeanInRequest() throws Exception {
|
||||
public void testPutBeanInRequest() {
|
||||
String targetBeanName = "target";
|
||||
|
||||
StaticWebApplicationContext wac = new StaticWebApplicationContext();
|
||||
@@ -73,7 +72,7 @@ public class RequestAndSessionScopedBeanTests {
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("resource")
|
||||
public void testPutBeanInSession() throws Exception {
|
||||
public void testPutBeanInSession() {
|
||||
String targetBeanName = "target";
|
||||
HttpServletRequest request = new MockHttpServletRequest();
|
||||
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
|
||||
package org.springframework.web.context.request;
|
||||
|
||||
import javax.servlet.ServletRequestEvent;
|
||||
|
||||
import jakarta.servlet.ServletRequestEvent;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.core.task.MockRunnable;
|
||||
|
||||
@@ -19,9 +19,8 @@ package org.springframework.web.context.request;
|
||||
import java.io.Serializable;
|
||||
import java.math.BigInteger;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpSession;
|
||||
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpSession;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.web.testfixture.servlet.MockHttpServletRequest;
|
||||
|
||||
@@ -19,13 +19,12 @@ package org.springframework.web.context.request;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.ServletResponse;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletRequestWrapper;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.servlet.http.HttpServletResponseWrapper;
|
||||
|
||||
import jakarta.servlet.ServletRequest;
|
||||
import jakarta.servlet.ServletResponse;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletRequestWrapper;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.servlet.http.HttpServletResponseWrapper;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
|
||||
package org.springframework.web.context.request;
|
||||
|
||||
import javax.servlet.ServletContextEvent;
|
||||
|
||||
import jakarta.servlet.ServletContextEvent;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.beans.factory.support.GenericBeanDefinition;
|
||||
|
||||
@@ -18,8 +18,7 @@ package org.springframework.web.context.request.async;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import javax.servlet.AsyncEvent;
|
||||
|
||||
import jakarta.servlet.AsyncEvent;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
|
||||
@@ -19,8 +19,7 @@ package org.springframework.web.context.request.async;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import javax.servlet.AsyncEvent;
|
||||
|
||||
import jakarta.servlet.AsyncEvent;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
|
||||
@@ -19,8 +19,7 @@ package org.springframework.web.context.request.async;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
|
||||
@@ -19,8 +19,7 @@ package org.springframework.web.context.request.async;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
import javax.servlet.AsyncEvent;
|
||||
|
||||
import jakarta.servlet.AsyncEvent;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
|
||||
package org.springframework.web.context.support;
|
||||
|
||||
import javax.servlet.ServletContextEvent;
|
||||
|
||||
import jakarta.servlet.ServletContextEvent;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
|
||||
|
||||
@@ -18,8 +18,7 @@ package org.springframework.web.cors;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
|
||||
@@ -19,8 +19,7 @@ package org.springframework.web.cors.reactive;
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
|
||||
import jakarta.servlet.ServletException;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
@@ -16,11 +16,10 @@
|
||||
|
||||
package org.springframework.web.filter;
|
||||
|
||||
import javax.servlet.DispatcherType;
|
||||
import javax.servlet.FilterChain;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import jakarta.servlet.DispatcherType;
|
||||
import jakarta.servlet.FilterChain;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.web.testfixture.servlet.MockFilterConfig;
|
||||
|
||||
@@ -19,14 +19,13 @@ package org.springframework.web.filter;
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
|
||||
import javax.servlet.Filter;
|
||||
import javax.servlet.FilterChain;
|
||||
import javax.servlet.FilterConfig;
|
||||
import javax.servlet.ServletContext;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.ServletResponse;
|
||||
|
||||
import jakarta.servlet.Filter;
|
||||
import jakarta.servlet.FilterChain;
|
||||
import jakarta.servlet.FilterConfig;
|
||||
import jakarta.servlet.ServletContext;
|
||||
import jakarta.servlet.ServletException;
|
||||
import jakarta.servlet.ServletRequest;
|
||||
import jakarta.servlet.ServletResponse;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.web.testfixture.servlet.MockFilterConfig;
|
||||
|
||||
@@ -17,8 +17,7 @@ package org.springframework.web.filter;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.http.HttpHeaders;
|
||||
|
||||
@@ -19,9 +19,8 @@ package org.springframework.web.filter;
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
|
||||
import javax.servlet.FilterChain;
|
||||
import javax.servlet.ServletException;
|
||||
|
||||
import jakarta.servlet.FilterChain;
|
||||
import jakarta.servlet.ServletException;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
|
||||
@@ -18,14 +18,13 @@ package org.springframework.web.filter;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.servlet.Filter;
|
||||
import javax.servlet.FilterChain;
|
||||
import javax.servlet.FilterConfig;
|
||||
import javax.servlet.ServletContext;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.ServletResponse;
|
||||
|
||||
import jakarta.servlet.Filter;
|
||||
import jakarta.servlet.FilterChain;
|
||||
import jakarta.servlet.FilterConfig;
|
||||
import jakarta.servlet.ServletContext;
|
||||
import jakarta.servlet.ServletException;
|
||||
import jakarta.servlet.ServletRequest;
|
||||
import jakarta.servlet.ServletResponse;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
|
||||
@@ -19,14 +19,13 @@ package org.springframework.web.filter;
|
||||
import java.io.IOException;
|
||||
import java.util.Enumeration;
|
||||
|
||||
import javax.servlet.DispatcherType;
|
||||
import javax.servlet.Filter;
|
||||
import javax.servlet.FilterChain;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServlet;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import jakarta.servlet.DispatcherType;
|
||||
import jakarta.servlet.Filter;
|
||||
import jakarta.servlet.FilterChain;
|
||||
import jakarta.servlet.ServletException;
|
||||
import jakarta.servlet.http.HttpServlet;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Nested;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
@@ -18,12 +18,11 @@ package org.springframework.web.filter;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.servlet.FilterChain;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.ServletResponse;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import jakarta.servlet.FilterChain;
|
||||
import jakarta.servlet.ServletException;
|
||||
import jakarta.servlet.ServletRequest;
|
||||
import jakarta.servlet.ServletResponse;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.web.testfixture.servlet.MockHttpServletRequest;
|
||||
|
||||
@@ -18,13 +18,12 @@ package org.springframework.web.filter;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.servlet.DispatcherType;
|
||||
import javax.servlet.FilterChain;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServlet;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import jakarta.servlet.DispatcherType;
|
||||
import jakarta.servlet.FilterChain;
|
||||
import jakarta.servlet.ServletException;
|
||||
import jakarta.servlet.http.HttpServlet;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
|
||||
@@ -16,9 +16,8 @@
|
||||
|
||||
package org.springframework.web.filter;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.servlet.http.HttpServletResponseWrapper;
|
||||
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.servlet.http.HttpServletResponseWrapper;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mockito.InOrder;
|
||||
import org.mockito.Mockito;
|
||||
|
||||
@@ -18,11 +18,10 @@ package org.springframework.web.filter;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.servlet.FilterChain;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.ServletResponse;
|
||||
|
||||
import jakarta.servlet.FilterChain;
|
||||
import jakarta.servlet.ServletException;
|
||||
import jakarta.servlet.ServletRequest;
|
||||
import jakarta.servlet.ServletResponse;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.web.context.request.RequestAttributes;
|
||||
|
||||
@@ -18,10 +18,9 @@ package org.springframework.web.filter;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
import javax.servlet.FilterChain;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import jakarta.servlet.FilterChain;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.util.FileCopyUtils;
|
||||
|
||||
@@ -18,9 +18,8 @@ package org.springframework.web.filter;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
import javax.servlet.FilterChain;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import jakarta.servlet.FilterChain;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.util.FileCopyUtils;
|
||||
|
||||
@@ -16,9 +16,8 @@
|
||||
|
||||
package org.springframework.web.jsf;
|
||||
|
||||
import javax.faces.application.NavigationHandler;
|
||||
import javax.faces.context.FacesContext;
|
||||
|
||||
import jakarta.faces.application.NavigationHandler;
|
||||
import jakarta.faces.context.FacesContext;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.beans.factory.BeanFactory;
|
||||
|
||||
@@ -16,11 +16,10 @@
|
||||
|
||||
package org.springframework.web.jsf;
|
||||
|
||||
import javax.faces.context.FacesContext;
|
||||
import javax.faces.event.PhaseEvent;
|
||||
import javax.faces.event.PhaseId;
|
||||
import javax.faces.event.PhaseListener;
|
||||
|
||||
import jakarta.faces.context.FacesContext;
|
||||
import jakarta.faces.event.PhaseEvent;
|
||||
import jakarta.faces.event.PhaseId;
|
||||
import jakarta.faces.event.PhaseListener;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.beans.factory.ListableBeanFactory;
|
||||
|
||||
@@ -18,22 +18,22 @@ package org.springframework.web.jsf;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import javax.faces.application.Application;
|
||||
import javax.faces.application.FacesMessage;
|
||||
import javax.faces.application.FacesMessage.Severity;
|
||||
import javax.faces.component.UIViewRoot;
|
||||
import javax.faces.context.ExternalContext;
|
||||
import javax.faces.context.FacesContext;
|
||||
import javax.faces.context.ResponseStream;
|
||||
import javax.faces.context.ResponseWriter;
|
||||
import javax.faces.render.RenderKit;
|
||||
import jakarta.faces.application.Application;
|
||||
import jakarta.faces.application.FacesMessage;
|
||||
import jakarta.faces.application.FacesMessage.Severity;
|
||||
import jakarta.faces.component.UIViewRoot;
|
||||
import jakarta.faces.context.ExternalContext;
|
||||
import jakarta.faces.context.FacesContext;
|
||||
import jakarta.faces.context.ResponseStream;
|
||||
import jakarta.faces.context.ResponseWriter;
|
||||
import jakarta.faces.render.RenderKit;
|
||||
|
||||
/**
|
||||
* Mock implementation of the {@code FacesContext} class to facilitate
|
||||
* standalone Action unit tests.
|
||||
*
|
||||
* @author Ulrik Sandberg
|
||||
* @see javax.faces.context.FacesContext
|
||||
* @see jakarta.faces.context.FacesContext
|
||||
*/
|
||||
public class MockFacesContext extends FacesContext {
|
||||
|
||||
|
||||
@@ -16,10 +16,10 @@
|
||||
|
||||
package org.springframework.web.jsf;
|
||||
|
||||
import javax.faces.FacesException;
|
||||
import javax.faces.context.FacesContext;
|
||||
import javax.faces.event.PhaseListener;
|
||||
import javax.faces.lifecycle.Lifecycle;
|
||||
import jakarta.faces.FacesException;
|
||||
import jakarta.faces.context.FacesContext;
|
||||
import jakarta.faces.event.PhaseListener;
|
||||
import jakarta.faces.lifecycle.Lifecycle;
|
||||
|
||||
/**
|
||||
* @author Juergen Hoeller
|
||||
|
||||
@@ -20,8 +20,7 @@ import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Priority;
|
||||
|
||||
import jakarta.annotation.Priority;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.beans.BeanUtils;
|
||||
|
||||
@@ -18,8 +18,7 @@ package org.springframework.web.method.annotation;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import javax.servlet.http.Cookie;
|
||||
|
||||
import jakarta.servlet.http.Cookie;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
|
||||
@@ -21,9 +21,8 @@ import java.io.IOException;
|
||||
import java.net.BindException;
|
||||
import java.net.SocketException;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
|
||||
@@ -19,8 +19,7 @@ package org.springframework.web.method.annotation;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.servlet.http.Part;
|
||||
|
||||
import jakarta.servlet.http.Part;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.core.MethodParameter;
|
||||
|
||||
@@ -21,8 +21,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
import javax.servlet.http.Part;
|
||||
|
||||
import jakarta.servlet.http.Part;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.beans.propertyeditors.StringTrimmerEditor;
|
||||
|
||||
@@ -1,618 +0,0 @@
|
||||
/*
|
||||
* Copyright 2002-2021 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.web.multipart.commons;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.servlet.FilterChain;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.ServletResponse;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.apache.commons.fileupload.FileItem;
|
||||
import org.apache.commons.fileupload.FileItemFactory;
|
||||
import org.apache.commons.fileupload.FileItemHeaders;
|
||||
import org.apache.commons.fileupload.FileUpload;
|
||||
import org.apache.commons.fileupload.servlet.ServletFileUpload;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.beans.MutablePropertyValues;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.util.MultiValueMap;
|
||||
import org.springframework.web.bind.ServletRequestDataBinder;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
import org.springframework.web.context.support.StaticWebApplicationContext;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import org.springframework.web.multipart.MultipartHttpServletRequest;
|
||||
import org.springframework.web.multipart.support.ByteArrayMultipartFileEditor;
|
||||
import org.springframework.web.multipart.support.MultipartFilter;
|
||||
import org.springframework.web.multipart.support.StringMultipartFileEditor;
|
||||
import org.springframework.web.testfixture.servlet.MockFilterConfig;
|
||||
import org.springframework.web.testfixture.servlet.MockHttpServletRequest;
|
||||
import org.springframework.web.testfixture.servlet.MockHttpServletResponse;
|
||||
import org.springframework.web.testfixture.servlet.MockServletContext;
|
||||
import org.springframework.web.testfixture.servlet.PassThroughFilterChain;
|
||||
import org.springframework.web.util.WebUtils;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* @author Juergen Hoeller
|
||||
* @author Arjen Poutsma
|
||||
* @since 08.10.2003
|
||||
*/
|
||||
public class CommonsMultipartResolverTests {
|
||||
|
||||
@Test
|
||||
public void isMultipartWithDefaultSetting() {
|
||||
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
|
||||
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("POST", "/");
|
||||
assertThat(resolver.isMultipart(request)).isFalse();
|
||||
|
||||
request.setContentType(MediaType.MULTIPART_FORM_DATA_VALUE);
|
||||
assertThat(resolver.isMultipart(request)).isTrue();
|
||||
|
||||
request.setContentType(MediaType.MULTIPART_MIXED_VALUE);
|
||||
assertThat(resolver.isMultipart(request)).isTrue();
|
||||
|
||||
request.setContentType(MediaType.MULTIPART_RELATED_VALUE);
|
||||
assertThat(resolver.isMultipart(request)).isTrue();
|
||||
|
||||
request = new MockHttpServletRequest("PUT", "/");
|
||||
assertThat(resolver.isMultipart(request)).isFalse();
|
||||
|
||||
request.setContentType(MediaType.MULTIPART_FORM_DATA_VALUE);
|
||||
assertThat(resolver.isMultipart(request)).isFalse();
|
||||
|
||||
request.setContentType(MediaType.MULTIPART_MIXED_VALUE);
|
||||
assertThat(resolver.isMultipart(request)).isFalse();
|
||||
|
||||
request.setContentType(MediaType.MULTIPART_RELATED_VALUE);
|
||||
assertThat(resolver.isMultipart(request)).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isMultipartWithSupportedMethods() {
|
||||
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
|
||||
resolver.setSupportedMethods("POST", "PUT");
|
||||
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("POST", "/");
|
||||
assertThat(resolver.isMultipart(request)).isFalse();
|
||||
|
||||
request.setContentType(MediaType.MULTIPART_FORM_DATA_VALUE);
|
||||
assertThat(resolver.isMultipart(request)).isTrue();
|
||||
|
||||
request.setContentType(MediaType.MULTIPART_MIXED_VALUE);
|
||||
assertThat(resolver.isMultipart(request)).isTrue();
|
||||
|
||||
request.setContentType(MediaType.MULTIPART_RELATED_VALUE);
|
||||
assertThat(resolver.isMultipart(request)).isTrue();
|
||||
|
||||
request = new MockHttpServletRequest("PUT", "/");
|
||||
assertThat(resolver.isMultipart(request)).isFalse();
|
||||
|
||||
request.setContentType(MediaType.MULTIPART_FORM_DATA_VALUE);
|
||||
assertThat(resolver.isMultipart(request)).isTrue();
|
||||
|
||||
request.setContentType(MediaType.MULTIPART_MIXED_VALUE);
|
||||
assertThat(resolver.isMultipart(request)).isTrue();
|
||||
|
||||
request.setContentType(MediaType.MULTIPART_RELATED_VALUE);
|
||||
assertThat(resolver.isMultipart(request)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void withApplicationContext() throws Exception {
|
||||
doTestWithApplicationContext(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void withApplicationContextAndLazyResolution() throws Exception {
|
||||
doTestWithApplicationContext(true);
|
||||
}
|
||||
|
||||
private void doTestWithApplicationContext(boolean lazy) throws Exception {
|
||||
StaticWebApplicationContext wac = new StaticWebApplicationContext();
|
||||
wac.setServletContext(new MockServletContext());
|
||||
wac.getServletContext().setAttribute(WebUtils.TEMP_DIR_CONTEXT_ATTRIBUTE, new File("mytemp"));
|
||||
wac.refresh();
|
||||
MockCommonsMultipartResolver resolver = new MockCommonsMultipartResolver();
|
||||
resolver.setMaxUploadSize(1000);
|
||||
resolver.setMaxInMemorySize(100);
|
||||
resolver.setDefaultEncoding("enc");
|
||||
if (lazy) {
|
||||
resolver.setResolveLazily(false);
|
||||
}
|
||||
resolver.setServletContext(wac.getServletContext());
|
||||
assertThat(resolver.getFileUpload().getSizeMax()).isEqualTo(1000);
|
||||
assertThat(resolver.getFileItemFactory().getSizeThreshold()).isEqualTo(100);
|
||||
assertThat(resolver.getFileUpload().getHeaderEncoding()).isEqualTo("enc");
|
||||
assertThat(resolver.getFileItemFactory().getRepository().getAbsolutePath().endsWith("mytemp")).isTrue();
|
||||
|
||||
MockHttpServletRequest originalRequest = new MockHttpServletRequest();
|
||||
originalRequest.setMethod("POST");
|
||||
originalRequest.setContentType("multipart/form-data");
|
||||
originalRequest.addHeader("Content-type", "multipart/form-data");
|
||||
originalRequest.addParameter("getField", "getValue");
|
||||
assertThat(resolver.isMultipart(originalRequest)).isTrue();
|
||||
MultipartHttpServletRequest request = resolver.resolveMultipart(originalRequest);
|
||||
|
||||
doTestParameters(request);
|
||||
|
||||
doTestFiles(request);
|
||||
|
||||
doTestBinding(resolver, originalRequest, request);
|
||||
|
||||
wac.close();
|
||||
}
|
||||
|
||||
private void doTestParameters(MultipartHttpServletRequest request) {
|
||||
Set<String> parameterNames = new HashSet<>();
|
||||
Enumeration<String> parameterEnum = request.getParameterNames();
|
||||
while (parameterEnum.hasMoreElements()) {
|
||||
parameterNames.add(parameterEnum.nextElement());
|
||||
}
|
||||
assertThat(parameterNames.size()).isEqualTo(3);
|
||||
assertThat(parameterNames.contains("field3")).isTrue();
|
||||
assertThat(parameterNames.contains("field4")).isTrue();
|
||||
assertThat(parameterNames.contains("getField")).isTrue();
|
||||
assertThat(request.getParameter("field3")).isEqualTo("value3");
|
||||
List<String> parameterValues = Arrays.asList(request.getParameterValues("field3"));
|
||||
assertThat(parameterValues.size()).isEqualTo(1);
|
||||
assertThat(parameterValues.contains("value3")).isTrue();
|
||||
assertThat(request.getParameter("field4")).isEqualTo("value4");
|
||||
parameterValues = Arrays.asList(request.getParameterValues("field4"));
|
||||
assertThat(parameterValues.size()).isEqualTo(2);
|
||||
assertThat(parameterValues.contains("value4")).isTrue();
|
||||
assertThat(parameterValues.contains("value5")).isTrue();
|
||||
assertThat(request.getParameter("field4")).isEqualTo("value4");
|
||||
assertThat(request.getParameter("getField")).isEqualTo("getValue");
|
||||
|
||||
List<String> parameterMapKeys = new ArrayList<>();
|
||||
List<Object> parameterMapValues = new ArrayList<>();
|
||||
for (Object o : request.getParameterMap().keySet()) {
|
||||
String key = (String) o;
|
||||
parameterMapKeys.add(key);
|
||||
parameterMapValues.add(request.getParameterMap().get(key));
|
||||
}
|
||||
assertThat(parameterMapKeys.size()).isEqualTo(3);
|
||||
assertThat(parameterMapValues.size()).isEqualTo(3);
|
||||
int field3Index = parameterMapKeys.indexOf("field3");
|
||||
int field4Index = parameterMapKeys.indexOf("field4");
|
||||
int getFieldIndex = parameterMapKeys.indexOf("getField");
|
||||
assertThat(field3Index != -1).isTrue();
|
||||
assertThat(field4Index != -1).isTrue();
|
||||
assertThat(getFieldIndex != -1).isTrue();
|
||||
parameterValues = Arrays.asList((String[]) parameterMapValues.get(field3Index));
|
||||
assertThat(parameterValues.size()).isEqualTo(1);
|
||||
assertThat(parameterValues.contains("value3")).isTrue();
|
||||
parameterValues = Arrays.asList((String[]) parameterMapValues.get(field4Index));
|
||||
assertThat(parameterValues.size()).isEqualTo(2);
|
||||
assertThat(parameterValues.contains("value4")).isTrue();
|
||||
assertThat(parameterValues.contains("value5")).isTrue();
|
||||
parameterValues = Arrays.asList((String[]) parameterMapValues.get(getFieldIndex));
|
||||
assertThat(parameterValues.size()).isEqualTo(1);
|
||||
assertThat(parameterValues.contains("getValue")).isTrue();
|
||||
}
|
||||
|
||||
private void doTestFiles(MultipartHttpServletRequest request) throws IOException {
|
||||
Set<String> fileNames = new HashSet<>();
|
||||
Iterator<String> fileIter = request.getFileNames();
|
||||
while (fileIter.hasNext()) {
|
||||
fileNames.add(fileIter.next());
|
||||
}
|
||||
assertThat(fileNames.size()).isEqualTo(3);
|
||||
assertThat(fileNames.contains("field1")).isTrue();
|
||||
assertThat(fileNames.contains("field2")).isTrue();
|
||||
assertThat(fileNames.contains("field2x")).isTrue();
|
||||
CommonsMultipartFile file1 = (CommonsMultipartFile) request.getFile("field1");
|
||||
CommonsMultipartFile file2 = (CommonsMultipartFile) request.getFile("field2");
|
||||
CommonsMultipartFile file2x = (CommonsMultipartFile) request.getFile("field2x");
|
||||
|
||||
Map<String, MultipartFile> fileMap = request.getFileMap();
|
||||
assertThat(fileMap.size()).isEqualTo(3);
|
||||
assertThat(fileMap.containsKey("field1")).isTrue();
|
||||
assertThat(fileMap.containsKey("field2")).isTrue();
|
||||
assertThat(fileMap.containsKey("field2x")).isTrue();
|
||||
assertThat(fileMap.get("field1")).isEqualTo(file1);
|
||||
assertThat(fileMap.get("field2")).isEqualTo(file2);
|
||||
assertThat(fileMap.get("field2x")).isEqualTo(file2x);
|
||||
|
||||
MultiValueMap<String, MultipartFile> multiFileMap = request.getMultiFileMap();
|
||||
assertThat(multiFileMap.size()).isEqualTo(3);
|
||||
assertThat(multiFileMap.containsKey("field1")).isTrue();
|
||||
assertThat(multiFileMap.containsKey("field2")).isTrue();
|
||||
assertThat(multiFileMap.containsKey("field2x")).isTrue();
|
||||
List<MultipartFile> field1Files = multiFileMap.get("field1");
|
||||
assertThat(field1Files.size()).isEqualTo(2);
|
||||
assertThat(field1Files.contains(file1)).isTrue();
|
||||
assertThat(multiFileMap.getFirst("field1")).isEqualTo(file1);
|
||||
assertThat(multiFileMap.getFirst("field2")).isEqualTo(file2);
|
||||
assertThat(multiFileMap.getFirst("field2x")).isEqualTo(file2x);
|
||||
|
||||
assertThat(file1.getContentType()).isEqualTo("type1");
|
||||
assertThat(file2.getContentType()).isEqualTo("type2");
|
||||
assertThat(file2x.getContentType()).isEqualTo("type2");
|
||||
assertThat(file1.getOriginalFilename()).isEqualTo("field1.txt");
|
||||
assertThat(file2.getOriginalFilename()).isEqualTo("field2.txt");
|
||||
assertThat(file2x.getOriginalFilename()).isEqualTo("field2x.txt");
|
||||
assertThat(new String(file1.getBytes())).isEqualTo("text1");
|
||||
assertThat(new String(file2.getBytes())).isEqualTo("text2");
|
||||
assertThat(file1.getSize()).isEqualTo(5);
|
||||
assertThat(file2.getSize()).isEqualTo(5);
|
||||
boolean condition1 = file1.getInputStream() instanceof ByteArrayInputStream;
|
||||
assertThat(condition1).isTrue();
|
||||
boolean condition = file2.getInputStream() instanceof ByteArrayInputStream;
|
||||
assertThat(condition).isTrue();
|
||||
File transfer1 = new File("C:/transfer1");
|
||||
file1.transferTo(transfer1);
|
||||
File transfer2 = new File("C:/transfer2");
|
||||
file2.transferTo(transfer2);
|
||||
assertThat(((MockFileItem) file1.getFileItem()).writtenFile).isEqualTo(transfer1);
|
||||
assertThat(((MockFileItem) file2.getFileItem()).writtenFile).isEqualTo(transfer2);
|
||||
|
||||
}
|
||||
|
||||
private void doTestBinding(MockCommonsMultipartResolver resolver, MockHttpServletRequest originalRequest,
|
||||
MultipartHttpServletRequest request) throws UnsupportedEncodingException {
|
||||
|
||||
MultipartTestBean1 mtb1 = new MultipartTestBean1();
|
||||
assertThat(mtb1.getField1()).isEqualTo(null);
|
||||
assertThat(mtb1.getField2()).isEqualTo(null);
|
||||
ServletRequestDataBinder binder = new ServletRequestDataBinder(mtb1, "mybean");
|
||||
binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());
|
||||
binder.bind(request);
|
||||
List<MultipartFile> file1List = request.getFiles("field1");
|
||||
CommonsMultipartFile file1a = (CommonsMultipartFile) file1List.get(0);
|
||||
CommonsMultipartFile file1b = (CommonsMultipartFile) file1List.get(1);
|
||||
CommonsMultipartFile file2 = (CommonsMultipartFile) request.getFile("field2");
|
||||
assertThat(mtb1.getField1()[0]).isEqualTo(file1a);
|
||||
assertThat(mtb1.getField1()[1]).isEqualTo(file1b);
|
||||
assertThat(new String(mtb1.getField2())).isEqualTo(new String(file2.getBytes()));
|
||||
|
||||
MultipartTestBean2 mtb2 = new MultipartTestBean2();
|
||||
assertThat(mtb2.getField1()).isEqualTo(null);
|
||||
assertThat(mtb2.getField2()).isEqualTo(null);
|
||||
binder = new ServletRequestDataBinder(mtb2, "mybean");
|
||||
binder.registerCustomEditor(String.class, "field1", new StringMultipartFileEditor());
|
||||
binder.registerCustomEditor(String.class, "field2", new StringMultipartFileEditor("UTF-16"));
|
||||
binder.bind(request);
|
||||
assertThat(mtb2.getField1()[0]).isEqualTo(new String(file1a.getBytes()));
|
||||
assertThat(mtb2.getField1()[1]).isEqualTo(new String(file1b.getBytes()));
|
||||
assertThat(mtb2.getField2()).isEqualTo(new String(file2.getBytes(), "UTF-16"));
|
||||
|
||||
resolver.cleanupMultipart(request);
|
||||
assertThat(((MockFileItem) file1a.getFileItem()).deleted).isTrue();
|
||||
assertThat(((MockFileItem) file1b.getFileItem()).deleted).isTrue();
|
||||
assertThat(((MockFileItem) file2.getFileItem()).deleted).isTrue();
|
||||
|
||||
resolver.setEmpty(true);
|
||||
request = resolver.resolveMultipart(originalRequest);
|
||||
binder.setBindEmptyMultipartFiles(false);
|
||||
String firstBound = mtb2.getField2();
|
||||
binder.bind(request);
|
||||
assertThat(mtb2.getField2().isEmpty()).isFalse();
|
||||
assertThat(mtb2.getField2()).isEqualTo(firstBound);
|
||||
|
||||
request = resolver.resolveMultipart(originalRequest);
|
||||
binder.setBindEmptyMultipartFiles(true);
|
||||
binder.bind(request);
|
||||
assertThat(mtb2.getField2().isEmpty()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void withServletContextAndFilter() throws Exception {
|
||||
StaticWebApplicationContext wac = new StaticWebApplicationContext();
|
||||
wac.setServletContext(new MockServletContext());
|
||||
wac.registerSingleton("filterMultipartResolver", MockCommonsMultipartResolver.class, new MutablePropertyValues());
|
||||
wac.getServletContext().setAttribute(WebUtils.TEMP_DIR_CONTEXT_ATTRIBUTE, new File("mytemp"));
|
||||
wac.refresh();
|
||||
wac.getServletContext().setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wac);
|
||||
CommonsMultipartResolver resolver = new CommonsMultipartResolver(wac.getServletContext());
|
||||
assertThat(resolver.getFileItemFactory().getRepository().getAbsolutePath().endsWith("mytemp")).isTrue();
|
||||
|
||||
MockFilterConfig filterConfig = new MockFilterConfig(wac.getServletContext(), "filter");
|
||||
filterConfig.addInitParameter("class", "notWritable");
|
||||
filterConfig.addInitParameter("unknownParam", "someValue");
|
||||
final MultipartFilter filter = new MultipartFilter();
|
||||
filter.init(filterConfig);
|
||||
|
||||
final List<MultipartFile> files = new ArrayList<>();
|
||||
final FilterChain filterChain = new FilterChain() {
|
||||
@Override
|
||||
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse) {
|
||||
MultipartHttpServletRequest request = (MultipartHttpServletRequest) servletRequest;
|
||||
files.addAll(request.getFileMap().values());
|
||||
}
|
||||
};
|
||||
|
||||
FilterChain filterChain2 = new PassThroughFilterChain(filter, filterChain);
|
||||
|
||||
MockHttpServletRequest originalRequest = new MockHttpServletRequest();
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
originalRequest.setMethod("POST");
|
||||
originalRequest.setContentType("multipart/form-data");
|
||||
originalRequest.addHeader("Content-type", "multipart/form-data");
|
||||
filter.doFilter(originalRequest, response, filterChain2);
|
||||
|
||||
CommonsMultipartFile file1 = (CommonsMultipartFile) files.get(0);
|
||||
CommonsMultipartFile file2 = (CommonsMultipartFile) files.get(1);
|
||||
assertThat(((MockFileItem) file1.getFileItem()).deleted).isTrue();
|
||||
assertThat(((MockFileItem) file2.getFileItem()).deleted).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void withServletContextAndFilterWithCustomBeanName() throws Exception {
|
||||
StaticWebApplicationContext wac = new StaticWebApplicationContext();
|
||||
wac.setServletContext(new MockServletContext());
|
||||
wac.refresh();
|
||||
wac.registerSingleton("myMultipartResolver", MockCommonsMultipartResolver.class, new MutablePropertyValues());
|
||||
wac.getServletContext().setAttribute(WebUtils.TEMP_DIR_CONTEXT_ATTRIBUTE, new File("mytemp"));
|
||||
wac.getServletContext().setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wac);
|
||||
CommonsMultipartResolver resolver = new CommonsMultipartResolver(wac.getServletContext());
|
||||
assertThat(resolver.getFileItemFactory().getRepository().getAbsolutePath().endsWith("mytemp")).isTrue();
|
||||
|
||||
MockFilterConfig filterConfig = new MockFilterConfig(wac.getServletContext(), "filter");
|
||||
filterConfig.addInitParameter("multipartResolverBeanName", "myMultipartResolver");
|
||||
|
||||
final List<MultipartFile> files = new ArrayList<>();
|
||||
FilterChain filterChain = new FilterChain() {
|
||||
@Override
|
||||
public void doFilter(ServletRequest originalRequest, ServletResponse response) {
|
||||
if (originalRequest instanceof MultipartHttpServletRequest) {
|
||||
MultipartHttpServletRequest request = (MultipartHttpServletRequest) originalRequest;
|
||||
files.addAll(request.getFileMap().values());
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
MultipartFilter filter = new MultipartFilter() {
|
||||
private boolean invoked = false;
|
||||
@Override
|
||||
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
|
||||
FilterChain filterChain) throws ServletException, IOException {
|
||||
super.doFilterInternal(request, response, filterChain);
|
||||
super.doFilterInternal(request, response, filterChain);
|
||||
if (invoked) {
|
||||
throw new ServletException("Should not have been invoked twice");
|
||||
}
|
||||
invoked = true;
|
||||
}
|
||||
};
|
||||
filter.init(filterConfig);
|
||||
|
||||
MockHttpServletRequest originalRequest = new MockHttpServletRequest();
|
||||
originalRequest.setMethod("POST");
|
||||
originalRequest.setContentType("multipart/form-data");
|
||||
originalRequest.addHeader("Content-type", "multipart/form-data");
|
||||
HttpServletResponse response = new MockHttpServletResponse();
|
||||
filter.doFilter(originalRequest, response, filterChain);
|
||||
CommonsMultipartFile file1 = (CommonsMultipartFile) files.get(0);
|
||||
CommonsMultipartFile file2 = (CommonsMultipartFile) files.get(1);
|
||||
assertThat(((MockFileItem) file1.getFileItem()).deleted).isTrue();
|
||||
assertThat(((MockFileItem) file2.getFileItem()).deleted).isTrue();
|
||||
}
|
||||
|
||||
|
||||
public static class MockCommonsMultipartResolver extends CommonsMultipartResolver {
|
||||
|
||||
private boolean empty;
|
||||
|
||||
protected void setEmpty(boolean empty) {
|
||||
this.empty = empty;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected FileUpload newFileUpload(FileItemFactory fileItemFactory) {
|
||||
return new ServletFileUpload() {
|
||||
@Override
|
||||
public List<FileItem> parseRequest(HttpServletRequest request) {
|
||||
if (request instanceof MultipartHttpServletRequest) {
|
||||
throw new IllegalStateException("Already a multipart request");
|
||||
}
|
||||
List<FileItem> fileItems = new ArrayList<>();
|
||||
MockFileItem fileItem1 = new MockFileItem(
|
||||
"field1", "type1", empty ? "" : "field1.txt", empty ? "" : "text1");
|
||||
MockFileItem fileItem1x = new MockFileItem(
|
||||
"field1", "type1", empty ? "" : "field1.txt", empty ? "" : "text1");
|
||||
MockFileItem fileItem2 = new MockFileItem(
|
||||
"field2", "type2", empty ? "" : "C:\\mypath/field2.txt", empty ? "" : "text2");
|
||||
MockFileItem fileItem2x = new MockFileItem(
|
||||
"field2x", "type2", empty ? "" : "C:/mypath\\field2x.txt", empty ? "" : "text2");
|
||||
MockFileItem fileItem3 = new MockFileItem("field3", null, null, "value3");
|
||||
MockFileItem fileItem4 = new MockFileItem("field4", "text/html; charset=iso-8859-1", null, "value4");
|
||||
MockFileItem fileItem5 = new MockFileItem("field4", null, null, "value5");
|
||||
fileItems.add(fileItem1);
|
||||
fileItems.add(fileItem1x);
|
||||
fileItems.add(fileItem2);
|
||||
fileItems.add(fileItem2x);
|
||||
fileItems.add(fileItem3);
|
||||
fileItems.add(fileItem4);
|
||||
fileItems.add(fileItem5);
|
||||
return fileItems;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static class MockFileItem implements FileItem {
|
||||
|
||||
private String fieldName;
|
||||
private String contentType;
|
||||
private String name;
|
||||
private String value;
|
||||
|
||||
private File writtenFile;
|
||||
private boolean deleted;
|
||||
|
||||
public MockFileItem(String fieldName, String contentType, String name, String value) {
|
||||
this.fieldName = fieldName;
|
||||
this.contentType = contentType;
|
||||
this.name = name;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputStream getInputStream() throws IOException {
|
||||
return new ByteArrayInputStream(value.getBytes());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContentType() {
|
||||
return contentType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInMemory() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getSize() {
|
||||
return value.length();
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] get() {
|
||||
return value.getBytes();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getString(String encoding) throws UnsupportedEncodingException {
|
||||
return new String(get(), encoding);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getString() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(File file) throws Exception {
|
||||
this.writtenFile = file;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete() {
|
||||
this.deleted = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFieldName() {
|
||||
return fieldName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFieldName(String s) {
|
||||
this.fieldName = s;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFormField() {
|
||||
return (this.name == null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFormField(boolean b) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public OutputStream getOutputStream() throws IOException {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public FileItemHeaders getHeaders() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setHeaders(FileItemHeaders headers) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class MultipartTestBean1 {
|
||||
|
||||
private MultipartFile[] field1;
|
||||
private byte[] field2;
|
||||
|
||||
public void setField1(MultipartFile[] field1) {
|
||||
this.field1 = field1;
|
||||
}
|
||||
|
||||
public MultipartFile[] getField1() {
|
||||
return field1;
|
||||
}
|
||||
|
||||
public void setField2(byte[] field2) {
|
||||
this.field2 = field2;
|
||||
}
|
||||
|
||||
public byte[] getField2() {
|
||||
return field2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class MultipartTestBean2 {
|
||||
|
||||
private String[] field1;
|
||||
private String field2;
|
||||
|
||||
public void setField1(String[] field1) {
|
||||
this.field1 = field1;
|
||||
}
|
||||
|
||||
public String[] getField1() {
|
||||
return field1;
|
||||
}
|
||||
|
||||
public void setField2(String field2) {
|
||||
this.field2 = field2;
|
||||
}
|
||||
|
||||
public String getField2() {
|
||||
return field2;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -19,9 +19,8 @@ package org.springframework.web.multipart.support;
|
||||
import java.net.URI;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletRequestWrapper;
|
||||
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletRequestWrapper;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.http.HttpHeaders;
|
||||
|
||||
@@ -15,8 +15,7 @@
|
||||
*/
|
||||
package org.springframework.web.util;
|
||||
|
||||
import javax.servlet.http.MappingMatch;
|
||||
|
||||
import jakarta.servlet.http.MappingMatch;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.http.server.RequestPath;
|
||||
|
||||
@@ -16,10 +16,9 @@
|
||||
|
||||
package org.springframework.web.util;
|
||||
|
||||
import javax.servlet.jsp.PageContext;
|
||||
import javax.servlet.jsp.tagext.Tag;
|
||||
import javax.servlet.jsp.tagext.TagSupport;
|
||||
|
||||
import jakarta.servlet.jsp.PageContext;
|
||||
import jakarta.servlet.jsp.tagext.Tag;
|
||||
import jakarta.servlet.jsp.tagext.TagSupport;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@@ -21,8 +21,7 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.http.HttpHeaders;
|
||||
|
||||
Reference in New Issue
Block a user