1313 */
1414package feign ;
1515
16- import java .util .HashMap ;
1716import okhttp3 .mockwebserver .MockResponse ;
1817import okhttp3 .mockwebserver .MockWebServer ;
1918import org .assertj .core .data .MapEntry ;
2827import java .lang .reflect .Type ;
2928import java .util .Arrays ;
3029import java .util .Collections ;
30+ import java .util .HashMap ;
3131import java .util .Iterator ;
3232import java .util .List ;
3333import java .util .Map ;
34+ import java .util .Optional ;
3435import java .util .concurrent .atomic .AtomicBoolean ;
3536import java .util .concurrent .atomic .AtomicInteger ;
37+ import java .util .stream .Stream ;
3638import feign .codec .Decoder ;
3739import feign .codec .Encoder ;
3840import static feign .assertj .MockWebServerAssertions .assertThat ;
@@ -64,6 +66,9 @@ public void testDefaults() throws Exception {
6466 /** Shows exception handling isn't required to coerce 404 to null or empty */
6567 @ Test
6668 public void testDecode404 () throws Exception {
69+ server .enqueue (new MockResponse ().setResponseCode (404 ));
70+ server .enqueue (new MockResponse ().setResponseCode (404 ));
71+ server .enqueue (new MockResponse ().setResponseCode (404 ));
6772 server .enqueue (new MockResponse ().setResponseCode (404 ));
6873 server .enqueue (new MockResponse ().setResponseCode (404 ));
6974 server .enqueue (new MockResponse ().setResponseCode (400 ));
@@ -72,6 +77,36 @@ public void testDecode404() throws Exception {
7277 TestInterface api = Feign .builder ().decode404 ().target (TestInterface .class , url );
7378
7479 assertThat (api .getQueues ("/" )).isEmpty (); // empty, not null!
80+ assertThat (api .decodedLazyPost ()).isEmpty (); // empty, not null!
81+ assertThat (api .optionalContent ()).isEmpty (); // empty, not null!
82+ assertThat (api .streamPost ()).isEmpty (); // empty, not null!
83+ assertThat (api .decodedPost ()).isNull (); // null, not empty!
84+
85+ try { // ensure other 400 codes are not impacted.
86+ api .decodedPost ();
87+ failBecauseExceptionWasNotThrown (FeignException .class );
88+ } catch (FeignException e ) {
89+ assertThat (e .status ()).isEqualTo (400 );
90+ }
91+ }
92+
93+ /** Shows exception handling isn't required to coerce 204 to null or empty */
94+ @ Test
95+ public void testDecode204 () throws Exception {
96+ server .enqueue (new MockResponse ().setResponseCode (204 ));
97+ server .enqueue (new MockResponse ().setResponseCode (204 ));
98+ server .enqueue (new MockResponse ().setResponseCode (204 ));
99+ server .enqueue (new MockResponse ().setResponseCode (204 ));
100+ server .enqueue (new MockResponse ().setResponseCode (204 ));
101+ server .enqueue (new MockResponse ().setResponseCode (400 ));
102+
103+ String url = "http://localhost:" + server .getPort ();
104+ TestInterface api = Feign .builder ().target (TestInterface .class , url );
105+
106+ assertThat (api .getQueues ("/" )).isEmpty (); // empty, not null!
107+ assertThat (api .decodedLazyPost ()).isEmpty (); // empty, not null!
108+ assertThat (api .optionalContent ()).isEmpty (); // empty, not null!
109+ assertThat (api .streamPost ()).isEmpty (); // empty, not null!
75110 assertThat (api .decodedPost ()).isNull (); // null, not empty!
76111
77112 try { // ensure other 400 codes are not impacted.
@@ -467,6 +502,12 @@ interface TestInterface {
467502 @ RequestLine ("POST /" )
468503 Iterator <String > decodedLazyPost ();
469504
505+ @ RequestLine ("POST /" )
506+ Optional <String > optionalContent ();
507+
508+ @ RequestLine ("POST /" )
509+ Stream <String > streamPost ();
510+
470511 @ RequestLine (value = "GET /api/queues/{vhost}" , decodeSlash = false )
471512 byte [] getQueues (@ Param ("vhost" ) String vhost );
472513
0 commit comments