X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=src%2Fro%2Fieval%2Ffonbot%2FHttpCallExecutableRunnable.java;h=43e8b3fabb6f479a170a825c3323ea524a027b3b;hb=979c5169a7b576c62417d14883f5e83f3b9a74cd;hp=469f27d9073853ca6f85ff83ecc046cbc526a89c;hpb=9717b83e6d3b8b664a2e465f96c8d67eb559ea47;p=fonbot.git diff --git a/src/ro/ieval/fonbot/HttpCallExecutableRunnable.java b/src/ro/ieval/fonbot/HttpCallExecutableRunnable.java index 469f27d..43e8b3f 100644 --- a/src/ro/ieval/fonbot/HttpCallExecutableRunnable.java +++ b/src/ro/ieval/fonbot/HttpCallExecutableRunnable.java @@ -6,15 +6,9 @@ import static ro.ieval.fonbot.Utils.toNonNull; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; import java.util.Collection; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.X509TrustManager; - +import java.net.HttpURLConnection; import org.eclipse.jdt.annotation.Nullable; import android.content.Context; @@ -44,41 +38,18 @@ import com.google.android.gcm.GCMRegistrar; */ /** - * ExecutableRunnable that makes a HTTPS call to the server and hands the response to a callback + * ExecutableRunnable that makes a HTTP(S) call to the server and hands the response to a callback * * @author Marius Gavrilescu */ public final class HttpCallExecutableRunnable extends ExecutableRunnable{ - /** - * X509TrustManager that trusts any certificate - * - * @author Marius Gavrilescu - */ - private static final class TotallyInsecureTrustManager implements X509TrustManager { - @Override - public @Nullable X509Certificate[] getAcceptedIssuers() { - return new X509Certificate[0]; - } - - @Override - public void checkServerTrusted(final @Nullable X509Certificate[] chain, final @Nullable String authType) - throws CertificateException { - //do nothing - } - - @Override - public void checkClientTrusted(final @Nullable X509Certificate[] chain, final @Nullable String authType) - throws CertificateException { - //do nothing - } - } /** * Callback which is run after a HTTP call. * * @author Marius Gavrilescu */ - public static interface ResultCallback{ + public interface ResultCallback{ /** * Callback invoked if the HTTP call is successful. * @@ -86,26 +57,13 @@ public final class HttpCallExecutableRunnable extends ExecutableRunnable{ * @param responseMessage HTTP response message * @param inputStream HTTP content InputStream */ - public void onResult(final int responseCode, final String responseMessage, final InputStream inputStream); + void onResult(final int responseCode, final String responseMessage, final InputStream inputStream); /** * Callback invoked if the HTTP call is unsuccessful. * * @param error localized error message */ - public void onError(final String error); - } - - /** SSLSocketFactory that uses {@link TotallyInsecureTrustManager} */ - private static final SSLSocketFactory DEFAULT_SOCKET_FACTORY; - static{ - try{ - final SSLContext sslcontext=SSLContext.getInstance("TLS"); - sslcontext.init(null, new X509TrustManager[]{new TotallyInsecureTrustManager()}, null); - DEFAULT_SOCKET_FACTORY=sslcontext.getSocketFactory(); - } catch(final Exception e){ - Log.wtf("HttpCallExecutableRunnable", "Cannot create SSLSocketFactory", e); - throw new AssertionError("Log.wtf did not terminate the process"); - } + void onError(final String error); } /** @@ -128,6 +86,8 @@ public final class HttpCallExecutableRunnable extends ExecutableRunnable{ * Callback to run after the request returns */ private final ResultCallback callback; + /** If true, the task should be retried if it fails */ + private final boolean mustRetryTask; /** * Constructs a SendHttpMessageAsyncTask which sends a binary message. @@ -136,13 +96,15 @@ public final class HttpCallExecutableRunnable extends ExecutableRunnable{ * @param headers the extra headers * @param context the context instance * @param resultCallback {@link ResultCallback} instance + * @param mustRetryTask true if this task should be retried if it fails * @param data the message to send */ - public HttpCallExecutableRunnable(final String path, final @Nullable Collection
headers, final Context context, final @Nullable ResultCallback resultCallback, final byte[] data){//NOPMD array is supposed to be immutable. + public HttpCallExecutableRunnable(final String path, final @Nullable Collection
headers, final Context context, final @Nullable ResultCallback resultCallback, final boolean mustRetryTask, final byte[] data){//NOPMD array is supposed to be immutable. this.path=path; this.headers=headers; this.context=context; this.callback=resultCallback; + this.mustRetryTask=mustRetryTask; this.data=data; } @@ -153,13 +115,15 @@ public final class HttpCallExecutableRunnable extends ExecutableRunnable{ * @param headers the extra headers * @param context the context instance * @param resultCallback {@link ResultCallback} instance + * @param mustRetryTask true if this task should be retried if it fails * @param message message to send */ - public HttpCallExecutableRunnable(final String path, final @Nullable Collection
headers, final Context context, final @Nullable ResultCallback resultCallback, final String... message){ + public HttpCallExecutableRunnable(final String path, final @Nullable Collection
headers, final Context context, final @Nullable ResultCallback resultCallback, final boolean mustRetryTask, final String... message){ this.path=path; this.headers=headers; this.context=context; this.callback=resultCallback; + this.mustRetryTask=mustRetryTask; if(message.length == 0) this.data=null;//NOPMD final field else @@ -170,8 +134,7 @@ public final class HttpCallExecutableRunnable extends ExecutableRunnable{ public void run() { try { final URL url=Utils.getServerURL(toNonNull(context),toNonNull(path)); - final HttpsURLConnection conn=(HttpsURLConnection) url.openConnection(); - conn.setSSLSocketFactory(DEFAULT_SOCKET_FACTORY); + final HttpURLConnection conn=(HttpURLConnection) url.openConnection(); if(data!=null){ conn.setDoOutput(true); conn.setFixedLengthStreamingMode(data.length); @@ -197,17 +160,23 @@ public final class HttpCallExecutableRunnable extends ExecutableRunnable{ stream.close(); } Log.d(getClass().getName(),"HTTP Response: "+conn.getResponseCode()+" "+conn.getResponseMessage()); - final String message=conn.getResponseMessage(); + String message=conn.getResponseMessage(); if(message==null && callback != null) callback.onError(toNonNull(context.getString(no_response_returned_from_server))); - else if(message != null && callback != null) - callback.onResult(conn.getResponseCode(), Utils.parseHttpMessage(message), - toNonNull(conn.getInputStream())); + else if(message != null && callback != null){ + if(message.charAt(message.length()-1) == ')')//message is (something) + message=message.substring(1, message.length()-1); + else + message=message.substring(message.indexOf(')')+2); + callback.onResult(conn.getResponseCode(), message, conn.getResponseCode() == 200 ? conn.getInputStream() : null); + } conn.disconnect(); } catch (Exception e) { e.printStackTrace(); if(callback != null) callback.onError(toNonNull(context.getString(connection_error))); + if(mustRetryTask) + retry(); } } }