Skip to content

Commit

Permalink
feat: Make proxy reading method public (#19902)
Browse files Browse the repository at this point in the history
  • Loading branch information
Artur- authored Sep 6, 2024
1 parent 9e66a44 commit ed1b99a
Show file tree
Hide file tree
Showing 4 changed files with 166 additions and 136 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -128,16 +128,6 @@ public class FrontendTools {
private static final FrontendVersion SUPPORTED_NPM_VERSION = new FrontendVersion(
SUPPORTED_NPM_MAJOR_VERSION, SUPPORTED_NPM_MINOR_VERSION);

static final String NPMRC_NOPROXY_PROPERTY_KEY = "noproxy";
static final String NPMRC_HTTPS_PROXY_PROPERTY_KEY = "https-proxy";
static final String NPMRC_PROXY_PROPERTY_KEY = "proxy";

// Proxy config properties keys (for both system properties and environment
// variables) can be either fully upper case or fully lower case
static final String SYSTEM_NOPROXY_PROPERTY_KEY = "NOPROXY";
static final String SYSTEM_HTTPS_PROXY_PROPERTY_KEY = "HTTPS_PROXY";
static final String SYSTEM_HTTP_PROXY_PROPERTY_KEY = "HTTP_PROXY";

private static final int SUPPORTED_PNPM_MAJOR_VERSION = 7;
private static final int SUPPORTED_PNPM_MINOR_VERSION = 0;

Expand Down Expand Up @@ -712,18 +702,7 @@ protected String installNode(String nodeVersion, URI downloadRoot) {
*/
// Not private because of test
protected List<ProxyConfig.Proxy> getProxies() {
File projectNpmrc = new File(baseDir, ".npmrc");
File userNpmrc = new File(FileUtils.getUserDirectory(), ".npmrc");
List<ProxyConfig.Proxy> proxyList = new ArrayList<>();

proxyList.addAll(readProxySettingsFromSystemProperties());
proxyList.addAll(
readProxySettingsFromNpmrcFile("user .npmrc", userNpmrc));
proxyList.addAll(
readProxySettingsFromNpmrcFile("project .npmrc", projectNpmrc));
proxyList.addAll(readProxySettingsFromEnvironmentVariables());

return proxyList;
return ProxyFactory.getProxies(new File(baseDir));
}

void checkForFaultyNpmVersion(FrontendVersion npmVersion) {
Expand Down Expand Up @@ -869,112 +848,6 @@ private Logger getLogger() {
return LoggerFactory.getLogger(FrontendTools.class);
}

private List<ProxyConfig.Proxy> readProxySettingsFromNpmrcFile(
String fileDescription, File npmrc) {
if (!npmrc.exists()) {
return Collections.emptyList();
}

try (FileReader fileReader = new FileReader(npmrc)) { // NOSONAR
List<ProxyConfig.Proxy> proxyList = new ArrayList<>(2);
Properties properties = new Properties();
properties.load(fileReader);
String noproxy = properties.getProperty(NPMRC_NOPROXY_PROPERTY_KEY);
if (noproxy != null)
noproxy = noproxy.replaceAll(",", "|");
String httpsProxyUrl = properties
.getProperty(NPMRC_HTTPS_PROXY_PROPERTY_KEY);
if (httpsProxyUrl != null) {
proxyList.add(new ProxyConfig.Proxy(
"https-proxy - " + fileDescription, httpsProxyUrl,
noproxy));
}
String proxyUrl = properties.getProperty(NPMRC_PROXY_PROPERTY_KEY);
if (proxyUrl != null) {
proxyList.add(new ProxyConfig.Proxy(
"proxy - " + fileDescription, proxyUrl, noproxy));
}
return proxyList;
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}

private List<ProxyConfig.Proxy> readProxySettingsFromSystemProperties() {
List<ProxyConfig.Proxy> proxyList = new ArrayList<>(2);

String noproxy = getNonNull(
System.getProperty(SYSTEM_NOPROXY_PROPERTY_KEY),
System.getProperty(SYSTEM_NOPROXY_PROPERTY_KEY.toLowerCase()));
if (noproxy != null) {
noproxy = noproxy.replaceAll(",", "|");
}

String httpsProxyUrl = getNonNull(
System.getProperty(SYSTEM_HTTPS_PROXY_PROPERTY_KEY),
System.getProperty(
SYSTEM_HTTPS_PROXY_PROPERTY_KEY.toLowerCase()));
if (httpsProxyUrl != null) {
proxyList.add(new ProxyConfig.Proxy("https-proxy - system",
httpsProxyUrl, noproxy));
}

String proxyUrl = getNonNull(
System.getProperty(SYSTEM_HTTP_PROXY_PROPERTY_KEY),
System.getProperty(
SYSTEM_HTTP_PROXY_PROPERTY_KEY.toLowerCase()));
if (proxyUrl != null) {
proxyList.add(
new ProxyConfig.Proxy("proxy - system", proxyUrl, noproxy));
}

return proxyList;
}

private List<ProxyConfig.Proxy> readProxySettingsFromEnvironmentVariables() {
List<ProxyConfig.Proxy> proxyList = new ArrayList<>(2);

String noproxy = getNonNull(System.getenv(SYSTEM_NOPROXY_PROPERTY_KEY),
System.getenv(SYSTEM_NOPROXY_PROPERTY_KEY.toLowerCase()));
if (noproxy != null) {
noproxy = noproxy.replaceAll(",", "|");
}

String httpsProxyUrl = getNonNull(
System.getenv(SYSTEM_HTTPS_PROXY_PROPERTY_KEY),
System.getenv(SYSTEM_HTTPS_PROXY_PROPERTY_KEY.toLowerCase()));
if (httpsProxyUrl != null) {
proxyList.add(new ProxyConfig.Proxy("https-proxy - env",
httpsProxyUrl, noproxy));
}

String proxyUrl = getNonNull(
System.getenv(SYSTEM_HTTP_PROXY_PROPERTY_KEY),
System.getenv(SYSTEM_HTTP_PROXY_PROPERTY_KEY.toLowerCase()));
if (proxyUrl != null) {
proxyList.add(
new ProxyConfig.Proxy("proxy - env", proxyUrl, noproxy));
}

return proxyList;
}

/**
* Get the first non null value from the given array.
*
* @param valueArray
* array of values to get non null from
* @return first non null value or null if no values found
*/
private String getNonNull(String... valueArray) {
for (String value : valueArray) {
if (value != null) {
return value;
}
}
return null;
}

private List<String> getNpmExecutable(boolean removePnpmLock) {
List<String> returnCommand = new ArrayList<>(
getNpmCliToolExecutable(BuildTool.NPM));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
package com.vaadin.flow.server.frontend;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Properties;

import org.apache.commons.io.FileUtils;

import com.vaadin.flow.server.frontend.installer.ProxyConfig;

public class ProxyFactory {

static final String NPMRC_NOPROXY_PROPERTY_KEY = "noproxy";
static final String NPMRC_HTTPS_PROXY_PROPERTY_KEY = "https-proxy";
static final String NPMRC_PROXY_PROPERTY_KEY = "proxy";

// Proxy config properties keys (for both system properties and environment
// variables) can be either fully upper case or fully lower case
static final String SYSTEM_NOPROXY_PROPERTY_KEY = "NOPROXY";
static final String SYSTEM_HTTPS_PROXY_PROPERTY_KEY = "HTTPS_PROXY";
static final String SYSTEM_HTTP_PROXY_PROPERTY_KEY = "HTTP_PROXY";

/**
* Read list of configured proxies in order from system properties, .npmrc
* file in the project root folder, .npmrc file in user root folder and
* system environment variables.
*
* @return list of configured proxies
*/
public static List<ProxyConfig.Proxy> getProxies(File projectDirectory) {
File projectNpmrc = new File(projectDirectory, ".npmrc");
File userNpmrc = new File(FileUtils.getUserDirectory(), ".npmrc");
List<ProxyConfig.Proxy> proxyList = new ArrayList<>();

proxyList.addAll(readProxySettingsFromSystemProperties());
proxyList.addAll(
readProxySettingsFromNpmrcFile("user .npmrc", userNpmrc));
proxyList.addAll(
readProxySettingsFromNpmrcFile("project .npmrc", projectNpmrc));
proxyList.addAll(readProxySettingsFromEnvironmentVariables());

return proxyList;
}

private static List<ProxyConfig.Proxy> readProxySettingsFromNpmrcFile(
String fileDescription, File npmrc) {
if (!npmrc.exists()) {
return Collections.emptyList();
}

try (FileReader fileReader = new FileReader(npmrc)) { // NOSONAR
List<ProxyConfig.Proxy> proxyList = new ArrayList<>(2);
Properties properties = new Properties();
properties.load(fileReader);
String noproxy = properties.getProperty(NPMRC_NOPROXY_PROPERTY_KEY);
if (noproxy != null)
noproxy = noproxy.replaceAll(",", "|");
String httpsProxyUrl = properties
.getProperty(NPMRC_HTTPS_PROXY_PROPERTY_KEY);
if (httpsProxyUrl != null) {
proxyList.add(new ProxyConfig.Proxy(
"https-proxy - " + fileDescription, httpsProxyUrl,
noproxy));
}
String proxyUrl = properties.getProperty(NPMRC_PROXY_PROPERTY_KEY);
if (proxyUrl != null) {
proxyList.add(new ProxyConfig.Proxy(
"proxy - " + fileDescription, proxyUrl, noproxy));
}
return proxyList;
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}

private static List<ProxyConfig.Proxy> readProxySettingsFromSystemProperties() {
List<ProxyConfig.Proxy> proxyList = new ArrayList<>(2);

String noproxy = getNonNull(
System.getProperty(SYSTEM_NOPROXY_PROPERTY_KEY),
System.getProperty(SYSTEM_NOPROXY_PROPERTY_KEY.toLowerCase()));
if (noproxy != null) {
noproxy = noproxy.replaceAll(",", "|");
}

String httpsProxyUrl = getNonNull(
System.getProperty(SYSTEM_HTTPS_PROXY_PROPERTY_KEY),
System.getProperty(
SYSTEM_HTTPS_PROXY_PROPERTY_KEY.toLowerCase()));
if (httpsProxyUrl != null) {
proxyList.add(new ProxyConfig.Proxy("https-proxy - system",
httpsProxyUrl, noproxy));
}

String proxyUrl = getNonNull(
System.getProperty(SYSTEM_HTTP_PROXY_PROPERTY_KEY),
System.getProperty(
SYSTEM_HTTP_PROXY_PROPERTY_KEY.toLowerCase()));
if (proxyUrl != null) {
proxyList.add(
new ProxyConfig.Proxy("proxy - system", proxyUrl, noproxy));
}

return proxyList;
}

private static List<ProxyConfig.Proxy> readProxySettingsFromEnvironmentVariables() {
List<ProxyConfig.Proxy> proxyList = new ArrayList<>(2);

String noproxy = getNonNull(System.getenv(SYSTEM_NOPROXY_PROPERTY_KEY),
System.getenv(SYSTEM_NOPROXY_PROPERTY_KEY.toLowerCase()));
if (noproxy != null) {
noproxy = noproxy.replaceAll(",", "|");
}

String httpsProxyUrl = getNonNull(
System.getenv(SYSTEM_HTTPS_PROXY_PROPERTY_KEY),
System.getenv(SYSTEM_HTTPS_PROXY_PROPERTY_KEY.toLowerCase()));
if (httpsProxyUrl != null) {
proxyList.add(new ProxyConfig.Proxy("https-proxy - env",
httpsProxyUrl, noproxy));
}

String proxyUrl = getNonNull(
System.getenv(SYSTEM_HTTP_PROXY_PROPERTY_KEY),
System.getenv(SYSTEM_HTTP_PROXY_PROPERTY_KEY.toLowerCase()));
if (proxyUrl != null) {
proxyList.add(
new ProxyConfig.Proxy("proxy - env", proxyUrl, noproxy));
}

return proxyList;
}

/**
* Get the first non null value from the given array.
*
* @param valueArray
* array of values to get non null from
* @return first non null value or null if no values found
*/
private static String getNonNull(String... valueArray) {
for (String value : valueArray) {
if (value != null) {
return value;
}
}
return null;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -494,11 +494,11 @@ public synchronized void getProxies_systemPropertiesAndNpmrcWithProxySetting_sho
FrontendTools tools = new FrontendTools(settings);

Properties properties = new Properties();
properties.put(FrontendTools.NPMRC_PROXY_PROPERTY_KEY,
properties.put(ProxyFactory.NPMRC_PROXY_PROPERTY_KEY,
"http://httpuser:httppassword@httphost:8080");
properties.put(FrontendTools.NPMRC_HTTPS_PROXY_PROPERTY_KEY,
properties.put(ProxyFactory.NPMRC_HTTPS_PROXY_PROPERTY_KEY,
"http://httpsuser:httpspassword@httpshost:8081");
properties.put(FrontendTools.NPMRC_NOPROXY_PROPERTY_KEY,
properties.put(ProxyFactory.NPMRC_NOPROXY_PROPERTY_KEY,
"192.168.1.1,vaadin.com,mycompany.com");
try (FileOutputStream fileOutputStream = new FileOutputStream(npmrc)) {
properties.store(fileOutputStream, null);
Expand Down Expand Up @@ -572,9 +572,9 @@ public synchronized void getProxies_npmrcWithProxySettingNoNoproxy_shouldReturnN
throws IOException {
File npmrc = new File(tmpDirWithNpmrc.newFolder("test1"), ".npmrc");
Properties properties = new Properties();
properties.put(FrontendTools.NPMRC_PROXY_PROPERTY_KEY,
properties.put(ProxyFactory.NPMRC_PROXY_PROPERTY_KEY,
"http://httpuser:httppassword@httphost:8080");
properties.put(FrontendTools.NPMRC_HTTPS_PROXY_PROPERTY_KEY,
properties.put(ProxyFactory.NPMRC_HTTPS_PROXY_PROPERTY_KEY,
"http://httpsuser:httpspassword@httpshost:8081");
try (FileOutputStream fileOutputStream = new FileOutputStream(npmrc)) {
properties.store(fileOutputStream, null);
Expand Down Expand Up @@ -612,11 +612,11 @@ public synchronized void getProxies_npmrcWithProxySetting_shouldReturnProxiesLis
throws IOException {
File npmrc = new File(tmpDirWithNpmrc.newFolder("test1"), ".npmrc");
Properties properties = new Properties();
properties.put(FrontendTools.NPMRC_PROXY_PROPERTY_KEY,
properties.put(ProxyFactory.NPMRC_PROXY_PROPERTY_KEY,
"http://httpuser:httppassword@httphost:8080");
properties.put(FrontendTools.NPMRC_HTTPS_PROXY_PROPERTY_KEY,
properties.put(ProxyFactory.NPMRC_HTTPS_PROXY_PROPERTY_KEY,
"http://httpsuser:httpspassword@httpshost:8081");
properties.put(FrontendTools.NPMRC_NOPROXY_PROPERTY_KEY,
properties.put(ProxyFactory.NPMRC_NOPROXY_PROPERTY_KEY,
"192.168.1.1,vaadin.com,mycompany.com");
try (FileOutputStream fileOutputStream = new FileOutputStream(npmrc)) {
properties.store(fileOutputStream, null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,7 @@ protected Stream<String> getExcludedPatterns() {
"com\\.vaadin\\.flow\\.server\\.frontend\\.installer\\.Platform",
"com\\.vaadin\\.flow\\.server\\.frontend\\.installer\\.ProxyConfig\\$Proxy",
"com\\.vaadin\\.flow\\.server\\.frontend\\.installer\\.ProxyConfig",
"com\\.vaadin\\.flow\\.server\\.frontend\\.ProxyFactory",

// Various test classes
".*\\.test(s)?\\..*", ".*Test.*",
Expand Down

0 comments on commit ed1b99a

Please sign in to comment.