import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;

import org.junit.Assert;
import org.junit.Test;

/**
 * Reproduces the following exception:
 * 
 * <pre>
 * java.io.IOException: Premature EOF
 * 	at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:538)
 * 	at sun.net.www.http.ChunkedInputStream.readAhead(ChunkedInputStream.java:582)
 * 	at sun.net.www.http.ChunkedInputStream.read(ChunkedInputStream.java:669)
 * 	at java.io.FilterInputStream.read(FilterInputStream.java:116)
 * 	at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2512)
 * 	at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2507)
 * 	at PrematureEofTest.testDownloadXml(PrematureEofTest.java:24)
 *     ...
 * </pre>
 * 
 * This seems to happen when Jenkins sends an HTTP response with the "Transfer-Encoding=[chunked]" header field.
 */
public class PrematureEofTest extends Assert {

	@Test
	public void testDownloadXml() throws Exception {
		ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
		try {
			URL jenkinsUrl = new URL("http://localhost:8080/jenkins/api/xml?depth=0");
			URLConnection connection = jenkinsUrl.openConnection();

			Map<String, List<String>> headerFields = connection.getHeaderFields();
			System.out.println("HeaderFields: " + headerFields);

			InputStream inputStream = connection.getInputStream();
			byte[] buf = new byte[1024];
			int length = 0;
			while ((length = inputStream.read(buf)) > -1) {
				byteOut.write(buf, 0, length);
			}
		} catch (Exception e) {
			if (byteOut.size() > 0) {
				// System.out.println("Data[" + new String(byteOut.toByteArray()) + "]");
			}
			e.printStackTrace();
			fail("An exception occurred");
		}
	}
}