Search in sources :

Example 1 with MultipartBodyBuilder

use of cn.taketoday.http.client.MultipartBodyBuilder in project today-infrastructure by TAKETODAY.

the class MultipartHttpMessageWriterTests method singleSubscriberWithResource.

// SPR-16402
@Test
public void singleSubscriberWithResource() throws IOException {
    Sinks.Many<Resource> sink = Sinks.many().unicast().onBackpressureBuffer();
    Resource logo = new ClassPathResource("/cn/taketoday/http/converter/logo.jpg");
    sink.tryEmitNext(logo);
    MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder();
    bodyBuilder.asyncPart("logo", sink.asFlux(), Resource.class);
    Mono<MultiValueMap<String, HttpEntity<?>>> result = Mono.just(bodyBuilder.build());
    Map<String, Object> hints = Collections.emptyMap();
    this.writer.write(result, null, MediaType.MULTIPART_FORM_DATA, this.response, hints).block();
    MultiValueMap<String, Part> requestParts = parse(this.response, hints);
    assertThat(requestParts.size()).isEqualTo(1);
    Part part = requestParts.getFirst("logo");
    assertThat(part.name()).isEqualTo("logo");
    assertThat(part instanceof FilePart).isTrue();
    assertThat(((FilePart) part).filename()).isEqualTo("logo.jpg");
    assertThat(part.headers().getContentType()).isEqualTo(MediaType.IMAGE_JPEG);
    assertThat(part.headers().getContentLength()).isEqualTo(logo.getFile().length());
}
Also used : Sinks(reactor.core.publisher.Sinks) Resource(cn.taketoday.core.io.Resource) ClassPathResource(cn.taketoday.core.io.ClassPathResource) ClassPathResource(cn.taketoday.core.io.ClassPathResource) MultipartBodyBuilder(cn.taketoday.http.client.MultipartBodyBuilder) MultiValueMap(cn.taketoday.core.MultiValueMap) Test(org.junit.jupiter.api.Test)

Example 2 with MultipartBodyBuilder

use of cn.taketoday.http.client.MultipartBodyBuilder in project today-infrastructure by TAKETODAY.

the class MultipartHttpMessageWriterTests method writeMultipartFormData.

