diff --git a/scm-core/src/main/java/sonia/scm/net/HttpRequest.java b/scm-core/src/main/java/sonia/scm/net/HttpRequest.java index 7bd99abc9c..588e4dd111 100644 --- a/scm-core/src/main/java/sonia/scm/net/HttpRequest.java +++ b/scm-core/src/main/java/sonia/scm/net/HttpRequest.java @@ -169,6 +169,19 @@ public class HttpRequest return username; } + /** + * Method description + * + * + * @return + * + * @since 1.14 + */ + public boolean isDecodeGZip() + { + return decodeGZip; + } + //~--- set methods ---------------------------------------------------------- /** @@ -188,6 +201,22 @@ public class HttpRequest return this; } + /** + * Method description + * + * + * @param decodeGZip + * + * @return + * + * @since 1.14 + */ + public HttpRequest setDecodeGZip(boolean decodeGZip) + { + this.decodeGZip = decodeGZip; + return this; + } + /** * Method description * @@ -247,6 +276,9 @@ public class HttpRequest //~--- fields --------------------------------------------------------------- + /** Field description */ + private boolean decodeGZip = false; + /** Field description */ private Map> headers; diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/api/rest/resources/HgConfigResource.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/api/rest/resources/HgConfigResource.java index ba22451303..16eeb0232c 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/api/rest/resources/HgConfigResource.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/api/rest/resources/HgConfigResource.java @@ -87,15 +87,15 @@ public class HgConfigResource * * @param client * @param handler - * @param cacheManager + * @param pkgReader */ @Inject public HgConfigResource(HttpClient client, HgRepositoryHandler handler, - CacheManager cacheManager) + HgPackageReader pkgReader) { this.client = client; this.handler = handler; - this.pkgReader = new HgPackageReader(cacheManager); + this.pkgReader = pkgReader; } //~--- methods -------------------------------------------------------------- diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/HgPackageReader.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/HgPackageReader.java index 0bb967bdea..b4554111f6 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/HgPackageReader.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/HgPackageReader.java @@ -35,12 +35,18 @@ package sonia.scm.installer; //~--- non-JDK imports -------------------------------------------------------- +import com.google.inject.Inject; +import com.google.inject.Provider; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.PlatformType; import sonia.scm.cache.Cache; import sonia.scm.cache.CacheManager; +import sonia.scm.net.HttpClient; +import sonia.scm.net.HttpRequest; +import sonia.scm.net.HttpResponse; import sonia.scm.util.IOUtil; import sonia.scm.util.SystemUtil; import sonia.scm.util.Util; @@ -50,11 +56,8 @@ import sonia.scm.util.Util; import java.io.IOException; import java.io.InputStream; -import java.net.URL; - import java.util.ArrayList; import java.util.List; -import java.util.zip.GZIPInputStream; import javax.xml.bind.JAXB; @@ -83,10 +86,14 @@ public class HgPackageReader * * * @param cacheManager + * @param httpClientProvider */ - public HgPackageReader(CacheManager cacheManager) + @Inject + public HgPackageReader(CacheManager cacheManager, + Provider httpClientProvider) { cache = cacheManager.getCache(String.class, HgPackages.class, CACHENAME); + this.httpClientProvider = httpClientProvider; } //~--- get methods ---------------------------------------------------------- @@ -216,17 +223,13 @@ public class HgPackageReader try { - URL url = new URL(PACKAGEURL); + HttpRequest request = new HttpRequest(PACKAGEURL); - if (PACKAGEURL.endsWith(".gz")) - { - input = new GZIPInputStream(url.openStream()); - } - else - { - input = url.openStream(); - } + request.setDecodeGZip(true); + HttpResponse response = httpClientProvider.get().get(request); + + input = response.getContent(); packages = JAXB.unmarshal(input, HgPackages.class); } catch (IOException ex) @@ -251,4 +254,7 @@ public class HgPackageReader /** Field description */ private Cache cache; + + /** Field description */ + private Provider httpClientProvider; } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgServletModule.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgServletModule.java index fc843aae9f..f5e03dd525 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgServletModule.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgServletModule.java @@ -37,6 +37,7 @@ package sonia.scm.web; import com.google.inject.servlet.ServletModule; +import sonia.scm.installer.HgPackageReader; import sonia.scm.plugin.ext.Extension; import sonia.scm.repository.HgContext; import sonia.scm.repository.HgHookManager; @@ -67,6 +68,9 @@ public class HgServletModule extends ServletModule { bind(HgContext.class); bind(HgHookManager.class); + bind(HgPackageReader.class); + + // bind servlets serve(MAPPING_HOOK).with(HgHookCallbackServlet.class); // register hg cgi servlet diff --git a/scm-webapp/src/main/java/sonia/scm/net/URLHttpClient.java b/scm-webapp/src/main/java/sonia/scm/net/URLHttpClient.java index 0c91afac1f..3fecc05d91 100644 --- a/scm-webapp/src/main/java/sonia/scm/net/URLHttpClient.java +++ b/scm-webapp/src/main/java/sonia/scm/net/URLHttpClient.java @@ -251,7 +251,8 @@ public class URLHttpClient implements HttpClient { String url = createGetUrl(request.getUrl(), request.getParameters()); - return new URLHttpResponse(openConnection(request, url)); + return new URLHttpResponse(openConnection(request, url), + request.isDecodeGZip()); } //~--- methods -------------------------------------------------------------- diff --git a/scm-webapp/src/main/java/sonia/scm/net/URLHttpResponse.java b/scm-webapp/src/main/java/sonia/scm/net/URLHttpResponse.java index a661a7b0df..8ecf9527b3 100644 --- a/scm-webapp/src/main/java/sonia/scm/net/URLHttpResponse.java +++ b/scm-webapp/src/main/java/sonia/scm/net/URLHttpResponse.java @@ -70,8 +70,21 @@ public class URLHttpResponse implements HttpResponse * @param connection */ public URLHttpResponse(URLConnection connection) + { + this(connection, false); + } + + /** + * Constructs ... + * + * + * @param connection + * @param decodeGZip + */ + public URLHttpResponse(URLConnection connection, boolean decodeGZip) { this.connection = connection; + this.decodeGZip = decodeGZip; } //~--- methods -------------------------------------------------------------- @@ -114,7 +127,7 @@ public class URLHttpResponse implements HttpResponse String enc = connection.getContentEncoding(); InputStream input = null; - if (Util.isNotEmpty(enc) && enc.contains(ENCODING_GZIP)) + if (decodeGZip || (Util.isNotEmpty(enc) && enc.contains(ENCODING_GZIP))) { input = new GZIPInputStream(connection.getInputStream()); } @@ -215,8 +228,11 @@ public class URLHttpResponse implements HttpResponse //~--- fields --------------------------------------------------------------- /** Field description */ - private boolean clientClose = false; + private URLConnection connection; /** Field description */ - private URLConnection connection; + private boolean decodeGZip = false; + + /** Field description */ + private boolean clientClose = false; }