HBASE-27473 Fix spotbugs warnings in hbase-rest Client.getResponseBody (#4867)

Signed-off-by: Xin Sun <ddupgs@gmail.com>
This commit is contained in:
Duo Zhang 2022-11-10 12:05:52 +08:00 committed by GitHub
parent b1a648ffea
commit 2d87994f68
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 24 additions and 21 deletions

View File

@ -19,7 +19,6 @@ package org.apache.hadoop.hbase.rest.client;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@ -65,6 +64,9 @@ import org.apache.yetus.audience.InterfaceAudience;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.hbase.thirdparty.com.google.common.io.ByteStreams;
import org.apache.hbase.thirdparty.com.google.common.io.Closeables;
/**
* A wrapper around HttpClient which provides some useful function and semantics for interacting
* with the REST gateway.
@ -492,28 +494,29 @@ public class Client {
* @return The response body, null if body is empty
* @throws IOException If an I/O (transport) problem occurs while obtaining the response body.
*/
@edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "NP_LOAD_OF_KNOWN_NULL_VALUE",
justification = "null is possible return value")
public static byte[] getResponseBody(HttpResponse resp) throws IOException {
if (resp.getEntity() == null) return null;
try (InputStream instream = resp.getEntity().getContent()) {
if (instream != null) {
if (resp.getEntity() == null) {
return null;
}
InputStream instream = resp.getEntity().getContent();
if (instream == null) {
return null;
}
try {
long contentLength = resp.getEntity().getContentLength();
if (contentLength > Integer.MAX_VALUE) {
// guard integer cast from overflow
throw new IOException("Content too large to be buffered: " + contentLength + " bytes");
}
ByteArrayOutputStream outstream =
new ByteArrayOutputStream(contentLength > 0 ? (int) contentLength : 4 * 1024);
byte[] buffer = new byte[4096];
int len;
while ((len = instream.read(buffer)) > 0) {
outstream.write(buffer, 0, len);
if (contentLength > 0) {
byte[] content = new byte[(int) contentLength];
ByteStreams.readFully(instream, content);
return content;
} else {
return ByteStreams.toByteArray(instream);
}
outstream.close();
return outstream.toByteArray();
}
return null;
} finally {
Closeables.closeQuietly(instream);
}
}