package info.mineshafter.hacks;
import info.mineshafter.intercept.Handler;
import info.mineshafter.intercept.Request;
import info.mineshafter.intercept.Response;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
public class URLConnectionAdapter extends HttpURLConnection {
private Request req;
private Response res;
private boolean didRequest = false;
private ByteArrayOutputStream bodyStream;
private ByteArrayInputStream replyStream;
private Handler handler = null;
protected URLConnectionAdapter(URL url, Handler h) {
super(url);
//System.out.println("H1");
req = new Request(url);
bodyStream = new ByteArrayOutputStream();
handler = h;
}
private void doRequest() {
if (didRequest) return;
if (doOutput && bodyStream.size() > 0) {
req.setBody(bodyStream.toByteArray());
}
res = handler.handle(req);
responseCode = res.getStatus();
replyStream = new ByteArrayInputStream(res.getBody());
didRequest = true;
}
public int getResponseCode() {
if (!didRequest) doRequest();
//System.out.println(".getResponseCode()");
return responseCode;
}
@Override
public InputStream getInputStream() {
if (!didRequest) doRequest();
//System.out.println(".getInputStream()");
return replyStream;
}
@Override
public int getContentLength() {
String len = getHeaderField("content-length");
if (len == null) return -1;
return Integer.parseInt(len);
}
@Override
public String getContentType() {
return getHeaderField("content-type");
}
@Override
public Map<String, List<String>> getHeaderFields() {
getInputStream();
return res.getHeaders();
}
@Override
public String getHeaderField(String name) {
getInputStream();
List<String> items = res.getHeaders().get(name);
if (items == null) return null;
return items.get(0); // Probably won't break right away
}
@Override
public OutputStream getOutputStream() {
doOutput = true;
return bodyStream;
}
public void setDoInput(boolean doinput) {
//System.out.println(".setDoInput()");
doInput = doinput;
}
public void setDoOutput(boolean dooutput) {
//System.out.println(".setDoOutput()");
doOutput = dooutput;
}
@Override
public void setRequestProperty(String key, String value) {
req.setHeader(key, value);
}
@Override
public void addRequestProperty(String key, String value) {
req.addHeader(key, value);
}
@Override
public void connect() throws IOException {
//System.out.println(".connect()");
} // Don't really need this...
@Override
public void disconnect() {
//System.out.println(".disconnect()");
}
@Override
public boolean usingProxy() {
return false;
}
}