From b79d6fcf83bc56b6ab0459c0f63688a2b6197b28 Mon Sep 17 00:00:00 2001 From: jaimepineiro <45460679+jaimepineiro@users.noreply.github.com> Date: Wed, 3 Feb 2021 05:27:42 +0100 Subject: [PATCH 1/3] Use charset from response Content-Type header to decode (#1302) * If charset is set in Content-type, we decode response using that charset * Java 8 compatibility * Format fix * Moving code to get charset to Response in order to be used by another decoders --- core/src/main/java/feign/Response.java | 19 ++++++++++++++ .../java/feign/jackson/JacksonDecoder.java | 13 ++++++---- .../java/feign/jackson/JacksonCodecTest.java | 26 +++++++++++++++++++ 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/feign/Response.java b/core/src/main/java/feign/Response.java index 175a78a2c..4479b1848 100644 --- a/core/src/main/java/feign/Response.java +++ b/core/src/main/java/feign/Response.java @@ -175,6 +175,25 @@ public Request request() { return request; } + public Charset charset() { + + Collection contentTypeHeaders = headers().get("Content-Type"); + + if (contentTypeHeaders != null) { + for (String contentTypeHeader : contentTypeHeaders) { + String[] contentTypeParmeters = contentTypeHeader.split(";"); + if (contentTypeParmeters.length > 1) { + String[] charsetParts = contentTypeParmeters[1].split("="); + if (charsetParts.length == 2 && "charset".equalsIgnoreCase(charsetParts[0].trim())) { + return Charset.forName(charsetParts[1]); + } + } + } + } + + return Util.UTF_8; + } + @Override public String toString() { StringBuilder builder = new StringBuilder("HTTP/1.1 ").append(status); diff --git a/jackson/src/main/java/feign/jackson/JacksonDecoder.java b/jackson/src/main/java/feign/jackson/JacksonDecoder.java index f4fa98575..d6c6bd84e 100644 --- a/jackson/src/main/java/feign/jackson/JacksonDecoder.java +++ b/jackson/src/main/java/feign/jackson/JacksonDecoder.java @@ -13,15 +13,17 @@ */ package feign.jackson; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.Module; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.RuntimeJsonMappingException; import java.io.BufferedReader; import java.io.IOException; import java.io.Reader; import java.lang.reflect.Type; +import java.nio.charset.Charset; +import java.util.Collection; import java.util.Collections; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.Module; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.RuntimeJsonMappingException; import feign.Response; import feign.Util; import feign.codec.Decoder; @@ -47,7 +49,7 @@ public JacksonDecoder(ObjectMapper mapper) { public Object decode(Response response, Type type) throws IOException { if (response.body() == null) return null; - Reader reader = response.body().asReader(Util.UTF_8); + Reader reader = response.body().asReader(response.charset()); if (!reader.markSupported()) { reader = new BufferedReader(reader, 1); } @@ -66,4 +68,5 @@ public Object decode(Response response, Type type) throws IOException { throw e; } } + } diff --git a/jackson/src/test/java/feign/jackson/JacksonCodecTest.java b/jackson/src/test/java/feign/jackson/JacksonCodecTest.java index 2b0d4bfdd..2b8bffcdd 100644 --- a/jackson/src/test/java/feign/jackson/JacksonCodecTest.java +++ b/jackson/src/test/java/feign/jackson/JacksonCodecTest.java @@ -28,9 +28,12 @@ import org.junit.Test; import java.io.Closeable; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; @@ -169,6 +172,29 @@ public void customEncoder() { + "} ]"); } + @Test + public void decoderCharset() throws IOException { + Zone zone = new Zone("denominator.io.", "ÁÉÍÓÚÀÈÌÒÙÄËÏÖÜÑ"); + + Map> headers = new HashMap>(); + headers.put("Content-Type", Arrays.asList("application/json;charset=ISO-8859-1")); + + Response response = Response.builder() + .status(200) + .reason("OK") + .request(Request.create(HttpMethod.GET, "/api", Collections.emptyMap(), null, Util.UTF_8)) + .headers(headers) + .body(new String("" // + + "{" + System.lineSeparator() + + " \"name\" : \"DENOMINATOR.IO.\"," + System.lineSeparator() + + " \"id\" : \"ÁÉÍÓÚÀÈÌÒÙÄËÏÖÜÑ\"" + System.lineSeparator() + + "}").getBytes(StandardCharsets.ISO_8859_1)) + .build(); + assertEquals(zone.get("id"), + ((Zone) new JacksonDecoder().decode(response, new TypeReference() {}.getType())) + .get("id")); + } + @Test public void decodesIterator() throws Exception { List zones = new LinkedList(); From 9a4b75c917ee5ed361bee874451455d390c228a2 Mon Sep 17 00:00:00 2001 From: Kevin Davis Date: Fri, 5 Feb 2021 09:53:03 -0500 Subject: [PATCH 2/3] Jackson: Updating License Headers for 2021 --- jackson/src/main/java/feign/jackson/JacksonDecoder.java | 2 +- jackson/src/test/java/feign/jackson/JacksonCodecTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jackson/src/main/java/feign/jackson/JacksonDecoder.java b/jackson/src/main/java/feign/jackson/JacksonDecoder.java index d6c6bd84e..6b24843d4 100644 --- a/jackson/src/main/java/feign/jackson/JacksonDecoder.java +++ b/jackson/src/main/java/feign/jackson/JacksonDecoder.java @@ -1,5 +1,5 @@ /** - * Copyright 2012-2020 The Feign Authors + * Copyright 2012-2021 The Feign 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 diff --git a/jackson/src/test/java/feign/jackson/JacksonCodecTest.java b/jackson/src/test/java/feign/jackson/JacksonCodecTest.java index 2b8bffcdd..ecc58f540 100644 --- a/jackson/src/test/java/feign/jackson/JacksonCodecTest.java +++ b/jackson/src/test/java/feign/jackson/JacksonCodecTest.java @@ -1,5 +1,5 @@ /** - * Copyright 2012-2020 The Feign Authors + * Copyright 2012-2021 The Feign 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 From ee8d5174d2d7ae19d3f88d7177407cb03b8635c5 Mon Sep 17 00:00:00 2001 From: jdpc86 Date: Sun, 14 Feb 2021 20:51:44 -0500 Subject: [PATCH 3/3] updated com.spotify:docker-maven-plugin version to be 1.2.2 (#1364) * updated com.spotify:docker-maven-plugin version to be 1.2.2, this fixed plugin not found in Intellij 2020.03 * ./mvnw license:format to update license --- apt-test-generator/pom.xml | 3 ++- pom.xml | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apt-test-generator/pom.xml b/apt-test-generator/pom.xml index eb2388464..1c5ec2976 100644 --- a/apt-test-generator/pom.xml +++ b/apt-test-generator/pom.xml @@ -1,7 +1,7 @@ com.spotify docker-maven-plugin + ${docker-maven-plugin.version} ${project.build.directory}/classes/docker/ diff --git a/pom.xml b/pom.xml index 2db3712a0..16b6e3d42 100644 --- a/pom.xml +++ b/pom.xml @@ -1,7 +1,7 @@