diff --git a/src/main/java/com/browserstack/local/Local.java b/src/main/java/com/browserstack/local/Local.java index 8e4cb34..7fefe33 100644 --- a/src/main/java/com/browserstack/local/Local.java +++ b/src/main/java/com/browserstack/local/Local.java @@ -23,7 +23,7 @@ public class Local { private LocalProcess proc = null; // Current version of binding package, used for --source option of binary - private final String packageVersion = "1.1.4"; + private static final String packageVersion = "1.1.4"; private final Map parameters; private final Map avoidValueParameters; @@ -130,6 +130,15 @@ public boolean isRunning() throws Exception { return isProcessRunning(pid); } + /** + * Returns the package version + * + * @return {String} package version + */ + public static String getPackageVersion() { + return packageVersion; + } + /** * Creates a list of command-line arguments for the Local instance * diff --git a/src/main/java/com/browserstack/local/LocalBinary.java b/src/main/java/com/browserstack/local/LocalBinary.java index 5f088d0..6c83156 100644 --- a/src/main/java/com/browserstack/local/LocalBinary.java +++ b/src/main/java/com/browserstack/local/LocalBinary.java @@ -2,11 +2,15 @@ import org.apache.commons.io.FileUtils; import java.io.IOException; +import java.io.InputStream; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.File; import java.net.URL; +import java.net.URLConnection; import java.util.regex.Pattern; +import java.util.zip.GZIPInputStream; +import java.util.zip.ZipException; class LocalBinary { @@ -58,7 +62,8 @@ private void initialize() throws LocalException { throw new LocalException("Failed to detect OS type"); } - httpPath = BIN_URL + binFileName; + String sourceURL = BIN_URL; + httpPath = sourceURL + binFileName; } private boolean isAlpine() { @@ -174,7 +179,7 @@ private void downloadBinary(String destParentDir, Boolean custom) throws LocalEx URL url = new URL(httpPath); File f = new File(source); - FileUtils.copyURLToFile(url, f); + newCopyToFile(url, f); changePermissions(binaryPath); } catch (Exception e) { @@ -192,4 +197,26 @@ private void changePermissions(String path) { public String getBinaryPath() { return binaryPath; } + + private static void newCopyToFile(URL url, File f) throws IOException { + URLConnection conn = url.openConnection(); + conn.setRequestProperty("User-Agent", "browserstack-local-java/" + Local.getPackageVersion()); + conn.setRequestProperty("Accept-Encoding", "gzip, *"); + String contentEncoding = conn.getContentEncoding(); + + if (contentEncoding == null || !contentEncoding.toLowerCase().contains("gzip")) { + FileUtils.copyToFile(conn.getInputStream(), f); + return; + } + + try (InputStream stream = new GZIPInputStream(conn.getInputStream())) { + if (System.getenv().containsKey("BROWSERSTACK_LOCAL_DEBUG_GZIP")) { + System.out.println("using gzip in " + conn.getRequestProperty("User-Agent")); + } + + FileUtils.copyToFile(stream, f); + } catch (ZipException e) { + FileUtils.copyURLToFile(url, f); + } + } }