001package net.minecraft.util; 002 003import cpw.mods.fml.relauncher.Side; 004import cpw.mods.fml.relauncher.SideOnly; 005import java.io.BufferedReader; 006import java.io.DataOutputStream; 007import java.io.File; 008import java.io.IOException; 009import java.io.InputStreamReader; 010import java.io.UnsupportedEncodingException; 011import java.net.HttpURLConnection; 012import java.net.MalformedURLException; 013import java.net.ServerSocket; 014import java.net.URL; 015import java.net.URLEncoder; 016import java.util.HashMap; 017import java.util.Iterator; 018import java.util.Map; 019import java.util.Map.Entry; 020import java.util.logging.Level; 021import java.util.logging.Logger; 022import net.minecraft.logging.ILogAgent; 023 024public class HttpUtil 025{ 026 /** 027 * Builds an encoded HTTP POST content string from a string map 028 */ 029 public static String buildPostString(Map par0Map) 030 { 031 StringBuilder stringbuilder = new StringBuilder(); 032 Iterator iterator = par0Map.entrySet().iterator(); 033 034 while (iterator.hasNext()) 035 { 036 Entry entry = (Entry)iterator.next(); 037 038 if (stringbuilder.length() > 0) 039 { 040 stringbuilder.append('&'); 041 } 042 043 try 044 { 045 stringbuilder.append(URLEncoder.encode((String)entry.getKey(), "UTF-8")); 046 } 047 catch (UnsupportedEncodingException unsupportedencodingexception) 048 { 049 unsupportedencodingexception.printStackTrace(); 050 } 051 052 if (entry.getValue() != null) 053 { 054 stringbuilder.append('='); 055 056 try 057 { 058 stringbuilder.append(URLEncoder.encode(entry.getValue().toString(), "UTF-8")); 059 } 060 catch (UnsupportedEncodingException unsupportedencodingexception1) 061 { 062 unsupportedencodingexception1.printStackTrace(); 063 } 064 } 065 } 066 067 return stringbuilder.toString(); 068 } 069 070 /** 071 * Sends a HTTP POST request to the given URL with data from a map 072 */ 073 public static String sendPost(ILogAgent par0ILogAgent, URL par1URL, Map par2Map, boolean par3) 074 { 075 return sendPost(par0ILogAgent, par1URL, buildPostString(par2Map), par3); 076 } 077 078 /** 079 * Sends a HTTP POST request to the given URL with data from a string 080 */ 081 public static String sendPost(ILogAgent par0ILogAgent, URL par1URL, String par2Str, boolean par3) 082 { 083 try 084 { 085 HttpURLConnection httpurlconnection = (HttpURLConnection)par1URL.openConnection(); 086 httpurlconnection.setRequestMethod("POST"); 087 httpurlconnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 088 httpurlconnection.setRequestProperty("Content-Length", "" + par2Str.getBytes().length); 089 httpurlconnection.setRequestProperty("Content-Language", "en-US"); 090 httpurlconnection.setUseCaches(false); 091 httpurlconnection.setDoInput(true); 092 httpurlconnection.setDoOutput(true); 093 DataOutputStream dataoutputstream = new DataOutputStream(httpurlconnection.getOutputStream()); 094 dataoutputstream.writeBytes(par2Str); 095 dataoutputstream.flush(); 096 dataoutputstream.close(); 097 BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(httpurlconnection.getInputStream())); 098 StringBuffer stringbuffer = new StringBuffer(); 099 String s1; 100 101 while ((s1 = bufferedreader.readLine()) != null) 102 { 103 stringbuffer.append(s1); 104 stringbuffer.append('\r'); 105 } 106 107 bufferedreader.close(); 108 return stringbuffer.toString(); 109 } 110 catch (Exception exception) 111 { 112 if (!par3) 113 { 114 if (par0ILogAgent != null) 115 { 116 par0ILogAgent.logSevereException("Could not post to " + par1URL, exception); 117 } 118 else 119 { 120 Logger.getAnonymousLogger().log(Level.SEVERE, "Could not post to " + par1URL, exception); 121 } 122 } 123 124 return ""; 125 } 126 } 127 128 @SideOnly(Side.CLIENT) 129 130 /** 131 * The downloader for texturepacks stored in the server. 132 */ 133 public static void downloadTexturePack(File par0File, String par1Str, IDownloadSuccess par2IDownloadSuccess, Map par3Map, int par4, IProgressUpdate par5IProgressUpdate) 134 { 135 Thread thread = new Thread(new HttpUtilRunnable(par5IProgressUpdate, par1Str, par3Map, par0File, par2IDownloadSuccess, par4)); 136 thread.setDaemon(true); 137 thread.start(); 138 } 139 140 @SideOnly(Side.CLIENT) 141 public static int func_76181_a() throws IOException 142 { 143 ServerSocket serversocket = null; 144 boolean flag = true; 145 int i; 146 147 try 148 { 149 serversocket = new ServerSocket(0); 150 i = serversocket.getLocalPort(); 151 } 152 finally 153 { 154 try 155 { 156 if (serversocket != null) 157 { 158 serversocket.close(); 159 } 160 } 161 catch (IOException ioexception) 162 { 163 ; 164 } 165 } 166 167 return i; 168 } 169 170 @SideOnly(Side.CLIENT) 171 public static String[] loginToMinecraft(ILogAgent par0ILogAgent, String par1Str, String par2Str) 172 { 173 HashMap hashmap = new HashMap(); 174 hashmap.put("user", par1Str); 175 hashmap.put("password", par2Str); 176 hashmap.put("version", Integer.valueOf(13)); 177 String s2; 178 179 try 180 { 181 s2 = sendPost(par0ILogAgent, new URL("http://login.minecraft.net/"), hashmap, false); 182 } 183 catch (MalformedURLException malformedurlexception) 184 { 185 malformedurlexception.printStackTrace(); 186 return null; 187 } 188 189 if (s2 != null && s2.length() != 0) 190 { 191 if (!s2.contains(":")) 192 { 193 if (par0ILogAgent == null) 194 { 195 System.out.println("Failed to authenticate: " + s2); 196 } 197 else 198 { 199 par0ILogAgent.logWarning("Failed to authenticae: " + s2); 200 } 201 202 return null; 203 } 204 else 205 { 206 String[] astring = s2.split(":"); 207 return new String[] {astring[2], astring[3]}; 208 } 209 } 210 else 211 { 212 if (par0ILogAgent == null) 213 { 214 System.out.println("Failed to authenticate: Can\'t connect to minecraft.net"); 215 } 216 else 217 { 218 par0ILogAgent.logWarning("Failed to authenticate: Can\'t connect to minecraft.net"); 219 } 220 221 return null; 222 } 223 } 224}