From ddd65f69bf81a562b8d7562298e6259031b15d53 Mon Sep 17 00:00:00 2001 From: Athou Date: Tue, 11 Jun 2013 13:01:12 +0200 Subject: [PATCH] change favicon rest method to accept a subscription id --- .../backend/feeds/FaviconFetcher.java | 45 ++++++++++++------- .../commafeed/backend/feeds/FeedUtils.java | 27 +++-------- .../com/commafeed/frontend/model/Entry.java | 4 +- .../frontend/model/Subscription.java | 2 +- .../frontend/rest/resources/FeedREST.java | 13 ++++-- src/main/webapp/js/directives.js | 2 +- 6 files changed, 49 insertions(+), 44 deletions(-) diff --git a/src/main/java/com/commafeed/backend/feeds/FaviconFetcher.java b/src/main/java/com/commafeed/backend/feeds/FaviconFetcher.java index d6f3377f..166474f4 100644 --- a/src/main/java/com/commafeed/backend/feeds/FaviconFetcher.java +++ b/src/main/java/com/commafeed/backend/feeds/FaviconFetcher.java @@ -36,29 +36,45 @@ public class FaviconFetcher { @Inject HttpGetter getter; - public byte[] fetch(String targetPath) { - byte[] icon = getIconAtRoot(targetPath); + public byte[] fetch(String url) { + + if (url == null) { + log.info("url is null"); + return null; + } + + int doubleSlash = url.indexOf("//"); + if (doubleSlash == -1) { + doubleSlash = 0; + } else { + doubleSlash += 2; + } + int firstSlash = url.indexOf('/', doubleSlash); + if (firstSlash != -1) { + url = url.substring(0, firstSlash); + } + + byte[] icon = getIconAtRoot(url); if (icon == null) { - icon = getIconInPage(targetPath); + icon = getIconInPage(url); } return icon; } - private byte[] getIconAtRoot(String targetPath) { + private byte[] getIconAtRoot(String url) { byte[] bytes = null; String contentType = null; try { - String url = FeedUtils.removeTrailingSlash(targetPath) - + "/favicon.ico"; - log.debug("getting root icon at {}", url); + url = FeedUtils.removeTrailingSlash(url) + "/favicon.ico"; + log.info("getting root icon at {}", url); HttpResult result = getter.getBinary(url); bytes = result.getContent(); contentType = result.getContentType(); } catch (Exception e) { - log.info("Failed to retrieve iconAtRoot: " + e.getMessage(), e); + log.debug("Failed to retrieve iconAtRoot: " + e.getMessage(), e); } if (!isValidIconResponse(bytes, contentType)) { @@ -74,7 +90,7 @@ public class FaviconFetcher { long length = content.length; - if (!contentType.isEmpty()) { + if (StringUtils.isNotBlank(contentType)) { contentType = contentType.split(";")[0]; } @@ -98,13 +114,12 @@ public class FaviconFetcher { return true; } - private byte[] getIconInPage(String targetPath) { - log.info("iconInPage, trying " + targetPath); + private byte[] getIconInPage(String url) { - Document doc; + Document doc = null; try { - HttpResult result = getter.getBinary(targetPath); - doc = Jsoup.parse(new String(result.getContent()), targetPath); + HttpResult result = getter.getBinary(url); + doc = Jsoup.parse(new String(result.getContent()), url); } catch (Exception e) { log.info("Failed to retrieve page to find icon"); return null; @@ -114,7 +129,7 @@ public class FaviconFetcher { .select("link[rel~=(?i)^(shortcut|icon|shortcut icon)$]"); if (icons.isEmpty()) { - log.info("No icon found in page"); + log.info("No icon found in page {}", url); return null; } diff --git a/src/main/java/com/commafeed/backend/feeds/FeedUtils.java b/src/main/java/com/commafeed/backend/feeds/FeedUtils.java index 88aee7e9..841f565a 100644 --- a/src/main/java/com/commafeed/backend/feeds/FeedUtils.java +++ b/src/main/java/com/commafeed/backend/feeds/FeedUtils.java @@ -1,7 +1,5 @@ package com.commafeed.backend.feeds; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; import java.util.Calendar; import java.util.Collection; import java.util.Collections; @@ -22,6 +20,7 @@ import org.slf4j.LoggerFactory; import com.commafeed.backend.model.Feed; import com.commafeed.backend.model.FeedEntry; +import com.commafeed.backend.model.FeedSubscription; import com.google.api.client.util.Lists; import com.google.gwt.i18n.client.HasDirection.Direction; import com.google.gwt.i18n.shared.BidiUtils; @@ -263,25 +262,9 @@ public class FeedUtils { return baseUrl + url; } - public static String getFaviconUrl(String url, String publicUrl) { - - String defaultIcon = removeTrailingSlash(publicUrl) - + "/images/default_favicon.gif"; - if (StringUtils.isBlank(url)) { - return defaultIcon; - } - - int index = Math.max(url.length(), url.lastIndexOf('?')); - - StringBuilder iconUrl = new StringBuilder( - "https://getfavicon.appspot.com/"); - try { - iconUrl.append(URLEncoder.encode(url.substring(0, index), "UTF-8")); - } catch (UnsupportedEncodingException e) { - // never happens - log.error(e.getMessage(), e); - } - iconUrl.append("?defaulticon=none"); - return iconUrl.toString(); + public static String getFaviconUrl(FeedSubscription subscription, + String publicUrl) { + return removeTrailingSlash(publicUrl) + "/rest/feed/favicon?id=" + + subscription.getId(); } } diff --git a/src/main/java/com/commafeed/frontend/model/Entry.java b/src/main/java/com/commafeed/frontend/model/Entry.java index d83d1ddd..945a84a9 100644 --- a/src/main/java/com/commafeed/frontend/model/Entry.java +++ b/src/main/java/com/commafeed/frontend/model/Entry.java @@ -47,8 +47,8 @@ public class Entry implements Serializable { entry.setFeedId(String.valueOf(status.getSubscription().getId())); entry.setFeedUrl(status.getSubscription().getFeed().getUrl()); entry.setFeedLink(status.getSubscription().getFeed().getLink()); - entry.setIconUrl(FeedUtils.getFaviconUrl(status.getSubscription() - .getFeed().getLink(), publicUrl)); + entry.setIconUrl(FeedUtils.getFaviconUrl(status.getSubscription(), + publicUrl)); return entry; } diff --git a/src/main/java/com/commafeed/frontend/model/Subscription.java b/src/main/java/com/commafeed/frontend/model/Subscription.java index 83650ae0..aa86791d 100644 --- a/src/main/java/com/commafeed/frontend/model/Subscription.java +++ b/src/main/java/com/commafeed/frontend/model/Subscription.java @@ -34,7 +34,7 @@ public class Subscription implements Serializable { sub.setErrorCount(feed.getErrorCount()); sub.setFeedUrl(feed.getUrl()); sub.setFeedLink(feed.getLink()); - sub.setIconUrl(FeedUtils.getFaviconUrl(feed.getLink(), publicUrl)); + sub.setIconUrl(FeedUtils.getFaviconUrl(subscription, publicUrl)); sub.setLastRefresh(feed.getLastUpdated()); sub.setNextRefresh((feed.getDisabledUntil() != null && feed .getDisabledUntil().before(now)) ? null : feed diff --git a/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java b/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java index a6c1df0e..e7d56b70 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java @@ -18,7 +18,6 @@ import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.CacheControl; -import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; @@ -31,13 +30,13 @@ import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; -import org.apache.http.impl.cookie.DateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.commafeed.backend.StartupBean; import com.commafeed.backend.feeds.FeedUtils; import com.commafeed.backend.feeds.FetchedFeed; +import com.commafeed.backend.model.Feed; import com.commafeed.backend.model.FeedCategory; import com.commafeed.backend.model.FeedEntryStatus; import com.commafeed.backend.model.FeedSubscription; @@ -253,8 +252,16 @@ public class FeedREST extends AbstractResourceREST { @GET @Path("/favicon") @ApiOperation(value = "Fetch a feed's icon", notes = "Fetch icon of a feed") - public Response getFavicon(@QueryParam("url") String url) { + public Response getFavicon(@QueryParam("id") Long id) { + Preconditions.checkNotNull(id); + FeedSubscription subscription = feedSubscriptionDAO.findById(getUser(), + id); + if (subscription == null) { + return Response.status(Status.NOT_FOUND).build(); + } + Feed feed = subscription.getFeed(); + String url = feed.getLink() != null ? feed.getLink() : feed.getUrl(); byte[] icon = faviconFetcher.fetch(url); ResponseBuilder builder = null; diff --git a/src/main/webapp/js/directives.js b/src/main/webapp/js/directives.js index abbc6a6a..282c53cd 100644 --- a/src/main/webapp/js/directives.js +++ b/src/main/webapp/js/directives.js @@ -50,7 +50,7 @@ module url : '=' }, replace : true, - template : '' + template : '' }; });