diff --git a/pom.xml b/pom.xml index 959ff2959e..cf085263fb 100644 --- a/pom.xml +++ b/pom.xml @@ -33,8 +33,8 @@ UTF-8 - 4.4.2.2 - 4.4.2 + 4.5.0.0 + 4.5.0 true 2.2 4.9.2 diff --git a/src/main/java/org/kohsuke/github/GitHubClient.java b/src/main/java/org/kohsuke/github/GitHubClient.java index 4e20e55c03..fefd6cb0c3 100644 --- a/src/main/java/org/kohsuke/github/GitHubClient.java +++ b/src/main/java/org/kohsuke/github/GitHubClient.java @@ -578,20 +578,12 @@ private void detectInvalidCached404Response(GitHubConnectorResponse connectorRes private void noteRateLimit(@Nonnull RateLimitTarget rateLimitTarget, @Nonnull GitHubConnectorResponse connectorResponse) { try { - String limitString = Objects.requireNonNull(connectorResponse.header("X-RateLimit-Limit"), - "Missing X-RateLimit-Limit"); - String remainingString = Objects.requireNonNull(connectorResponse.header("X-RateLimit-Remaining"), - "Missing X-RateLimit-Remaining"); - String resetString = Objects.requireNonNull(connectorResponse.header("X-RateLimit-Reset"), - "Missing X-RateLimit-Reset"); - int limit, remaining; - long reset; - limit = Integer.parseInt(limitString); - remaining = Integer.parseInt(remainingString); - reset = Long.parseLong(resetString); + int limit = connectorResponse.parseInt("X-RateLimit-Limit"); + int remaining = connectorResponse.parseInt("X-RateLimit-Remaining"); + int reset = connectorResponse.parseInt("X-RateLimit-Reset"); GHRateLimit.Record observed = new GHRateLimit.Record(limit, remaining, reset, connectorResponse); updateRateLimit(GHRateLimit.fromRecord(observed, rateLimitTarget)); - } catch (NumberFormatException | NullPointerException e) { + } catch (NumberFormatException e) { LOGGER.log(FINEST, "Missing or malformed X-RateLimit header: ", e); } } diff --git a/src/main/java/org/kohsuke/github/GitHubResponse.java b/src/main/java/org/kohsuke/github/GitHubResponse.java index ffb6608243..292b3b4524 100644 --- a/src/main/java/org/kohsuke/github/GitHubResponse.java +++ b/src/main/java/org/kohsuke/github/GitHubResponse.java @@ -122,10 +122,11 @@ static T parseBody(GitHubConnectorResponse connectorResponse, T instance) th /** * Gets the body of the response as a {@link String}. * + * @param connectorResponse + * the response to read * @return the body of the response as a {@link String}. * @throws IOException * if an I/O Exception occurs. - * @param connectorResponse */ @Nonnull static String getBodyAsString(GitHubConnectorResponse connectorResponse) throws IOException { @@ -138,15 +139,16 @@ static String getBodyAsString(GitHubConnectorResponse connectorResponse) throws /** * Gets the body of the response as a {@link String}. * + * @param connectorResponse + * the response to read * @return the body of the response as a {@link String}. * @throws IOException * if an I/O Exception occurs. - * @param connectorResponse */ static String getBodyAsStringOrNull(GitHubConnectorResponse connectorResponse) { try { return getBodyAsString(connectorResponse); - } catch (NullPointerException | IOException e) { + } catch (IOException e) { } return null; } diff --git a/src/main/java/org/kohsuke/github/connector/GitHubConnectorResponse.java b/src/main/java/org/kohsuke/github/connector/GitHubConnectorResponse.java index 3700236074..c73b2e0c8d 100644 --- a/src/main/java/org/kohsuke/github/connector/GitHubConnectorResponse.java +++ b/src/main/java/org/kohsuke/github/connector/GitHubConnectorResponse.java @@ -86,8 +86,9 @@ public String header(String name) { * * @return the response body * @throws IOException - * if an I/O Exception occurs. + * if response stream is null or an I/O Exception occurs. */ + @Nonnull public abstract InputStream bodyStream() throws IOException; /** @@ -121,7 +122,7 @@ public Map> allHeaders() { } /** - * Handles the "Content-Encoding" header. + * Handles wrapping the body stream if indicated by the "Content-Encoding" header. * * @param stream * the stream to possibly wrap @@ -139,6 +140,24 @@ protected InputStream wrapStream(InputStream stream) throws IOException { throw new UnsupportedOperationException("Unexpected Content-Encoding: " + encoding); } + /** + * Parse a header value as a signed decimal integer. + * + * @param name + * the header field to parse + * @return integer value of the header field + * @throws NumberFormatException + * if the header is missing or does not contain a parsable integer. + */ + public final int parseInt(String name) throws NumberFormatException { + try { + String headerValue = header(name); + return Integer.parseInt(headerValue); + } catch (NumberFormatException e) { + throw new NumberFormatException(name + ": " + e.getMessage()); + } + } + public abstract static class ByteArrayResponse extends GitHubConnectorResponse { private boolean inputStreamRead = false; @@ -155,6 +174,7 @@ protected ByteArrayResponse(@Nonnull GitHubConnectorRequest request, * {@inheritDoc} */ @Override + @Nonnull public InputStream bodyStream() throws IOException { if (isClosed) { throw new IOException("Response is closed"); @@ -171,7 +191,11 @@ public InputStream bodyStream() throws IOException { } } - return inputBytes == null ? null : new ByteArrayInputStream(inputBytes); + if (inputBytes == null) { + throw new IOException("Response body missing, stream null"); + } + + return new ByteArrayInputStream(inputBytes); } /** diff --git a/src/main/java/org/kohsuke/github/internal/EnumUtils.java b/src/main/java/org/kohsuke/github/internal/EnumUtils.java index 7d247ad807..9c4253b3cc 100644 --- a/src/main/java/org/kohsuke/github/internal/EnumUtils.java +++ b/src/main/java/org/kohsuke/github/internal/EnumUtils.java @@ -49,12 +49,15 @@ public static > E getNullableEnumOrDefault(Class enumClass, */ public static > E getEnumOrDefault(Class enumClass, String value, E defaultEnum) { try { - return Enum.valueOf(enumClass, value.toUpperCase(Locale.ROOT)); - } catch (NullPointerException | IllegalArgumentException e) { - LOGGER.warning("Unknown value " + value + " for enum class " + enumClass.getName() + ", defaulting to " - + defaultEnum.name()); - return defaultEnum; + if (value != null) { + return Enum.valueOf(enumClass, value.toUpperCase(Locale.ROOT)); + } + } catch (IllegalArgumentException e) { } + + LOGGER.warning("Unknown value " + value + " for enum class " + enumClass.getName() + ", defaulting to " + + defaultEnum.name()); + return defaultEnum; } private EnumUtils() {