in src/main/java/com/microsoft/azure/functions/worker/handler/FunctionEnvironmentReloadRequestHandler.java [42:81]
public void setEnv(Map<String, String> newSettings) throws Exception {
if (newSettings == null || newSettings.isEmpty()) {
return;
}
// Update Environment variables in the JVM
// As an FYI, the JVM creates a copy of the environment variables when it starts.
// This will edit that copy, not the environment variables for the parent process that started the JVM
try {
// update env variable for running JVM on Windows
Class<?> processEnvironmentClass = Class.forName("java.lang.ProcessEnvironment");
Field theEnvironmentField = processEnvironmentClass.getDeclaredField("theEnvironment");
theEnvironmentField.setAccessible(true);
Map<String, String> env = (Map<String, String>) theEnvironmentField.get(null);
env.clear();
env.putAll(newSettings);
Field theCaseInsensitiveEnvironmentField = processEnvironmentClass
.getDeclaredField("theCaseInsensitiveEnvironment");
theCaseInsensitiveEnvironmentField.setAccessible(true);
Map<String, String> cienv = (Map<String, String>) theCaseInsensitiveEnvironmentField.get(null);
cienv.clear();
cienv.putAll(newSettings);
WorkerLogManager.getSystemLogger().log(Level.INFO,
"Finished resetting environment variables in the JVM");
} catch (NoSuchFieldException e) {
// update env variable for running JVM on Linux
Class[] classes = Collections.class.getDeclaredClasses();
Map<String, String> env = System.getenv();
for (Class cl : classes) {
if ("java.util.Collections$UnmodifiableMap".equals(cl.getName())) {
Field field = cl.getDeclaredField("m");
field.setAccessible(true);
Object obj = field.get(env);
Map<String, String> map = (Map<String, String>) obj;
map.clear();
map.putAll(newSettings);
}
}
}
}