@Test
public void writeMultipartFormData() throws Exception {
    Resource logo = new ClassPathResource("/cn/taketoday/http/converter/logo.jpg");
    Resource utf8 = new ClassPathResource("/cn/taketoday/http/converter/logo.jpg") {

        @Override
        public String getName() {
            // SPR-12108
            return "Hall\u00F6le.jpg";
        }
    };
    Flux<DataBuffer> bufferPublisher = Flux.just(this.bufferFactory.wrap("Aa".getBytes(StandardCharsets.UTF_8)), this.bufferFactory.wrap("Bb".getBytes(StandardCharsets.UTF_8)), this.bufferFactory.wrap("Cc".getBytes(StandardCharsets.UTF_8)));
    FilePart mockPart = mock(FilePart.class);
    HttpHeaders partHeaders = HttpHeaders.create();
    partHeaders.setContentType(MediaType.TEXT_PLAIN);
    partHeaders.setContentDispositionFormData("foo", "file.txt");
    partHeaders.add("foo", "bar");
    given(mockPart.headers()).willReturn(partHeaders);
    given(mockPart.content()).willReturn(bufferPublisher);
    MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder();
    bodyBuilder.part("name 1", "value 1");
    bodyBuilder.part("name 2", "value 2+1");
    bodyBuilder.part("name 2", "value 2+2");
    bodyBuilder.part("logo", logo);
    bodyBuilder.part("utf8", utf8);
    bodyBuilder.part("json", new Foo("bar"), MediaType.APPLICATION_JSON);
    bodyBuilder.asyncPart("publisher", Flux.just("foo", "bar", "baz"), String.class);
    bodyBuilder.part("filePublisher", mockPart);
    Mono<MultiValueMap<String, HttpEntity<?>>> result = Mono.just(bodyBuilder.build());
    Map<String, Object> hints = Collections.emptyMap();
    this.writer.write(result, null, MediaType.MULTIPART_FORM_DATA, this.response, hints).block(Duration.ofSeconds(5));
    MultiValueMap<String, Part> requestParts = parse(this.response, hints);
    assertThat(requestParts.size()).isEqualTo(7);
    Part part = requestParts.getFirst("name 1");
    assertThat(part instanceof FormFieldPart).isTrue();
    assertThat(part.name()).isEqualTo("name 1");
    assertThat(((FormFieldPart) part).value()).isEqualTo("value 1");
    List<Part> parts2 = requestParts.get("name 2");
    assertThat(parts2.size()).isEqualTo(2);
    part = parts2.get(0);
    assertThat(part instanceof FormFieldPart).isTrue();
    assertThat(part.name()).isEqualTo("name 2");
    assertThat(((FormFieldPart) part).value()).isEqualTo("value 2+1");
    part = parts2.get(1);
    assertThat(part instanceof FormFieldPart).isTrue();
    assertThat(part.name()).isEqualTo("name 2");
    assertThat(((FormFieldPart) part).value()).isEqualTo("value 2+2");
    part = requestParts.getFirst("logo");
    assertThat(part instanceof FilePart).isTrue();
    assertThat(part.name()).isEqualTo("logo");
    assertThat(((FilePart) part).filename()).isEqualTo("logo.jpg");
    assertThat(part.headers().getContentType()).isEqualTo(MediaType.IMAGE_JPEG);
    assertThat(part.headers().getContentLength()).isEqualTo(logo.getFile().length());
    part = requestParts.getFirst("utf8");
    assertThat(part instanceof FilePart).isTrue();
    assertThat(part.name()).isEqualTo("utf8");
    assertThat(((FilePart) part).filename()).isEqualTo("Hall\u00F6le.jpg");
    assertThat(part.headers().getContentType()).isEqualTo(MediaType.IMAGE_JPEG);
    assertThat(part.headers().getContentLength()).isEqualTo(utf8.getFile().length());
    part = requestParts.getFirst("json");
    assertThat(part).isNotNull();
    assertThat(part.name()).isEqualTo("json");
    assertThat(part.headers().getContentType()).isEqualTo(MediaType.APPLICATION_JSON);
    String value = decodeToString(part);
    assertThat(value).isEqualTo("{\"bar\":\"bar\"}");
    part = requestParts.getFirst("publisher");
    assertThat(part).isNotNull();
    assertThat(part.name()).isEqualTo("publisher");
    value = decodeToString(part);
    assertThat(value).isEqualTo("foobarbaz");
    part = requestParts.getFirst("filePublisher");
    assertThat(part).isNotNull();
    assertThat(part.name()).isEqualTo("filePublisher");
    assertThat(part.headers()).containsEntry("foo", Collections.singletonList("bar"));
    assertThat(((FilePart) part).filename()).isEqualTo("file.txt");
    value = decodeToString(part);
    assertThat(value).isEqualTo("AaBbCc");
}
Also used : HttpHeaders(cn.taketoday.http.HttpHeaders) Resource(cn.taketoday.core.io.Resource) ClassPathResource(cn.taketoday.core.io.ClassPathResource) ClassPathResource(cn.taketoday.core.io.ClassPathResource) MultipartBodyBuilder(cn.taketoday.http.client.MultipartBodyBuilder) MultiValueMap(cn.taketoday.core.MultiValueMap) DataBuffer(cn.taketoday.core.io.buffer.DataBuffer) Test(org.junit.jupiter.api.Test)

Example 3 with MultipartBodyBuilder

use of cn.taketoday.http.client.MultipartBodyBuilder in project today-infrastructure by TAKETODAY.

the class MultipartHttpMessageWriterTests method writeMultipartRelated.

// gh-24582
@Test
public void writeMultipartRelated() {
    MediaType mediaType = MediaType.parseMediaType("multipart/related;type=foo");
    MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder();
    bodyBuilder.part("name 1", "value 1");
    bodyBuilder.part("name 2", "value 2");
    Mono<MultiValueMap<String, HttpEntity<?>>> result = Mono.just(bodyBuilder.build());
    Map<String, Object> hints = Collections.emptyMap();
    this.writer.write(result, null, mediaType, this.response, hints).block(Duration.ofSeconds(5));
    MediaType contentType = this.response.getHeaders().getContentType();
    assertThat(contentType).isNotNull();
    assertThat(contentType.isCompatibleWith(mediaType)).isTrue();
    assertThat(contentType.getParameter("type")).isEqualTo("foo");
    assertThat(contentType.getParameter("boundary")).isNotEmpty();
    assertThat(contentType.getParameter("charset")).isNull();
    MultiValueMap<String, Part> requestParts = parse(this.response, hints);
    assertThat(requestParts.size()).isEqualTo(2);
    assertThat(requestParts.getFirst("name 1").name()).isEqualTo("name 1");
    assertThat(requestParts.getFirst("name 2").name()).isEqualTo("name 2");
}
Also used : MultipartBodyBuilder(cn.taketoday.http.client.MultipartBodyBuilder) MediaType(cn.taketoday.http.MediaType) MultiValueMap(cn.taketoday.core.MultiValueMap) Test(org.junit.jupiter.api.Test)

