From c9536ff3103729f4d3212f7196cf5cb6497de47a Mon Sep 17 00:00:00 2001 From: Ben Kelsey Date: Tue, 6 Dec 2016 21:25:45 -0800 Subject: [PATCH] This upgrades Apache HttpClient - Update to latest version of httpclient and httpcomponents - Fixes resulting deprecations - Switch to using try with resources Signed-off-by: Ben Kelsey --- libresonic-main/pom.xml | 4 +- .../player/ajax/CoverArtService.java | 110 ++++++------ .../libresonic/player/ajax/LyricsService.java | 20 +-- .../player/controller/ProxyController.java | 34 ++-- .../player/service/AudioScrobblerService.java | 24 +-- .../player/service/NetworkService.java | 58 +++---- .../player/service/PodcastService.java | 157 +++++++++--------- .../player/service/SettingsService.java | 6 - .../player/service/VersionService.java | 40 ++--- .../sonos/SonosServiceRegistration.java | 20 +-- 10 files changed, 229 insertions(+), 244 deletions(-) diff --git a/libresonic-main/pom.xml b/libresonic-main/pom.xml index 3e40f989..bd604eba 100644 --- a/libresonic-main/pom.xml +++ b/libresonic-main/pom.xml @@ -136,13 +136,13 @@ org.apache.httpcomponents httpcore - 4.2.4 + 4.4.5 org.apache.httpcomponents httpclient - 4.2.4 + 4.5.2 diff --git a/libresonic-main/src/main/java/org/libresonic/player/ajax/CoverArtService.java b/libresonic-main/src/main/java/org/libresonic/player/ajax/CoverArtService.java index 9464ecdc..360c668d 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/ajax/CoverArtService.java +++ b/libresonic-main/src/main/java/org/libresonic/player/ajax/CoverArtService.java @@ -25,11 +25,11 @@ import java.io.InputStream; import java.io.OutputStream; import org.apache.commons.io.IOUtils; -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.params.HttpConnectionParams; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; import org.libresonic.player.Logger; import org.libresonic.player.domain.MediaFile; @@ -72,69 +72,69 @@ public class CoverArtService { private void saveCoverArt(String path, String url) throws Exception { InputStream input = null; OutputStream output = null; - HttpClient client = new DefaultHttpClient(); - try { - HttpConnectionParams.setConnectionTimeout(client.getParams(), 20 * 1000); // 20 seconds - HttpConnectionParams.setSoTimeout(client.getParams(), 20 * 1000); // 20 seconds + try (CloseableHttpClient client = HttpClients.createDefault()) { + RequestConfig requestConfig = RequestConfig.custom() + .setConnectTimeout(20 * 1000) // 20 seconds + .setSocketTimeout(20 * 1000) // 20 seconds + .build(); HttpGet method = new HttpGet(url); + method.setConfig(requestConfig); + try (CloseableHttpResponse response = client.execute(method)) { + input = response.getEntity().getContent(); + + // Attempt to resolve proper suffix. + String suffix = "jpg"; + if (url.toLowerCase().endsWith(".gif")) { + suffix = "gif"; + } else if (url.toLowerCase().endsWith(".png")) { + suffix = "png"; + } - HttpResponse response = client.execute(method); - input = response.getEntity().getContent(); - - // Attempt to resolve proper suffix. - String suffix = "jpg"; - if (url.toLowerCase().endsWith(".gif")) { - suffix = "gif"; - } else if (url.toLowerCase().endsWith(".png")) { - suffix = "png"; - } - - // Check permissions. - File newCoverFile = new File(path, "cover." + suffix); - if (!securityService.isWriteAllowed(newCoverFile)) { - throw new Exception("Permission denied: " + StringUtil.toHtml(newCoverFile.getPath())); - } - - // If file exists, create a backup. - backup(newCoverFile, new File(path, "cover." + suffix + ".backup")); - - // Write file. - output = new FileOutputStream(newCoverFile); - IOUtils.copy(input, output); - - MediaFile dir = mediaFileService.getMediaFile(path); - - // Refresh database. - mediaFileService.refreshMediaFile(dir); - dir = mediaFileService.getMediaFile(dir.getId()); + // Check permissions. + File newCoverFile = new File(path, "cover." + suffix); + if (!securityService.isWriteAllowed(newCoverFile)) { + throw new Exception("Permission denied: " + StringUtil.toHtml(newCoverFile.getPath())); + } - // Rename existing cover files if new cover file is not the preferred. - try { - while (true) { - File coverFile = mediaFileService.getCoverArt(dir); - if (coverFile != null && !isMediaFile(coverFile) && !newCoverFile.equals(coverFile)) { - if (!coverFile.renameTo(new File(coverFile.getCanonicalPath() + ".old"))) { - LOG.warn("Unable to rename old image file " + coverFile); + // If file exists, create a backup. + backup(newCoverFile, new File(path, "cover." + suffix + ".backup")); + + // Write file. + output = new FileOutputStream(newCoverFile); + IOUtils.copy(input, output); + + MediaFile dir = mediaFileService.getMediaFile(path); + + // Refresh database. + mediaFileService.refreshMediaFile(dir); + dir = mediaFileService.getMediaFile(dir.getId()); + + // Rename existing cover files if new cover file is not the preferred. + try { + while (true) { + File coverFile = mediaFileService.getCoverArt(dir); + if (coverFile != null && !isMediaFile(coverFile) && !newCoverFile.equals(coverFile)) { + if (!coverFile.renameTo(new File(coverFile.getCanonicalPath() + ".old"))) { + LOG.warn("Unable to rename old image file " + coverFile); + break; + } + LOG.info("Renamed old image file " + coverFile); + + // Must refresh again. + mediaFileService.refreshMediaFile(dir); + dir = mediaFileService.getMediaFile(dir.getId()); + } else { break; } - LOG.info("Renamed old image file " + coverFile); - - // Must refresh again. - mediaFileService.refreshMediaFile(dir); - dir = mediaFileService.getMediaFile(dir.getId()); - } else { - break; } + } catch (Exception x) { + LOG.warn("Failed to rename existing cover file.", x); } - } catch (Exception x) { - LOG.warn("Failed to rename existing cover file.", x); } - } finally { IOUtils.closeQuietly(input); IOUtils.closeQuietly(output); - client.getConnectionManager().shutdown(); } } diff --git a/libresonic-main/src/main/java/org/libresonic/player/ajax/LyricsService.java b/libresonic-main/src/main/java/org/libresonic/player/ajax/LyricsService.java index 9ccc46a6..f2578614 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/ajax/LyricsService.java +++ b/libresonic-main/src/main/java/org/libresonic/player/ajax/LyricsService.java @@ -24,12 +24,12 @@ import java.io.StringReader; import java.net.SocketException; import org.apache.commons.lang.StringUtils; -import org.apache.http.client.HttpClient; import org.apache.http.client.ResponseHandler; +import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.BasicResponseHandler; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.params.HttpConnectionParams; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; import org.jdom.Document; import org.jdom.Element; import org.jdom.Namespace; @@ -92,17 +92,15 @@ public class LyricsService { } private String executeGetRequest(String url) throws IOException { - HttpClient client = new DefaultHttpClient(); - HttpConnectionParams.setConnectionTimeout(client.getParams(), 15000); - HttpConnectionParams.setSoTimeout(client.getParams(), 15000); + RequestConfig requestConfig = RequestConfig.custom() + .setConnectTimeout(15000) + .setSocketTimeout(15000) + .build(); HttpGet method = new HttpGet(url); - try { - + method.setConfig(requestConfig); + try (CloseableHttpClient client = HttpClients.createDefault()) { ResponseHandler responseHandler = new BasicResponseHandler(); return client.execute(method, responseHandler); - - } finally { - client.getConnectionManager().shutdown(); } } } diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/ProxyController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/ProxyController.java index 06691f1e..552aae50 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/ProxyController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/ProxyController.java @@ -25,12 +25,12 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils; -import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; -import org.apache.http.client.HttpClient; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.params.HttpConnectionParams; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; import org.springframework.web.bind.ServletRequestUtils; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; @@ -45,24 +45,26 @@ public class ProxyController implements Controller { public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { String url = ServletRequestUtils.getRequiredStringParameter(request, "url"); - HttpClient client = new DefaultHttpClient(); - HttpConnectionParams.setConnectionTimeout(client.getParams(), 15000); - HttpConnectionParams.setSoTimeout(client.getParams(), 15000); + RequestConfig requestConfig = RequestConfig.custom() + .setConnectTimeout(15000) + .setSocketTimeout(15000) + .build(); HttpGet method = new HttpGet(url); + method.setConfig(requestConfig); InputStream in = null; - try { - HttpResponse resp = client.execute(method); - int statusCode = resp.getStatusLine().getStatusCode(); - if (statusCode != HttpStatus.SC_OK) { - response.sendError(statusCode); - } else { - in = resp.getEntity().getContent(); - IOUtils.copy(in, response.getOutputStream()); + try (CloseableHttpClient client = HttpClients.createDefault()) { + try (CloseableHttpResponse resp = client.execute(method)) { + int statusCode = resp.getStatusLine().getStatusCode(); + if (statusCode != HttpStatus.SC_OK) { + response.sendError(statusCode); + } else { + in = resp.getEntity().getContent(); + IOUtils.copy(in, response.getOutputStream()); + } } } finally { IOUtils.closeQuietly(in); - client.getConnectionManager().shutdown(); } return null; } diff --git a/libresonic-main/src/main/java/org/libresonic/player/service/AudioScrobblerService.java b/libresonic-main/src/main/java/org/libresonic/player/service/AudioScrobblerService.java index fcdc76fc..9546ab30 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/service/AudioScrobblerService.java +++ b/libresonic-main/src/main/java/org/libresonic/player/service/AudioScrobblerService.java @@ -29,16 +29,16 @@ import java.util.concurrent.LinkedBlockingQueue; import org.apache.commons.codec.digest.DigestUtils; import org.apache.http.NameValuePair; -import org.apache.http.client.HttpClient; import org.apache.http.client.ResponseHandler; +import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.impl.client.BasicResponseHandler; -import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; -import org.apache.http.params.HttpConnectionParams; import org.libresonic.player.Logger; import org.libresonic.player.domain.MediaFile; @@ -62,7 +62,10 @@ public class AudioScrobblerService { private final LinkedBlockingQueue queue = new LinkedBlockingQueue(); private SettingsService settingsService; - + private final RequestConfig requestConfig = RequestConfig.custom() + .setConnectTimeout(15000) + .setSocketTimeout(15000) + .build(); /** * Registers the given media file at www.last.fm. This method returns immediately, the actual registration is done @@ -234,7 +237,9 @@ public class AudioScrobblerService { } private String[] executeGetRequest(String url) throws IOException { - return executeRequest(new HttpGet(url)); + HttpGet method = new HttpGet(url); + method.setConfig(requestConfig); + return executeRequest(method); } private String[] executePostRequest(String url, Map parameters) throws IOException { @@ -245,22 +250,17 @@ public class AudioScrobblerService { HttpPost request = new HttpPost(url); request.setEntity(new UrlEncodedFormEntity(params, StringUtil.ENCODING_UTF8)); - + request.setConfig(requestConfig); return executeRequest(request); } private String[] executeRequest(HttpUriRequest request) throws IOException { - HttpClient client = new DefaultHttpClient(); - HttpConnectionParams.setConnectionTimeout(client.getParams(), 15000); - HttpConnectionParams.setSoTimeout(client.getParams(), 15000); - try { + try (CloseableHttpClient client = HttpClients.createDefault()) { ResponseHandler responseHandler = new BasicResponseHandler(); String response = client.execute(request, responseHandler); return response.split("\\n"); - } finally { - client.getConnectionManager().shutdown(); } } diff --git a/libresonic-main/src/main/java/org/libresonic/player/service/NetworkService.java b/libresonic-main/src/main/java/org/libresonic/player/service/NetworkService.java index 279923c3..1992c0ea 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/service/NetworkService.java +++ b/libresonic-main/src/main/java/org/libresonic/player/service/NetworkService.java @@ -28,19 +28,18 @@ import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import org.apache.commons.lang.StringUtils; -import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.StatusLine; -import org.apache.http.client.HttpClient; +import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.BasicResponseHandler; -import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; -import org.apache.http.params.HttpConnectionParams; import org.apache.http.util.EntityUtils; import org.libresonic.player.Logger; @@ -250,34 +249,32 @@ public class NetworkService { params.add(new BasicNameValuePair("licenseHolder", settingsService.getLicenseEmail())); } - HttpClient client = new DefaultHttpClient(); - try { + + try (CloseableHttpClient client = HttpClients.createDefault()) { urlRedirectionStatus.setText(enable ? "Registering web address..." : "Unregistering web address..."); request.setEntity(new UrlEncodedFormEntity(params, StringUtil.ENCODING_UTF8)); - HttpResponse response = client.execute(request); - StatusLine status = response.getStatusLine(); - - switch (status.getStatusCode()) { - case HttpStatus.SC_BAD_REQUEST: - urlRedirectionStatus.setText(EntityUtils.toString(response.getEntity())); - testUrlRedirection = false; - break; - case HttpStatus.SC_OK: - urlRedirectionStatus.setText(enable ? "Successfully registered web address." : "Web address disabled."); - break; - default: - testUrlRedirection = false; - throw new IOException(status.getStatusCode() + " " + status.getReasonPhrase()); + try (CloseableHttpResponse response = client.execute(request)) { + StatusLine status = response.getStatusLine(); + + switch (status.getStatusCode()) { + case HttpStatus.SC_BAD_REQUEST: + urlRedirectionStatus.setText(EntityUtils.toString(response.getEntity())); + testUrlRedirection = false; + break; + case HttpStatus.SC_OK: + urlRedirectionStatus.setText(enable ? "Successfully registered web address." : "Web address disabled."); + break; + default: + testUrlRedirection = false; + throw new IOException(status.getStatusCode() + " " + status.getReasonPhrase()); + } } - } catch (Throwable x) { LOG.warn(enable ? "Failed to register web address." : "Failed to unregister web address.", x); urlRedirectionStatus.setText(enable ? ("Failed to register web address. " + x.getMessage() + " (" + x.getClass().getSimpleName() + ")") : "Web address disabled."); - } finally { - client.getConnectionManager().shutdown(); } // Test redirection, but only once. @@ -305,20 +302,19 @@ public class NetworkService { } HttpGet request = new HttpGet(url); - HttpClient client = new DefaultHttpClient(); - HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); - HttpConnectionParams.setSoTimeout(client.getParams(), 30000); - try { + RequestConfig requestConfig = RequestConfig.custom() + .setConnectTimeout(15000) + .setSocketTimeout(15000) + .build(); + request.setConfig(requestConfig); + try (CloseableHttpClient client = HttpClients.createDefault()) { urlRedirectionStatus.setText("Testing web address " + urlToTest + ". Please wait..."); String response = client.execute(request, new BasicResponseHandler()); urlRedirectionStatus.setText(response); - } catch (Throwable x) { LOG.warn("Failed to test web address.", x); urlRedirectionStatus.setText("Failed to test web address. " + x.getMessage() + " (" + x.getClass().getSimpleName() + ")"); - } finally { - client.getConnectionManager().shutdown(); } } } diff --git a/libresonic-main/src/main/java/org/libresonic/player/service/PodcastService.java b/libresonic-main/src/main/java/org/libresonic/player/service/PodcastService.java index 8754345c..7fd2ab9d 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/service/PodcastService.java +++ b/libresonic-main/src/main/java/org/libresonic/player/service/PodcastService.java @@ -39,25 +39,25 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.http.Header; import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.entity.ContentType; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.params.HttpConnectionParams; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; import org.jdom.Document; import org.jdom.Element; import org.jdom.Namespace; import org.jdom.input.SAXBuilder; -import com.google.common.base.Predicate; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; - import org.libresonic.player.Logger; import org.libresonic.player.dao.PodcastDao; import org.libresonic.player.domain.MediaFile; @@ -302,33 +302,34 @@ public class PodcastService { @SuppressWarnings({"unchecked"}) private void doRefreshChannel(PodcastChannel channel, boolean downloadEpisodes) { InputStream in = null; - HttpClient client = new DefaultHttpClient(); - try { + try (CloseableHttpClient client = HttpClients.createDefault()) { channel.setStatus(PodcastStatus.DOWNLOADING); channel.setErrorMessage(null); podcastDao.updateChannel(channel); - - HttpConnectionParams.setConnectionTimeout(client.getParams(), 2 * 60 * 1000); // 2 minutes - HttpConnectionParams.setSoTimeout(client.getParams(), 10 * 60 * 1000); // 10 minutes + RequestConfig requestConfig = RequestConfig.custom() + .setConnectTimeout(2 * 60 * 1000) // 2 minutes + .setSocketTimeout(10 * 60 * 1000) // 10 minutes + .build(); HttpGet method = new HttpGet(channel.getUrl()); + method.setConfig(requestConfig); - HttpResponse response = client.execute(method); - in = response.getEntity().getContent(); - - Document document = new SAXBuilder().build(in); - Element channelElement = document.getRootElement().getChild("channel"); + try (CloseableHttpResponse response = client.execute(method)) { + in = response.getEntity().getContent(); - channel.setTitle(StringUtil.removeMarkup(channelElement.getChildTextTrim("title"))); - channel.setDescription(StringUtil.removeMarkup(channelElement.getChildTextTrim("description"))); - channel.setImageUrl(getChannelImageUrl(channelElement)); - channel.setStatus(PodcastStatus.COMPLETED); - channel.setErrorMessage(null); - podcastDao.updateChannel(channel); + Document document = new SAXBuilder().build(in); + Element channelElement = document.getRootElement().getChild("channel"); - downloadImage(channel); - refreshEpisodes(channel, channelElement.getChildren("item")); + channel.setTitle(StringUtil.removeMarkup(channelElement.getChildTextTrim("title"))); + channel.setDescription(StringUtil.removeMarkup(channelElement.getChildTextTrim("description"))); + channel.setImageUrl(getChannelImageUrl(channelElement)); + channel.setStatus(PodcastStatus.COMPLETED); + channel.setErrorMessage(null); + podcastDao.updateChannel(channel); + downloadImage(channel); + refreshEpisodes(channel, channelElement.getChildren("item")); + } } catch (Exception x) { LOG.warn("Failed to get/parse RSS file for Podcast channel " + channel.getUrl(), x); channel.setStatus(PodcastStatus.ERROR); @@ -336,7 +337,6 @@ public class PodcastService { podcastDao.updateChannel(channel); } finally { IOUtils.closeQuietly(in); - client.getConnectionManager().shutdown(); } if (downloadEpisodes) { @@ -349,10 +349,9 @@ public class PodcastService { } private void downloadImage(PodcastChannel channel) { - HttpClient client = new DefaultHttpClient(); InputStream in = null; OutputStream out = null; - try { + try(CloseableHttpClient client = HttpClients.createDefault()) { String imageUrl = channel.getImageUrl(); if (imageUrl == null) { return; @@ -367,17 +366,17 @@ public class PodcastService { } HttpGet method = new HttpGet(imageUrl); - HttpResponse response = client.execute(method); - in = response.getEntity().getContent(); - out = new FileOutputStream(new File(dir, "cover." + getCoverArtSuffix(response))); - IOUtils.copy(in, out); - mediaFileService.refreshMediaFile(channelMediaFile); + try (CloseableHttpResponse response = client.execute(method)) { + in = response.getEntity().getContent(); + out = new FileOutputStream(new File(dir, "cover." + getCoverArtSuffix(response))); + IOUtils.copy(in, out); + mediaFileService.refreshMediaFile(channelMediaFile); + } } catch (Exception x) { LOG.warn("Failed to download cover art for podcast channel '" + channel.getTitle() + "': " + x, x); } finally { IOUtils.closeQuietly(in); IOUtils.closeQuietly(out); - client.getConnectionManager().shutdown(); } } @@ -534,68 +533,69 @@ public class PodcastService { LOG.info("Starting to download Podcast from " + episode.getUrl()); - HttpClient client = new DefaultHttpClient(); - try { + try (CloseableHttpClient client = HttpClients.createDefault()) { if (!settingsService.getLicenseInfo().isLicenseOrTrialValid()) { throw new Exception("Sorry, the trial period is expired."); } PodcastChannel channel = getChannel(episode.getChannelId()); - - HttpConnectionParams.setConnectionTimeout(client.getParams(), 2 * 60 * 1000); // 2 minutes - HttpConnectionParams.setSoTimeout(client.getParams(), 10 * 60 * 1000); // 10 minutes + RequestConfig requestConfig = RequestConfig.custom() + .setConnectTimeout(2 * 60 * 1000) // 2 minutes + .setSocketTimeout(10 * 60 * 1000) // 10 minutes + .build(); HttpGet method = new HttpGet(episode.getUrl()); + method.setConfig(requestConfig); - HttpResponse response = client.execute(method); - in = response.getEntity().getContent(); + try (CloseableHttpResponse response = client.execute(method)) { + in = response.getEntity().getContent(); - File file = getFile(channel, episode); - out = new FileOutputStream(file); + File file = getFile(channel, episode); + out = new FileOutputStream(file); - episode.setStatus(PodcastStatus.DOWNLOADING); - episode.setBytesDownloaded(0L); - episode.setErrorMessage(null); - episode.setPath(file.getPath()); - podcastDao.updateEpisode(episode); + episode.setStatus(PodcastStatus.DOWNLOADING); + episode.setBytesDownloaded(0L); + episode.setErrorMessage(null); + episode.setPath(file.getPath()); + podcastDao.updateEpisode(episode); - byte[] buffer = new byte[4096]; - long bytesDownloaded = 0; - int n; - long nextLogCount = 30000L; + byte[] buffer = new byte[4096]; + long bytesDownloaded = 0; + int n; + long nextLogCount = 30000L; - while ((n = in.read(buffer)) != -1) { - out.write(buffer, 0, n); - bytesDownloaded += n; + while ((n = in.read(buffer)) != -1) { + out.write(buffer, 0, n); + bytesDownloaded += n; - if (bytesDownloaded > nextLogCount) { - episode.setBytesDownloaded(bytesDownloaded); - nextLogCount += 30000L; + if (bytesDownloaded > nextLogCount) { + episode.setBytesDownloaded(bytesDownloaded); + nextLogCount += 30000L; - // Abort download if episode was deleted by user. - if (isEpisodeDeleted(episode)) { - break; + // Abort download if episode was deleted by user. + if (isEpisodeDeleted(episode)) { + break; + } + podcastDao.updateEpisode(episode); } - podcastDao.updateEpisode(episode); } - } - if (isEpisodeDeleted(episode)) { - LOG.info("Podcast " + episode.getUrl() + " was deleted. Aborting download."); - IOUtils.closeQuietly(out); - file.delete(); - } else { - addMediaFileIdToEpisodes(Arrays.asList(episode)); - episode.setBytesDownloaded(bytesDownloaded); - podcastDao.updateEpisode(episode); - LOG.info("Downloaded " + bytesDownloaded + " bytes from Podcast " + episode.getUrl()); - IOUtils.closeQuietly(out); - updateTags(file, episode); - episode.setStatus(PodcastStatus.COMPLETED); - podcastDao.updateEpisode(episode); - deleteObsoleteEpisodes(channel); + if (isEpisodeDeleted(episode)) { + LOG.info("Podcast " + episode.getUrl() + " was deleted. Aborting download."); + IOUtils.closeQuietly(out); + file.delete(); + } else { + addMediaFileIdToEpisodes(Arrays.asList(episode)); + episode.setBytesDownloaded(bytesDownloaded); + podcastDao.updateEpisode(episode); + LOG.info("Downloaded " + bytesDownloaded + " bytes from Podcast " + episode.getUrl()); + IOUtils.closeQuietly(out); + updateTags(file, episode); + episode.setStatus(PodcastStatus.COMPLETED); + podcastDao.updateEpisode(episode); + deleteObsoleteEpisodes(channel); + } } - } catch (Exception x) { LOG.warn("Failed to download Podcast from " + episode.getUrl(), x); episode.setStatus(PodcastStatus.ERROR); @@ -604,7 +604,6 @@ public class PodcastService { } finally { IOUtils.closeQuietly(in); IOUtils.closeQuietly(out); - client.getConnectionManager().shutdown(); } } diff --git a/libresonic-main/src/main/java/org/libresonic/player/service/SettingsService.java b/libresonic-main/src/main/java/org/libresonic/player/service/SettingsService.java index 4ca1eeef..44bcd48d 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/service/SettingsService.java +++ b/libresonic-main/src/main/java/org/libresonic/player/service/SettingsService.java @@ -43,12 +43,6 @@ import java.util.concurrent.TimeUnit; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; -import org.apache.http.client.HttpClient; -import org.apache.http.client.ResponseHandler; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.BasicResponseHandler; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.params.HttpConnectionParams; import org.libresonic.player.Logger; import org.libresonic.player.dao.AvatarDao; diff --git a/libresonic-main/src/main/java/org/libresonic/player/service/VersionService.java b/libresonic-main/src/main/java/org/libresonic/player/service/VersionService.java index 25938cdf..c93e117d 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/service/VersionService.java +++ b/libresonic-main/src/main/java/org/libresonic/player/service/VersionService.java @@ -19,16 +19,6 @@ */ package org.libresonic.player.service; -import org.libresonic.player.Logger; -import org.libresonic.player.domain.Version; -import org.apache.commons.io.IOUtils; -import org.apache.http.client.HttpClient; -import org.apache.http.client.ResponseHandler; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.BasicResponseHandler; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.params.HttpConnectionParams; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -40,6 +30,17 @@ import java.util.Date; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.commons.io.IOUtils; +import org.apache.http.client.ResponseHandler; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.BasicResponseHandler; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; + +import org.libresonic.player.Logger; +import org.libresonic.player.domain.Version; + /** * Provides version-related services, including functionality for determining whether a newer * version of Libresonic is available. @@ -231,25 +232,22 @@ public class VersionService { */ private void readLatestVersion() throws IOException { - HttpClient client = new DefaultHttpClient(); - HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); - HttpConnectionParams.setSoTimeout(client.getParams(), 10000); + RequestConfig requestConfig = RequestConfig.custom() + .setConnectTimeout(10000) + .setSocketTimeout(10000) + .build(); HttpGet method = new HttpGet(VERSION_URL + "?v=" + getLocalVersion()); + method.setConfig(requestConfig); String content; - try { - + try (CloseableHttpClient client = HttpClients.createDefault()) { ResponseHandler responseHandler = new BasicResponseHandler(); content = client.execute(method, responseHandler); - - } finally { - client.getConnectionManager().shutdown(); } - BufferedReader reader = new BufferedReader(new StringReader(content)); Pattern finalPattern = Pattern.compile("LIBRESONIC_FULL_VERSION_BEGIN(.*)LIBRESONIC_FULL_VERSION_END"); Pattern betaPattern = Pattern.compile("LIBRESONIC_BETA_VERSION_BEGIN(.*)LIBRESONIC_BETA_VERSION_END"); - try { + try (BufferedReader reader = new BufferedReader(new StringReader(content))) { String line = reader.readLine(); while (line != null) { Matcher finalMatcher = finalPattern.matcher(line); @@ -265,8 +263,6 @@ public class VersionService { line = reader.readLine(); } - } finally { - reader.close(); } } } diff --git a/libresonic-main/src/main/java/org/libresonic/player/service/sonos/SonosServiceRegistration.java b/libresonic-main/src/main/java/org/libresonic/player/service/sonos/SonosServiceRegistration.java index 593652a3..5215073b 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/service/sonos/SonosServiceRegistration.java +++ b/libresonic-main/src/main/java/org/libresonic/player/service/sonos/SonosServiceRegistration.java @@ -24,15 +24,15 @@ import java.util.ArrayList; import java.util.List; import org.apache.http.NameValuePair; -import org.apache.http.client.HttpClient; import org.apache.http.client.ResponseHandler; +import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.impl.client.BasicResponseHandler; -import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; -import org.apache.http.params.HttpConnectionParams; import org.libresonic.player.Logger; import org.libresonic.player.util.Pair; @@ -82,24 +82,24 @@ public class SonosServiceRegistration { for (Pair parameter : parameters) { params.add(new BasicNameValuePair(parameter.getFirst(), parameter.getSecond())); } - + RequestConfig requestConfig = RequestConfig.custom() + .setConnectTimeout(20 * 1000) // 20 seconds + .setSocketTimeout(20 * 1000) // 20 seconds + .build(); HttpPost request = new HttpPost(url); + request.setConfig(requestConfig); request.setEntity(new UrlEncodedFormEntity(params, StringUtil.ENCODING_UTF8)); return executeRequest(request); } private String executeRequest(HttpUriRequest request) throws IOException { - HttpClient client = new DefaultHttpClient(); - HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); - HttpConnectionParams.setSoTimeout(client.getParams(), 10000); - try { + + try (CloseableHttpClient client = HttpClients.createDefault()) { ResponseHandler responseHandler = new BasicResponseHandler(); return client.execute(request, responseHandler); - } finally { - client.getConnectionManager().shutdown(); } } }