package org.geogebra.desktop.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import javax.swing.SwingWorker;
import org.geogebra.common.move.ggtapi.models.AjaxCallback;
import org.geogebra.common.util.Charsets;
import org.geogebra.common.util.HttpRequest;
import org.geogebra.common.util.debug.Log;
/**
* @author Zoltan Kovacs <zoltan@geogebra.org> Implements HTTP requests and
* responses for desktop.
*/
public class HttpRequestD extends HttpRequest {
private String answer;
@Override
public void sendRequest(String url) {
BufferedReader in = null;
try {
URL u = new URL(url);
HttpURLConnection huc = (HttpURLConnection) u.openConnection();
huc.setConnectTimeout(getTimeout() * 1000);
huc.setRequestMethod("GET");
huc.connect();
in = new BufferedReader(new InputStreamReader(huc.getInputStream(),
Charsets.UTF_8));
String s = "";
answer = in.readLine(); // the last line will never get a "\n" on
// its end
while ((s = in.readLine()) != null) {
if (!("".equals(answer))) {
// ignore them
answer += "\n";
}
answer += s;
}
} catch (Exception ex) {
processed = true;
Log.error(ex.getMessage());
} finally {
if (in != null) {
try {
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
setResponseText(answer);
processed = true;
}
@Override
public void sendRequestPost(final String url, final String post,
final AjaxCallback callback) {
if (callback == null) {
sendRequestPostSync(url, post, null);
}
else {
if (post == null) {
throw new IllegalArgumentException("Post may not be null");
}
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
sendRequestPostSync(url, post, callback);
return null;
}
};
worker.execute();
}
}
/**
* @param url
* url
* @param post
* post data
* @param callback
* callback
*/
void sendRequestPostSync(String url, String post,
AjaxCallback callback) {
HttpURLConnection huc = null;
try {
URL u = new URL(url);
// Borrowed from http://www.exampledepot.com/egs/java.net/post.html:
huc = (HttpURLConnection) u.openConnection();
// Borrowed from
// http://bytes.com/topic/java/answers/720825-how-build-http-post-request-java:
// uc.setRequestMethod("POST");
// uc.setRequestProperty("Content-Type",
// "application/x-www-form-urlencoded");
// uc.setUseCaches(false);
// uc.setDoInput(true);
huc.setDoOutput(true);
OutputStreamWriter osw = new OutputStreamWriter(
huc.getOutputStream(), Charsets.UTF_8);
osw.write(post);
osw.flush();
answer = readOutput(huc.getInputStream());
osw.close();
setResponseText(answer);
processed = true;
if (callback != null) {
callback.onSuccess(getResponse());
}
} catch (Exception ex) {
processed = true;
String err = "(No error)";
try {
if (huc != null && huc.getErrorStream() != null) {
err = readOutput(huc.getErrorStream());
}
} catch (IOException e2) {
Log.warn("invalid HTTP stream");
}
System.out.println(post);
if (callback != null) {
Log.error(err);
callback.onError(
"Connection error: " + ex.getMessage());
}
ex.printStackTrace();
Log.error(ex.getMessage());
}
}
public static String readOutput(InputStream inputStream)
throws IOException {
BufferedReader in = null;
StringBuilder ans;
try {
in = new BufferedReader(
new InputStreamReader(inputStream,
Charsets.UTF_8));
String s = in.readLine();
if (s == null) {
return null;
}
ans = new StringBuilder(s); // the last line will
// never
// get a "\n"
// on
// its end
while ((s = in.readLine()) != null) {
if (!("".equals(ans.toString()))) {
// "\n"s, we
// ignore them
ans.append("\n");
}
ans.append(s);
}
} finally {
if (in != null) {
in.close();
}
}
return ans.toString();
}
/**
* @param url
* HTTP request URL
* @return response This method only works in desktop, since this is
* synchronous.
*/
public String sendRequestGetResponseSync(String url) {
sendRequest(url);
return getResponse();
}
/**
* http://stackoverflow.com/questions/1201048/allowing-java-to-use-an-
* untrusted-certificate-for-ssl-https-connection
*/
public static void ignoreSSL() {
Log.error("****************************** ignoring SSL certificate");
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs,
String authType) {
// accept all
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs,
String authType) {
// truest everyyone
}
} };
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection
.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
// and ignore exceptions
}
}
}