Example 4 with MultipartBodyBuilder

use of cn.taketoday.http.client.MultipartBodyBuilder in project today-infrastructure by TAKETODAY.

the class MultipartHttpMessageWriterTests method customContentDisposition.

// SPR-16376
@Test
public void customContentDisposition() throws IOException {
    Resource logo = new ClassPathResource("/cn/taketoday/http/converter/logo.jpg");
    Flux<DataBuffer> buffers = DataBufferUtils.read(logo, DefaultDataBufferFactory.sharedInstance, 1024);
    long contentLength = logo.contentLength();
    MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder();
    bodyBuilder.part("resource", logo).headers(h -> h.setContentDispositionFormData("resource", "spring.jpg"));
    bodyBuilder.asyncPart("buffers", buffers, DataBuffer.class).headers(h -> {
        h.setContentDispositionFormData("buffers", "buffers.jpg");
        h.setContentType(MediaType.IMAGE_JPEG);
        h.setContentLength(contentLength);
    });
    MultiValueMap<String, HttpEntity<?>> multipartData = bodyBuilder.build();
    Map<String, Object> hints = Collections.emptyMap();
    this.writer.write(Mono.just(multipartData), null, MediaType.MULTIPART_FORM_DATA, this.response, hints).block();
    MultiValueMap<String, Part> requestParts = parse(this.response, hints);
    assertThat(requestParts.size()).isEqualTo(2);
    Part part = requestParts.getFirst("resource");
    assertThat(part instanceof FilePart).isTrue();
    assertThat(((FilePart) part).filename()).isEqualTo("spring.jpg");
    assertThat(part.headers().getContentLength()).isEqualTo(logo.getFile().length());
    part = requestParts.getFirst("buffers");
    assertThat(part instanceof FilePart).isTrue();
    assertThat(((FilePart) part).filename()).isEqualTo("buffers.jpg");
    assertThat(part.headers().getContentLength()).isEqualTo(logo.getFile().length());
}
Also used : HttpEntity(cn.taketoday.http.HttpEntity) Resource(cn.taketoday.core.io.Resource) ClassPathResource(cn.taketoday.core.io.ClassPathResource) ClassPathResource(cn.taketoday.core.io.ClassPathResource) MultipartBodyBuilder(cn.taketoday.http.client.MultipartBodyBuilder) DataBuffer(cn.taketoday.core.io.buffer.DataBuffer) Test(org.junit.jupiter.api.Test)

Example 5 with MultipartBodyBuilder

use of cn.taketoday.http.client.MultipartBodyBuilder in project today-framework by TAKETODAY.

the class MultipartHttpMessageWriterTests method writeMultipartFormData.

