X-Git-Url: https://git.ktnx.net/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fasync%2FSendTransactionTask.java;h=dbe4bc88647d87b129315d3d3edaff076028ba37;hb=db56efb04c4a1c260676e743481b8f67b36e60ed;hp=cfbf5222c30a24ff41c9c1282a664da17e61a46e;hpb=4c2d1b2095d022074deed016e95cd3cca3b9f624;p=mobile-ledger-staging.git diff --git a/app/src/main/java/net/ktnx/mobileledger/async/SendTransactionTask.java b/app/src/main/java/net/ktnx/mobileledger/async/SendTransactionTask.java index cfbf5222..dbe4bc88 100644 --- a/app/src/main/java/net/ktnx/mobileledger/async/SendTransactionTask.java +++ b/app/src/main/java/net/ktnx/mobileledger/async/SendTransactionTask.java @@ -1,5 +1,5 @@ /* - * Copyright © 2019 Damyan Ivanov. + * Copyright © 2020 Damyan Ivanov. * This file is part of MoLe. * MoLe is free software: you can distribute it and/or modify it * under the term of the GNU General Public License as published by @@ -20,16 +20,16 @@ package net.ktnx.mobileledger.async; import android.os.AsyncTask; import android.util.Log; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectWriter; - -import net.ktnx.mobileledger.json.ParsedLedgerTransaction; +import net.ktnx.mobileledger.json.API; +import net.ktnx.mobileledger.json.ApiNotSupportedException; +import net.ktnx.mobileledger.json.Gateway; import net.ktnx.mobileledger.model.LedgerTransaction; import net.ktnx.mobileledger.model.LedgerTransactionAccount; import net.ktnx.mobileledger.model.MobileLedgerProfile; import net.ktnx.mobileledger.utils.Globals; import net.ktnx.mobileledger.utils.Logger; import net.ktnx.mobileledger.utils.NetworkUtil; +import net.ktnx.mobileledger.utils.SimpleDate; import net.ktnx.mobileledger.utils.UrlEncodedFormData; import java.io.BufferedReader; @@ -39,8 +39,6 @@ import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.nio.charset.StandardCharsets; -import java.util.Date; -import java.util.GregorianCalendar; import java.util.List; import java.util.Locale; import java.util.Map; @@ -50,14 +48,20 @@ import java.util.regex.Pattern; import static android.os.SystemClock.sleep; import static net.ktnx.mobileledger.utils.Logger.debug; +/* TODO: get rid of the custom session/cookie and auth code? + * (the last problem with the POST was the missing content-length header) + * This will resolve itself when hledger-web 1.14+ is released with Debian/stable, + * at which point the HTML form emulation can be dropped entirely + */ + public class SendTransactionTask extends AsyncTask { private final TaskCallback taskCallback; + private final MobileLedgerProfile mProfile; + private final boolean simulate; protected String error; private String token; private String session; - private LedgerTransaction ltr; - private MobileLedgerProfile mProfile; - private boolean simulate = false; + private LedgerTransaction transaction; public SendTransactionTask(TaskCallback callback, MobileLedgerProfile profile, boolean simulate) { @@ -70,8 +74,22 @@ public class SendTransactionTask extends AsyncTask 0.3) @@ -81,20 +99,9 @@ public class SendTransactionTask extends AsyncTask= 2) - throw new IOException(String.format("aborting after %d tries", tried)); - sleep(100); - } + transaction = ledgerTransactions[0]; + + final API profileApiVersion = mProfile.getApiVersion(); + switch (profileApiVersion) { + case auto: + boolean sendOK = false; + for (API ver : API.allVersions) { + Logger.debug("network", "Trying version " + ver); + try { + sendOK(ver); + sendOK = true; + Logger.debug("network", "Version " + ver + " request succeeded"); + + break; + } + catch (ApiNotSupportedException e) { + Logger.debug("network", "Version " + ver + " seems not supported"); + } + } + + if (!sendOK) { + Logger.debug("network", "Trying HTML form emulation"); + legacySendOkWithRetry(); + } + break; + case html: + legacySendOkWithRetry(); + break; + case v1_14: + case v1_15: + case v1_19_1: + sendOK(profileApiVersion); + break; + default: + throw new IllegalStateException("Unexpected API version: " + profileApiVersion); } } - catch (Exception e) { + catch (ApiNotSupportedException | Exception e) { e.printStackTrace(); error = e.getMessage(); } return null; } - + private void legacySendOkWithRetry() throws IOException { + int tried = 0; + while (!legacySendOK()) { + tried++; + if (tried >= 2) + throw new IOException(String.format("aborting after %d tries", tried)); + sleep(100); + } + } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); taskCallback.done(error); } -} + +} \ No newline at end of file