From 910c7cac15e38d5af3124012a9dd09451a56cf5f Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Wed, 27 Apr 2011 10:20:21 +0100 Subject: [PATCH] litres: POST instead of GET --- .../android/fbreader/network/Util.java | 4 +- .../NetworkAuthenticationManager.java | 2 +- .../litres/LitResAuthenticationManager.java | 57 ++++++++++--------- .../litres/LitResBookshelfItem.java | 2 +- .../litres/LitResNetworkRequest.java | 20 ++++++- .../core/network/ZLNetworkManager.java | 21 +++++-- .../core/network/ZLNetworkRequest.java | 15 +++-- 7 files changed, 81 insertions(+), 40 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/network/Util.java b/src/org/geometerplus/android/fbreader/network/Util.java index 87f70419c..8989c0559 100644 --- a/src/org/geometerplus/android/fbreader/network/Util.java +++ b/src/org/geometerplus/android/fbreader/network/Util.java @@ -142,7 +142,9 @@ abstract class Util implements UserRegistrationConstants { if (mgr.needsInitialization()) { mgr.initialize(); } - onSuccess.run(); + if (onSuccess != null) { + onSuccess.run(); + } } catch (ZLNetworkException e) { mgr.logOut(); runAuthenticationDialog(activity, link, e.getMessage(), onSuccess); diff --git a/src/org/geometerplus/fbreader/network/authentication/NetworkAuthenticationManager.java b/src/org/geometerplus/fbreader/network/authentication/NetworkAuthenticationManager.java index 614e52142..54475a216 100644 --- a/src/org/geometerplus/fbreader/network/authentication/NetworkAuthenticationManager.java +++ b/src/org/geometerplus/fbreader/network/authentication/NetworkAuthenticationManager.java @@ -35,7 +35,7 @@ public abstract class NetworkAuthenticationManager { NetworkAuthenticationManager mgr = ourManagers.get(link.getSiteName()); if (mgr == null) { if (managerClass == LitResAuthenticationManager.class) { - mgr = new LitResAuthenticationManager(link, sslCertificate); + mgr = new LitResAuthenticationManager(link); } if (mgr != null) { ourManagers.put(link.getSiteName(), mgr); diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java index 9fac0682b..39272a5f4 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java @@ -40,10 +40,11 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { private String myInitializedDataSid; private String myAccount; - private final HashMap myPurchasedBooks = new HashMap(); + private final Map myPurchasedBooks = + new LinkedHashMap(); - public LitResAuthenticationManager(INetworkLink link, String sslCertificate) { - super(link, sslCertificate); + public LitResAuthenticationManager(INetworkLink link) { + super(link, null); mySidUserNameOption = new ZLStringOption(link.getSiteName(), "sidUserName", ""); mySidOption = new ZLStringOption(link.getSiteName(), "sid", ""); myUserIdOption = new ZLStringOption(link.getSiteName(), "userId", ""); @@ -94,13 +95,14 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { if (url == null) { throw new ZLNetworkException(NetworkException.ERROR_UNSUPPORTED_OPERATION); } - url = ZLNetworkUtil.appendParameter(url, "sid", sid); final LitResLoginXMLReader xmlReader = new LitResLoginXMLReader(Link.getSiteName()); ZLNetworkException exception = null; try { - ZLNetworkManager.Instance().perform(new LitResNetworkRequest(url, SSLCertificate, xmlReader)); + final LitResNetworkRequest request = new LitResNetworkRequest(url, xmlReader); + request.addPostParameter("sid", sid); + ZLNetworkManager.Instance().perform(request); } catch (ZLNetworkException e) { exception = e; } @@ -128,14 +130,15 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { synchronized (this) { login = UserNameOption.getValue(); } - url = ZLNetworkUtil.appendParameter(url, "login", login); - url = ZLNetworkUtil.appendParameter(url, "pwd", password); final LitResLoginXMLReader xmlReader = new LitResLoginXMLReader(Link.getSiteName()); ZLNetworkException exception = null; try { - ZLNetworkManager.Instance().perform(new LitResNetworkRequest(url, SSLCertificate, xmlReader)); + final LitResNetworkRequest request = new LitResNetworkRequest(url, xmlReader); + request.addPostParameter("login", login); + request.addPostParameter("pwd", password); + ZLNetworkManager.Instance().perform(request); } catch (ZLNetworkException e) { exception = e; } @@ -196,17 +199,18 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { throw new ZLNetworkException(NetworkException.ERROR_AUTHENTICATION_FAILED); } - BookUrlInfo reference = book.reference(UrlInfo.Type.BookBuy); + final BookUrlInfo reference = book.reference(UrlInfo.Type.BookBuy); if (reference == null) { throw new ZLNetworkException(NetworkException.ERROR_BOOK_NOT_PURCHASED); // TODO: more correct error message??? } - final String query = ZLNetworkUtil.appendParameter(reference.Url, "sid", sid); final LitResPurchaseXMLReader xmlReader = new LitResPurchaseXMLReader(Link.getSiteName()); ZLNetworkException exception = null; try { - ZLNetworkManager.Instance().perform(new LitResNetworkRequest(query, SSLCertificate, xmlReader)); + final LitResNetworkRequest request = new LitResNetworkRequest(reference.Url, xmlReader); + request.addPostParameter("sid", sid); + ZLNetworkManager.Instance().perform(request); } catch (ZLNetworkException e) { exception = e; } @@ -343,16 +347,15 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { private LitResNetworkRequest loadPurchasedBooks() { final String sid = mySidOption.getValue(); + final String query = "pages/catalit_browser/"; - String query = "pages/catalit_browser/"; - query = ZLNetworkUtil.appendParameter(query, "my", "1"); - query = ZLNetworkUtil.appendParameter(query, "sid", sid); - - return new LitResNetworkRequest( + final LitResNetworkRequest request = new LitResNetworkRequest( LitResUtil.url(Link, query), - SSLCertificate, new LitResXMLReader(Link, new LinkedList()) ); + request.addPostParameter("my", "1"); + request.addPostParameter("sid", sid); + return request; } private void loadPurchasedBooksOnError() { @@ -362,7 +365,7 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { private void loadPurchasedBooksOnSuccess(LitResNetworkRequest purchasedBooksRequest) { LitResXMLReader reader = (LitResXMLReader)purchasedBooksRequest.Reader; myPurchasedBooks.clear(); - for (NetworkItem item: reader.Books) { + for (NetworkItem item : reader.Books) { if (item instanceof NetworkBookItem) { NetworkBookItem book = (NetworkBookItem)item; myPurchasedBooks.put(book.Id, book); @@ -372,16 +375,15 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { private LitResNetworkRequest loadAccount() { final String sid = mySidOption.getValue(); + final String query = "pages/purchase_book/"; - String query = "pages/purchase_book/"; - query = ZLNetworkUtil.appendParameter(query, "sid", sid); - query = ZLNetworkUtil.appendParameter(query, "art", "0"); - - return new LitResNetworkRequest( + final LitResNetworkRequest request = new LitResNetworkRequest( LitResUtil.url(Link, query), - SSLCertificate, new LitResPurchaseXMLReader(Link.getSiteName()) ); + request.addPostParameter("sid", sid); + request.addPostParameter("art", "0"); + return request; } private void loadAccountOnError() { @@ -400,13 +402,14 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { @Override public void recoverPassword(String email) throws ZLNetworkException { - String url = Link.getUrl(UrlInfo.Type.RecoverPassword); + final String url = Link.getUrl(UrlInfo.Type.RecoverPassword); if (url == null) { throw new ZLNetworkException(NetworkException.ERROR_UNSUPPORTED_OPERATION); } - url = ZLNetworkUtil.appendParameter(url, "mail", email); final LitResPasswordRecoveryXMLReader xmlReader = new LitResPasswordRecoveryXMLReader(Link.getSiteName()); - ZLNetworkManager.Instance().perform(new LitResNetworkRequest(url, SSLCertificate, xmlReader)); + final LitResNetworkRequest request = new LitResNetworkRequest(url, xmlReader); + request.addPostParameter("mail", email); + ZLNetworkManager.Instance().perform(request); } @Override diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java index 9cd8fa59c..3cfcdde15 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java @@ -195,7 +195,7 @@ public class LitResBookshelfItem extends NetworkURLCatalogItem { listener.onNewItem(Link, item); } } else { - //listener.onNewItem(Link, new ByDateCatalogItem(this, children)); + listener.onNewItem(Link, new ByDateCatalogItem(this, children)); listener.onNewItem(Link, new ByAuthorCatalogItem(this, children)); listener.onNewItem(Link, new ByTitleCatalogItem(this, children)); final BySeriesCatalogItem bySeries = new BySeriesCatalogItem(this, children); diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResNetworkRequest.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResNetworkRequest.java index d6bd50616..071845ef5 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResNetworkRequest.java +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResNetworkRequest.java @@ -19,6 +19,8 @@ package org.geometerplus.fbreader.network.authentication.litres; +import java.util.*; + import java.io.InputStream; import java.io.IOException; @@ -28,8 +30,22 @@ import org.geometerplus.zlibrary.core.network.ZLNetworkRequest; public class LitResNetworkRequest extends ZLNetworkRequest { public final LitResAuthenticationXMLReader Reader; - public LitResNetworkRequest(String url, String sslCertificate, LitResAuthenticationXMLReader reader) { - super(url, sslCertificate, null); + static String clean(String url) { + final int index = url.indexOf('?'); + return index != -1 ? url.substring(0, index) : url; + } + + public LitResNetworkRequest(String url, LitResAuthenticationXMLReader reader) { + super(clean(url), null, null); + final int index = url.indexOf('?'); + if (index != -1) { + for (String param : url.substring(index + 1).split("&")) { + String[] pp = param.split("="); + if (pp.length == 2) { + addPostParameter(pp[0], pp[1]); + } + } + } Reader = reader; } diff --git a/src/org/geometerplus/zlibrary/core/network/ZLNetworkManager.java b/src/org/geometerplus/zlibrary/core/network/ZLNetworkManager.java index fd172afe7..5464dff0c 100644 --- a/src/org/geometerplus/zlibrary/core/network/ZLNetworkManager.java +++ b/src/org/geometerplus/zlibrary/core/network/ZLNetworkManager.java @@ -30,10 +30,12 @@ import org.apache.http.auth.AuthScope; import org.apache.http.auth.Credentials; import org.apache.http.client.CookieStore; import org.apache.http.client.CredentialsProvider; +import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.*; import org.apache.http.client.protocol.ClientContext; import org.apache.http.cookie.Cookie; import org.apache.http.impl.client.*; +import org.apache.http.message.BasicNameValuePair; import org.apache.http.protocol.HttpContext; import org.apache.http.protocol.BasicHttpContext; @@ -140,9 +142,20 @@ public class ZLNetworkManager { try { request.doBefore(); httpClient = new DefaultHttpClient(); - final HttpGet getRequest = new HttpGet(request.URL); - setCommonHTTPOptions(getRequest); - httpClient.setCredentialsProvider(new MyCredentialsProvider(getRequest)); + final HttpRequestBase httpRequest; + if (request.PostData != null) { + httpRequest = new HttpPost(request.URL); + // TODO: implement + } else if (!request.PostParameters.isEmpty()) { + httpRequest = new HttpPost(request.URL); + final List list = + new ArrayList(request.PostParameters.size()); + ((HttpPost)httpRequest).setEntity(new UrlEncodedFormEntity(list, "utf-8")); + } else { + httpRequest = new HttpGet(request.URL); + } + setCommonHTTPOptions(httpRequest); + httpClient.setCredentialsProvider(new MyCredentialsProvider(httpRequest)); /* if (request.PostData != null) { httpConnection.setRequestMethod("POST"); @@ -169,7 +182,7 @@ public class ZLNetworkManager { */ HttpResponse response = null; for (int retryCounter = 0; retryCounter < 3 && entity == null; ++retryCounter) { - response = httpClient.execute(getRequest, myHttpContext); + response = httpClient.execute(httpRequest, myHttpContext); entity = response.getEntity(); } final int responseCode = response.getStatusLine().getStatusCode(); diff --git a/src/org/geometerplus/zlibrary/core/network/ZLNetworkRequest.java b/src/org/geometerplus/zlibrary/core/network/ZLNetworkRequest.java index cb148417e..5db48fb66 100644 --- a/src/org/geometerplus/zlibrary/core/network/ZLNetworkRequest.java +++ b/src/org/geometerplus/zlibrary/core/network/ZLNetworkRequest.java @@ -19,6 +19,8 @@ package org.geometerplus.zlibrary.core.network; +import java.util.Map; +import java.util.HashMap; import java.io.InputStream; import java.io.IOException; import java.net.URLConnection; @@ -27,21 +29,26 @@ public abstract class ZLNetworkRequest { String URL; public final String SSLCertificate; public final String PostData; + public final Map PostParameters = new HashMap(); protected ZLNetworkRequest(String url) { this(url, null, null); } - public String getURL() { - return URL; - } - protected ZLNetworkRequest(String url, String sslCertificate, String postData) { URL = url; SSLCertificate = sslCertificate; PostData = postData; } + public void addPostParameter(String name, String value) { + PostParameters.put(name, value); + } + + public String getURL() { + return URL; + } + public void doBefore() throws ZLNetworkException { }