diff --git a/library/src/main/java/com/okta/oidc/net/HttpResponse.java b/library/src/main/java/com/okta/oidc/net/HttpResponse.java index 7262848c..b430f6a5 100644 --- a/library/src/main/java/com/okta/oidc/net/HttpResponse.java +++ b/library/src/main/java/com/okta/oidc/net/HttpResponse.java @@ -111,11 +111,28 @@ public JSONObject asJson() throws IOException, JSONException { mStatusCode >= HttpURLConnection.HTTP_MULT_CHOICE) { throw new HttpStatusCodeException(mStatusCode, mHttpClient.getResponseMessage()); } - InputStream is = getContent(); - if (is == null) { + return getJsonObjectFromResponseInputStream(getContent()); + } + + public JSONObject asJsonWithErrorDescription() throws IOException, JSONException { + if (mStatusCode < HttpURLConnection.HTTP_OK || + mStatusCode >= HttpURLConnection.HTTP_MULT_CHOICE) { + try { + return getJsonObjectFromResponseInputStream(getContent()); + } catch (Exception any) { + throw new HttpStatusCodeException(mStatusCode, mHttpClient.getResponseMessage()); + } + } + return getJsonObjectFromResponseInputStream(getContent()); + } + + private static JSONObject getJsonObjectFromResponseInputStream( + final InputStream inputStream + ) throws IOException, JSONException { + if (inputStream == null) { throw new IOException("Input stream must not be null"); } - BufferedReader reader = new BufferedReader(new InputStreamReader(is)); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); Writer writer = new StringWriter(); String line = reader.readLine(); while (line != null) { diff --git a/library/src/main/java/com/okta/oidc/net/request/TokenRequest.java b/library/src/main/java/com/okta/oidc/net/request/TokenRequest.java index b469a4ba..5a328dfd 100644 --- a/library/src/main/java/com/okta/oidc/net/request/TokenRequest.java +++ b/library/src/main/java/com/okta/oidc/net/request/TokenRequest.java @@ -128,7 +128,7 @@ public TokenResponse executeRequest(OktaHttpClient client) throws AuthorizationE TokenResponse tokenResponse; try { response = openConnection(client); - JSONObject json = response.asJson(); + JSONObject json = response.asJsonWithErrorDescription(); if (json.has(AuthorizationException.PARAM_ERROR)) { try { final String error = json.getString(AuthorizationException.PARAM_ERROR); diff --git a/library/src/test/java/com/okta/oidc/clients/sessions/SessionClientImplTest.java b/library/src/test/java/com/okta/oidc/clients/sessions/SessionClientImplTest.java index bb639b3a..530a5da4 100644 --- a/library/src/test/java/com/okta/oidc/clients/sessions/SessionClientImplTest.java +++ b/library/src/test/java/com/okta/oidc/clients/sessions/SessionClientImplTest.java @@ -232,7 +232,8 @@ public void refreshTokenFailure() throws InterruptedException { latch.await(); assertNull(cb.getResult()); assertNotNull(cb.getException()); - assertEquals(cb.getException().getMessage(), "Invalid status code 401 Client Error"); + assertEquals(cb.getException().getMessage(), "No client credentials found."); + assertEquals(cb.getException().type, TYPE_OAUTH_TOKEN_ERROR); } @Test