diff --git a/retrofit/src/main/java/retrofit2/RequestBuilder.java b/retrofit/src/main/java/retrofit2/RequestBuilder.java index 1303418d3e4442ebc0598c1227a50294249a8b38..3a25b6f53229c21d8fe7ee660d15d00e1b798ded 100644 --- a/retrofit/src/main/java/retrofit2/RequestBuilder.java +++ b/retrofit/src/main/java/retrofit2/RequestBuilder.java @@ -75,7 +75,11 @@ final class RequestBuilder { void addHeader(String name, String value) { if ("Content-Type".equalsIgnoreCase(name)) { - contentType = MediaType.parse(value); + MediaType type = MediaType.parse(value); + if (type == null) { + throw new IllegalArgumentException("Malformed content type: " + value); + } + contentType = type; } else { requestBuilder.addHeader(name, value); } diff --git a/retrofit/src/main/java/retrofit2/ServiceMethod.java b/retrofit/src/main/java/retrofit2/ServiceMethod.java index facede01fe60adc2f01e9d7c320975f6d9e70a71..26706453a3e826af2abb20114b57fbd2b665604f 100644 --- a/retrofit/src/main/java/retrofit2/ServiceMethod.java +++ b/retrofit/src/main/java/retrofit2/ServiceMethod.java @@ -314,7 +314,11 @@ final class ServiceMethod { String headerName = header.substring(0, colon); String headerValue = header.substring(colon + 1).trim(); if ("Content-Type".equalsIgnoreCase(headerName)) { - contentType = MediaType.parse(headerValue); + MediaType type = MediaType.parse(headerValue); + if (type == null) { + throw methodError("Malformed content type: %s", headerValue); + } + contentType = type; } else { builder.add(headerName, headerValue); } diff --git a/retrofit/src/test/java/retrofit2/RequestBuilderTest.java b/retrofit/src/test/java/retrofit2/RequestBuilderTest.java index 042e08fd15a85b50697271905256450f2455d6f2..1a355feeee351acff66617b6edbbf120d8908960 100644 --- a/retrofit/src/test/java/retrofit2/RequestBuilderTest.java +++ b/retrofit/src/test/java/retrofit2/RequestBuilderTest.java @@ -2395,6 +2395,24 @@ public final class RequestBuilderTest { assertThat(request.body().contentType().toString()).isEqualTo("text/not-plain"); } + @Test public void malformedContentTypeHeaderThrows() { + class Example { + @POST("/") // + @Headers("Content-Type: hello, world!") // + Call method(@Body RequestBody body) { + return null; + } + } + RequestBody body = RequestBody.create(MediaType.parse("text/plain"), "hi"); + try { + buildRequest(Example.class, body); + fail(); + } catch (IllegalArgumentException e) { + assertThat(e).hasMessage("Malformed content type: hello, world!\n" + + " for method Example.method"); + } + } + @Test public void contentTypeAnnotationHeaderAddsHeaderWithNoBody() { class Example { @DELETE("/") // @@ -2419,6 +2437,22 @@ public final class RequestBuilderTest { assertThat(request.body().contentType().toString()).isEqualTo("text/not-plain"); } + @Test public void malformedContentTypeParameterThrows() { + class Example { + @POST("/") // + Call method(@Header("Content-Type") String contentType, @Body RequestBody body) { + return null; + } + } + RequestBody body = RequestBody.create(MediaType.parse("text/plain"), "hi"); + try { + buildRequest(Example.class, "hello, world!", body); + fail(); + } catch (IllegalArgumentException e) { + assertThat(e).hasMessage("Malformed content type: hello, world!"); + } + } + @Test public void malformedAnnotationRelativeUrlThrows() { class Example { @GET("ftp://example.org")