package com.mojang.realmsclient.client; import com.mojang.realmsclient.exception.RealmsHttpException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.Proxy; import java.net.URL; import java.nio.charset.StandardCharsets; import javax.annotation.Nullable; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) public abstract class Request> { protected HttpURLConnection connection; private boolean connected; protected String url; private static final int DEFAULT_READ_TIMEOUT = 60000; private static final int DEFAULT_CONNECT_TIMEOUT = 5000; private static final String IS_SNAPSHOT_KEY = "Is-Prerelease"; private static final String COOKIE_KEY = "Cookie"; public Request(String p_87310_, int p_87311_, int p_87312_) { try { this.url = p_87310_; Proxy proxy = RealmsClientConfig.getProxy(); if (proxy != null) { this.connection = (HttpURLConnection)new URL(p_87310_).openConnection(proxy); } else { this.connection = (HttpURLConnection)new URL(p_87310_).openConnection(); } this.connection.setConnectTimeout(p_87311_); this.connection.setReadTimeout(p_87312_); } catch (MalformedURLException malformedurlexception) { throw new RealmsHttpException(malformedurlexception.getMessage(), malformedurlexception); } catch (IOException ioexception) { throw new RealmsHttpException(ioexception.getMessage(), ioexception); } } public void cookie(String p_87323_, String p_87324_) { cookie(this.connection, p_87323_, p_87324_); } public static void cookie(HttpURLConnection p_87336_, String p_87337_, String p_87338_) { String s = p_87336_.getRequestProperty("Cookie"); if (s == null) { p_87336_.setRequestProperty("Cookie", p_87337_ + "=" + p_87338_); } else { p_87336_.setRequestProperty("Cookie", s + ";" + p_87337_ + "=" + p_87338_); } } public void addSnapshotHeader(boolean p_309559_) { this.connection.addRequestProperty("Is-Prerelease", String.valueOf(p_309559_)); } public int getRetryAfterHeader() { return getRetryAfterHeader(this.connection); } public static int getRetryAfterHeader(HttpURLConnection p_87331_) { String s = p_87331_.getHeaderField("Retry-After"); try { return Integer.valueOf(s); } catch (Exception exception) { return 5; } } public int responseCode() { try { this.connect(); return this.connection.getResponseCode(); } catch (Exception exception) { throw new RealmsHttpException(exception.getMessage(), exception); } } public String text() { try { this.connect(); String s; if (this.responseCode() >= 400) { s = this.read(this.connection.getErrorStream()); } else { s = this.read(this.connection.getInputStream()); } this.dispose(); return s; } catch (IOException ioexception) { throw new RealmsHttpException(ioexception.getMessage(), ioexception); } } private String read(@Nullable InputStream p_87315_) throws IOException { if (p_87315_ == null) { return ""; } else { InputStreamReader inputstreamreader = new InputStreamReader(p_87315_, StandardCharsets.UTF_8); StringBuilder stringbuilder = new StringBuilder(); for (int i = inputstreamreader.read(); i != -1; i = inputstreamreader.read()) { stringbuilder.append((char)i); } return stringbuilder.toString(); } } private void dispose() { byte[] abyte = new byte[1024]; try { InputStream inputstream = this.connection.getInputStream(); while (inputstream.read(abyte) > 0) { } inputstream.close(); return; } catch (Exception exception) { try { InputStream inputstream1 = this.connection.getErrorStream(); if (inputstream1 != null) { while (inputstream1.read(abyte) > 0) { } inputstream1.close(); return; } } catch (IOException ioexception) { return; } } finally { if (this.connection != null) { this.connection.disconnect(); } } } protected T connect() { if (this.connected) { return (T)this; } else { T t = this.doConnect(); this.connected = true; return t; } } protected abstract T doConnect(); public static Request get(String p_87317_) { return new Request.Get(p_87317_, 5000, 60000); } public static Request get(String p_87319_, int p_87320_, int p_87321_) { return new Request.Get(p_87319_, p_87320_, p_87321_); } public static Request post(String p_87343_, String p_87344_) { return new Request.Post(p_87343_, p_87344_, 5000, 60000); } public static Request post(String p_87326_, String p_87327_, int p_87328_, int p_87329_) { return new Request.Post(p_87326_, p_87327_, p_87328_, p_87329_); } public static Request delete(String p_87341_) { return new Request.Delete(p_87341_, 5000, 60000); } public static Request put(String p_87354_, String p_87355_) { return new Request.Put(p_87354_, p_87355_, 5000, 60000); } public static Request put(String p_87346_, String p_87347_, int p_87348_, int p_87349_) { return new Request.Put(p_87346_, p_87347_, p_87348_, p_87349_); } public String getHeader(String p_87352_) { return getHeader(this.connection, p_87352_); } public static String getHeader(HttpURLConnection p_87333_, String p_87334_) { try { return p_87333_.getHeaderField(p_87334_); } catch (Exception exception) { return ""; } } @OnlyIn(Dist.CLIENT) public static class Delete extends Request { public Delete(String p_87359_, int p_87360_, int p_87361_) { super(p_87359_, p_87360_, p_87361_); } public Request.Delete doConnect() { try { this.connection.setDoOutput(true); this.connection.setRequestMethod("DELETE"); this.connection.connect(); return this; } catch (Exception exception) { throw new RealmsHttpException(exception.getMessage(), exception); } } } @OnlyIn(Dist.CLIENT) public static class Get extends Request { public Get(String p_87365_, int p_87366_, int p_87367_) { super(p_87365_, p_87366_, p_87367_); } public Request.Get doConnect() { try { this.connection.setDoInput(true); this.connection.setDoOutput(true); this.connection.setUseCaches(false); this.connection.setRequestMethod("GET"); return this; } catch (Exception exception) { throw new RealmsHttpException(exception.getMessage(), exception); } } } @OnlyIn(Dist.CLIENT) public static class Post extends Request { private final String content; public Post(String p_87372_, String p_87373_, int p_87374_, int p_87375_) { super(p_87372_, p_87374_, p_87375_); this.content = p_87373_; } public Request.Post doConnect() { try { if (this.content != null) { this.connection.setRequestProperty("Content-Type", "application/json; charset=utf-8"); } this.connection.setDoInput(true); this.connection.setDoOutput(true); this.connection.setUseCaches(false); this.connection.setRequestMethod("POST"); OutputStream outputstream = this.connection.getOutputStream(); OutputStreamWriter outputstreamwriter = new OutputStreamWriter(outputstream, "UTF-8"); outputstreamwriter.write(this.content); outputstreamwriter.close(); outputstream.flush(); return this; } catch (Exception exception) { throw new RealmsHttpException(exception.getMessage(), exception); } } } @OnlyIn(Dist.CLIENT) public static class Put extends Request { private final String content; public Put(String p_87380_, String p_87381_, int p_87382_, int p_87383_) { super(p_87380_, p_87382_, p_87383_); this.content = p_87381_; } public Request.Put doConnect() { try { if (this.content != null) { this.connection.setRequestProperty("Content-Type", "application/json; charset=utf-8"); } this.connection.setDoOutput(true); this.connection.setDoInput(true); this.connection.setRequestMethod("PUT"); OutputStream outputstream = this.connection.getOutputStream(); OutputStreamWriter outputstreamwriter = new OutputStreamWriter(outputstream, "UTF-8"); outputstreamwriter.write(this.content); outputstreamwriter.close(); outputstream.flush(); return this; } catch (Exception exception) { throw new RealmsHttpException(exception.getMessage(), exception); } } } }