@Test
public void writeMultipartFormData() throws Exception {
    Resource logo = new ClassPathResource("/cn/taketoday/http/converter/logo.jpg");
    Resource utf8 = new ClassPathResource("/cn/taketoday/http/converter/logo.jpg") {

        @Override
        public String getName() {
            // SPR-12108
            return "Hall\u00F6le.jpg";
        }
    };
    Flux<DataBuffer> bufferPublisher = Flux.just(this.bufferFactory.wrap("Aa".getBytes(StandardCharsets.UTF_8)), this.bufferFactory.wrap("Bb".getBytes(StandardCharsets.UTF_8)), this.bufferFactory.wrap("Cc".getBytes(StandardCharsets.UTF_8)));
    FilePart mockPart = mock(FilePart.class);
    HttpHeaders partHeaders = HttpHeaders.create();
    partHeaders.setContentType(MediaType.TEXT_PLAIN);
    partHeaders.setContentDispositionFormData("foo", "file.txt");
    partHeaders.add("foo", "bar");
    given(mockPart.headers()).willReturn(partHeaders);
    given(mockPart.content()).willReturn(bufferPublisher);
    MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder();
    bodyBuilder.part("name 1", "value 1");
    bodyBuilder.part("name 2", "value 2+1");
    bodyBuilder.part("name 2", "value 2+2");
    bodyBuilder.part("logo", logo);
    bodyBuilder.part("utf8", utf8);
    bodyBuilder.part("json", new Foo("bar"), MediaType.APPLICATION_JSON);
    bodyBuilder.asyncPart("publisher", Flux.just("foo", "bar", "baz"), String.class);
    bodyBuilder.part("filePublisher", mockPart);
    Mono<MultiValueMap<String, HttpEntity<?>>> result = Mono.just(bodyBuilder.build());
    Map<String, Object> hints = Collections.emptyMap();
    this.writer.write(result, null, MediaType.MULTIPART_FORM_DATA, this.response, hints).block(Duration.ofSeconds(5));
    MultiValueMap<String, Part> requestParts = parse(this.response, hints);
    assertThat(requestParts.size()).isEqualTo(7);
    Part part = requestParts.getFirst("name 1");
    assertThat(part instanceof FormFieldPart).isTrue();
    assertThat(part.name()).isEqualTo("name 1");
    assertThat(((FormFieldPart) part).value()).isEqualTo("value 1");
    List<Part> parts2 = requestParts.get("name 2");
    assertThat(parts2.size()).isEqualTo(2);
    part = parts2.get(0);
    assertThat(part instanceof FormFieldPart).isTrue();
    assertThat(part.name()).isEqualTo("name 2");
    assertThat(((FormFieldPart) part).value()).isEqualTo("value 2+1");
    part = parts2.get(1);
    assertThat(part instanceof FormFieldPart).isTrue();
    assertThat(part.name()).isEqualTo("name 2");
    assertThat(((FormFieldPart) part).value()).isEqualTo("value 2+2");
    part = requestParts.getFirst("logo");
    assertThat(part instanceof FilePart).isTrue();
    assertThat(part.name()).isEqualTo("logo");
    assertThat(((FilePart) part).filename()).isEqualTo("logo.jpg");
    assertThat(part.headers().getContentType()).isEqualTo(MediaType.IMAGE_JPEG);
    assertThat(part.headers().getContentLength()).isEqualTo(logo.getFile().length());
    part = requestParts.getFirst("utf8");
    assertThat(part instanceof FilePart).isTrue();
    assertThat(part.name()).isEqualTo("utf8");
    assertThat(((FilePart) part).filename()).isEqualTo("Hall\u00F6le.jpg");
    assertThat(part.headers().getContentType()).isEqualTo(MediaType.IMAGE_JPEG);
    assertThat(part.headers().getContentLength()).isEqualTo(utf8.getFile().length());
    part = requestParts.getFirst("json");
    assertThat(part).isNotNull();
    assertThat(part.name()).isEqualTo("json");
    assertThat(part.headers().getContentType()).isEqualTo(MediaType.APPLICATION_JSON);
    String value = decodeToString(part);
    assertThat(value).isEqualTo("{\"bar\":\"bar\"}");
    part = requestParts.getFirst("publisher");
    assertThat(part).isNotNull();
    assertThat(part.name()).isEqualTo("publisher");
    value = decodeToString(part);
    assertThat(value).isEqualTo("foobarbaz");
    part = requestParts.getFirst("filePublisher");
    assertThat(part).isNotNull();
    assertThat(part.name()).isEqualTo("filePublisher");
    assertThat(part.headers()).containsEntry("foo", Collections.singletonList("bar"));
    assertThat(((FilePart) part).filename()).isEqualTo("file.txt");
    value = decodeToString(part);
    assertThat(value).isEqualTo("AaBbCc");
}
Also used : HttpHeaders(cn.taketoday.http.HttpHeaders) Resource(cn.taketoday.core.io.Resource) ClassPathResource(cn.taketoday.core.io.ClassPathResource) ClassPathResource(cn.taketoday.core.io.ClassPathResource) MultipartBodyBuilder(cn.taketoday.http.client.MultipartBodyBuilder) MultiValueMap(cn.taketoday.core.MultiValueMap) DataBuffer(cn.taketoday.core.io.buffer.DataBuffer) Test(org.junit.jupiter.api.Test)

Aggregations

MultipartBodyBuilder (cn.taketoday.http.client.MultipartBodyBuilder)12 Test (org.junit.jupiter.api.Test)12 MultiValueMap (cn.taketoday.core.MultiValueMap)8 ClassPathResource (cn.taketoday.core.io.ClassPathResource)6 Resource (cn.taketoday.core.io.Resource)6 DataBuffer (cn.taketoday.core.io.buffer.DataBuffer)4 HttpEntity (cn.taketoday.http.HttpEntity)2 HttpHeaders (cn.taketoday.http.HttpHeaders)2 MediaType (cn.taketoday.http.MediaType)2 MultipartHttpMessageWriter (cn.taketoday.http.codec.multipart.MultipartHttpMessageWriter)2 Sinks (reactor.core.publisher.Sinks)2