diff options
| author | Samuel Tardieu <sam@rfc1149.net> | 2013-09-15 18:47:17 +0200 |
|---|---|---|
| committer | Samuel Tardieu <sam@rfc1149.net> | 2013-09-15 18:51:33 +0200 |
| commit | 40d66b9b9a14cd65f36ccd13ae962058a9d9d4ca (patch) | |
| tree | fe864c74a0e721f71b78c0889ff328e7ba11c5b0 | |
| parent | 4cc85b839b7f4f15a92ec1070059bbda13c03e98 (diff) | |
| download | cgeo-40d66b9b9a14cd65f36ccd13ae962058a9d9d4ca.zip cgeo-40d66b9b9a14cd65f36ccd13ae962058a9d9d4ca.tar.gz cgeo-40d66b9b9a14cd65f36ccd13ae962058a9d9d4ca.tar.bz2 | |
Do not retry loading a page after 404 from gc.com
When a page cannot be found, geocaching.com returns with a 404. Retrying
while logged in would not change anything, and we should not consider
ourselves as logged as guest because of this error.
5 files changed, 27 insertions, 8 deletions
diff --git a/main/src/cgeo/geocaching/connector/gc/GCConnector.java b/main/src/cgeo/geocaching/connector/gc/GCConnector.java index 5389a36..111c865 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCConnector.java +++ b/main/src/cgeo/geocaching/connector/gc/GCConnector.java @@ -152,6 +152,7 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, search.setError(StatusCode.COMMUNICATION_ERROR); return search; } + assert page != null; final SearchResult searchResult = GCParser.parseCache(page, handler); diff --git a/main/src/cgeo/geocaching/connector/gc/GCParser.java b/main/src/cgeo/geocaching/connector/gc/GCParser.java index ce00e87..9c9e06d 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCParser.java +++ b/main/src/cgeo/geocaching/connector/gc/GCParser.java @@ -40,6 +40,7 @@ import org.apache.commons.lang3.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -843,6 +844,7 @@ public abstract class GCParser { * @param recaptchaReceiver * @return */ + @Nullable private static SearchResult searchByAny(final CacheType cacheType, final boolean my, final boolean showCaptcha, final Parameters params, RecaptchaReceiver recaptchaReceiver) { insertCacheType(params, cacheType); @@ -854,6 +856,7 @@ public abstract class GCParser { Log.e("GCParser.searchByAny: No data from server"); return null; } + assert page != null; final SearchResult searchResult = parseSearch(fullUri, page, showCaptcha, recaptchaReceiver); if (searchResult == null || CollectionUtils.isEmpty(searchResult.getGeocodes())) { @@ -940,6 +943,7 @@ public abstract class GCParser { return null; } + @Nullable public static Trackable searchTrackable(final String geocode, final String guid, final String id) { if (StringUtils.isBlank(geocode) && StringUtils.isBlank(guid) && StringUtils.isBlank(id)) { Log.w("GCParser.searchTrackable: No geocode nor guid nor id given"); @@ -964,6 +968,7 @@ public abstract class GCParser { Log.e("GCParser.searchTrackable: No data from server"); return trackable; } + assert page != null; trackable = parseTrackable(page, geocode); if (trackable == null) { @@ -1132,6 +1137,7 @@ public abstract class GCParser { Log.e("GCParser.uploadLogImage: No data from server"); return new ImmutablePair<StatusCode, String>(StatusCode.UNKNOWN_ERROR, null); } + assert page != null; final String[] viewstates = Login.getViewstates(page); @@ -1289,7 +1295,8 @@ public abstract class GCParser { return !guidOnPage; // on watch list (=error) / not on watch list } - static String requestHtmlPage(final String geocode, final String guid, final String log, final String numlogs) { + @Nullable + static String requestHtmlPage(@Nullable final String geocode, @Nullable final String guid, final String log, final String numlogs) { final Parameters params = new Parameters("decrypt", "y"); if (StringUtils.isNotBlank(geocode)) { params.put("wp", geocode); diff --git a/main/src/cgeo/geocaching/connector/gc/Login.java b/main/src/cgeo/geocaching/connector/gc/Login.java index ad07424..beb49f1 100644 --- a/main/src/cgeo/geocaching/connector/gc/Login.java +++ b/main/src/cgeo/geocaching/connector/gc/Login.java @@ -13,10 +13,11 @@ import cgeo.geocaching.utils.MatcherWrapper; import cgeo.geocaching.utils.TextUtils; import ch.boye.httpclientandroidlib.HttpResponse; - import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; import android.graphics.drawable.BitmapDrawable; @@ -213,11 +214,12 @@ public abstract class Login { * @param page * @return <code>true</code> if user is logged in, <code>false</code> otherwise */ - public static boolean getLoginStatus(final String page) { + public static boolean getLoginStatus(@Nullable final String page) { if (StringUtils.isBlank(page)) { Log.e("Login.checkLogin: No page given"); return false; } + assert page != null; setActualStatus(CgeoApplication.getInstance().getString(R.string.init_login_popup_ok)); @@ -475,10 +477,13 @@ public abstract class Login { * @param params * @return */ - public static String getRequestLogged(final String uri, final Parameters params) { - final String data = Network.getResponseData(Network.getRequest(uri, params), canRemoveWhitespace(uri)); + @Nullable + public static String getRequestLogged(@NonNull final String uri, @Nullable final Parameters params) { + final HttpResponse response = Network.getRequest(uri, params); + final String data = Network.getResponseData(response, canRemoveWhitespace(uri)); - if (getLoginStatus(data)) { + // A page not found will not be found if the user logs in either + if (Network.isPageNotFound(response) || getLoginStatus(data)) { return data; } diff --git a/main/src/cgeo/geocaching/network/Network.java b/main/src/cgeo/geocaching/network/Network.java index 873cfc9..1810216 100644 --- a/main/src/cgeo/geocaching/network/Network.java +++ b/main/src/cgeo/geocaching/network/Network.java @@ -399,6 +399,10 @@ public abstract class Network { return response != null && response.getStatusLine().getStatusCode() == 200; } + static public boolean isPageNotFound(@Nullable final HttpResponse response) { + return response != null && response.getStatusLine().getStatusCode() == 404; + } + /** * Get the result of a GET HTTP request returning a JSON body. * diff --git a/main/src/cgeo/geocaching/utils/TextUtils.java b/main/src/cgeo/geocaching/utils/TextUtils.java index c9d4958..302a65d 100644 --- a/main/src/cgeo/geocaching/utils/TextUtils.java +++ b/main/src/cgeo/geocaching/utils/TextUtils.java @@ -3,6 +3,8 @@ */ package cgeo.geocaching.utils; +import org.eclipse.jdt.annotation.Nullable; + import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -34,7 +36,7 @@ public final class TextUtils { * Find the last occurring value * @return defaultValue or the n-th group if the pattern matches (trimmed if wanted) */ - public static String getMatch(final String data, final Pattern p, final boolean trim, final int group, final String defaultValue, final boolean last) { + public static String getMatch(@Nullable final String data, final Pattern p, final boolean trim, final int group, final String defaultValue, final boolean last) { if (data != null) { String result = null; @@ -87,7 +89,7 @@ public final class TextUtils { * Value to return if the pattern is not found * @return defaultValue or the first group if the pattern matches (trimmed) */ - public static String getMatch(final String data, final Pattern p, final String defaultValue) { + public static String getMatch(@Nullable final String data, final Pattern p, final String defaultValue) { return TextUtils.getMatch(data, p, true, 1, defaultValue, false); } |
