com.emc.esu.sysmgmt.SysMgmtUtils Maven / Gradle / Ivy
/*
* Copyright 2013 EMC Corporation. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://www.apache.org/licenses/LICENSE-2.0.txt
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package com.emc.esu.sysmgmt;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import org.apache.log4j.Logger;
import org.jdom.Document;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
/**
* @author cwikj
*
*/
public class SysMgmtUtils {
private static final Logger l4j = Logger.getLogger(SysMgmtUtils.class);
/**
* Reads the response body and returns it in a byte array.
*
* @param con the HTTP connection
* @return the byte array containing the response body. Note that if you
* pass in a buffer, this will the same buffer object. Be sure to
* check the content length to know what data in the buffer is valid
* (from zero to contentLength).
* @throws IOException if reading the response stream fails.
*/
public static byte[] readResponse(HttpURLConnection con)
throws IOException {
InputStream in = null;
if (con.getResponseCode() > 299) {
in = con.getErrorStream();
if (in == null) {
in = con.getInputStream();
}
} else {
in = con.getInputStream();
}
if (in == null) {
// could not get stream
return new byte[0];
}
try {
byte[] output;
int contentLength = con.getContentLength();
// If we know the content length, read it directly into a buffer.
if (contentLength != -1) {
output = new byte[con.getContentLength()];
int c = 0;
while (c < contentLength) {
int read = in.read(output, c, contentLength - c);
if (read == -1) {
// EOF!
throw new EOFException(
"EOF reading response at position " + c
+ " size " + (contentLength - c));
}
c += read;
}
return output;
} else {
l4j.debug("Content length is unknown. Buffering output.");
// Else, use a ByteArrayOutputStream to collect the response.
byte[] buffer = new byte[4096];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int c = 0;
while ((c = in.read(buffer)) != -1) {
baos.write(buffer, 0, c);
}
baos.close();
l4j.debug("Buffered " + baos.size() + " response bytes");
return baos.toByteArray();
}
} finally {
if (in != null) {
in.close();
}
}
}
public static Document parseResponseXml(HttpURLConnection con) throws IOException, JDOMException {
byte[] data = readResponse(con);
if(l4j.isDebugEnabled()) {
l4j.debug("Response: " + new String(data, "UTF-8"));
}
SAXBuilder sb = new SAXBuilder();
Document d = sb.build(new ByteArrayInputStream(data));
return d;
}
}