package net.minecraft.util;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.Proxy;
import java.net.ServerSocket;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.atomic.AtomicInteger;
import net.minecraft.server.MinecraftServer;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class HttpUtil
{
/** The number of download threads that we have started so far. */
private static final AtomicInteger downloadThreadsStarted = new AtomicInteger(0);
private static final Logger logger = LogManager.getLogger();
private static final String __OBFID = "CL_00001485";
/**
* Builds an encoded HTTP POST content string from a string map
*/
public static String buildPostString(Map data)
{
StringBuilder stringbuilder = new StringBuilder();
Iterator iterator = data.entrySet().iterator();
while (iterator.hasNext())
{
Entry entry = (Entry)iterator.next();
if (stringbuilder.length() > 0)
{
stringbuilder.append('&');
}
try
{
stringbuilder.append(URLEncoder.encode((String)entry.getKey(), "UTF-8"));
}
catch (UnsupportedEncodingException unsupportedencodingexception1)
{
unsupportedencodingexception1.printStackTrace();
}
if (entry.getValue() != null)
{
stringbuilder.append('=');
try
{
stringbuilder.append(URLEncoder.encode(entry.getValue().toString(), "UTF-8"));
}
catch (UnsupportedEncodingException unsupportedencodingexception)
{
unsupportedencodingexception.printStackTrace();
}
}
}
return stringbuilder.toString();
}
/**
* Sends a POST to the given URL using the map as the POST args
*/
public static String postMap(URL url, Map data, boolean skipLoggingErrors)
{
/**
* Sends a POST to the given URL
*
* @param content Formatted POST args (key=value&key2=value2&etc=etc) Should be encoded properly or an error may
* occur.
*/
return post(url, buildPostString(data), skipLoggingErrors);
}
/**
* Sends a POST to the given URL
*
* @param content Formatted POST args (key=value&key2=value2&etc=etc) Should be encoded properly or an error may
* occur.
*/
private static String post(URL url, String content, boolean skipLoggingErrors)
{
try
{
Proxy proxy = MinecraftServer.getServer() == null ? null : MinecraftServer.getServer().getServerProxy();
if (proxy == null)
{
proxy = Proxy.NO_PROXY;
}
HttpURLConnection httpurlconnection = (HttpURLConnection)url.openConnection(proxy);
httpurlconnection.setRequestMethod("POST");
httpurlconnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
httpurlconnection.setRequestProperty("Content-Length", "" + content.getBytes().length);
httpurlconnection.setRequestProperty("Content-Language", "en-US");
httpurlconnection.setUseCaches(false);
httpurlconnection.setDoInput(true);
httpurlconnection.setDoOutput(true);
DataOutputStream dataoutputstream = new DataOutputStream(httpurlconnection.getOutputStream());
dataoutputstream.writeBytes(content);
dataoutputstream.flush();
dataoutputstream.close();
BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(httpurlconnection.getInputStream()));
StringBuffer stringbuffer = new StringBuffer();
String s1;
while ((s1 = bufferedreader.readLine()) != null)
{
stringbuffer.append(s1);
stringbuffer.append('\r');
}
bufferedreader.close();
return stringbuffer.toString();
}
catch (Exception exception)
{
if (!skipLoggingErrors)
{
logger.error("Could not post to " + url, exception);
}
return "";
}
}
@SideOnly(Side.CLIENT)
public static void downloadResourcePack(final File packFile, final String packName, final HttpUtil.DownloadListener completionListener, final Map requestData, final int maxSize, final IProgressUpdate loadingScreen, final Proxy proxy)
{
Thread thread = new Thread(new Runnable()
{
private static final String __OBFID = "CL_00001486";
public void run()
{
URLConnection urlconnection = null;
InputStream inputstream = null;
DataOutputStream dataoutputstream = null;
if (loadingScreen != null)
{
loadingScreen.resetProgressAndMessage("Downloading Texture Pack");
loadingScreen.displayLoadingString("Making Request...");
}
try
{
try
{
byte[] abyte = new byte[4096];
URL url = new URL(packName);
urlconnection = url.openConnection(proxy);
float f = 0.0F;
float f1 = (float)requestData.entrySet().size();
Iterator iterator = requestData.entrySet().iterator();
while (iterator.hasNext())
{
Entry entry = (Entry)iterator.next();
urlconnection.setRequestProperty((String)entry.getKey(), (String)entry.getValue());
if (loadingScreen != null)
{
loadingScreen.setLoadingProgress((int)(++f / f1 * 100.0F));
}
}
inputstream = urlconnection.getInputStream();
f1 = (float)urlconnection.getContentLength();
int i = urlconnection.getContentLength();
if (loadingScreen != null)
{
loadingScreen.displayLoadingString(String.format("Downloading file (%.2f MB)...", new Object[] {Float.valueOf(f1 / 1000.0F / 1000.0F)}));
}
if (packFile.exists())
{
long j = packFile.length();
if (j == (long)i)
{
completionListener.onDownloadComplete(packFile);
if (loadingScreen != null)
{
loadingScreen.setDoneWorking();
}
return;
}
HttpUtil.logger.warn("Deleting " + packFile + " as it does not match what we currently have (" + i + " vs our " + j + ").");
packFile.delete();
}
else if (packFile.getParentFile() != null)
{
packFile.getParentFile().mkdirs();
}
dataoutputstream = new DataOutputStream(new FileOutputStream(packFile));
if (maxSize > 0 && f1 > (float)maxSize)
{
if (loadingScreen != null)
{
loadingScreen.setDoneWorking();
}
throw new IOException("Filesize is bigger than maximum allowed (file is " + f + ", limit is " + maxSize + ")");
}
boolean flag = false;
int k;
while ((k = inputstream.read(abyte)) >= 0)
{
f += (float)k;
if (loadingScreen != null)
{
loadingScreen.setLoadingProgress((int)(f / f1 * 100.0F));
}
if (maxSize > 0 && f > (float)maxSize)
{
if (loadingScreen != null)
{
loadingScreen.setDoneWorking();
}
throw new IOException("Filesize was bigger than maximum allowed (got >= " + f + ", limit was " + maxSize + ")");
}
dataoutputstream.write(abyte, 0, k);
}
completionListener.onDownloadComplete(packFile);
if (loadingScreen != null)
{
loadingScreen.setDoneWorking();
return;
}
}
catch (Throwable throwable)
{
throwable.printStackTrace();
}
}
finally
{
try
{
if (inputstream != null)
{
inputstream.close();
}
}
catch (IOException ioexception1)
{
;
}
try
{
if (dataoutputstream != null)
{
dataoutputstream.close();
}
}
catch (IOException ioexception)
{
;
}
}
}
}, "File Downloader #" + downloadThreadsStarted.incrementAndGet());
thread.setDaemon(true);
thread.start();
}
@SideOnly(Side.CLIENT)
public static int getSuitableLanPort() throws IOException
{
ServerSocket serversocket = null;
boolean flag = true;
int i;
try
{
serversocket = new ServerSocket(0);
i = serversocket.getLocalPort();
}
finally
{
try
{
if (serversocket != null)
{
serversocket.close();
}
}
catch (IOException ioexception)
{
;
}
}
return i;
}
/**
* Send a GET request to the given URL.
*/
@SideOnly(Side.CLIENT)
public static String get(URL url) throws IOException
{
HttpURLConnection httpurlconnection = (HttpURLConnection)url.openConnection();
httpurlconnection.setRequestMethod("GET");
BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(httpurlconnection.getInputStream()));
StringBuilder stringbuilder = new StringBuilder();
String s;
while ((s = bufferedreader.readLine()) != null)
{
stringbuilder.append(s);
stringbuilder.append('\r');
}
bufferedreader.close();
return stringbuilder.toString();
}
@SideOnly(Side.CLIENT)
public interface DownloadListener
{
void onDownloadComplete(File p_148522_1_);
}
}