mirror of
https://github.com/apple/pkl.git
synced 2026-07-08 22:15:11 +02:00
Make http(s) URIs their own module key (#495)
GenericUrl is a catch-all that uses URL.openConnection(). Since we now have special handling of HTTP urls, it makes more sense to put it in its own module key.
This commit is contained in:
@@ -45,6 +45,7 @@ internal class CliRepl(private val options: CliEvaluatorOptions) : CliCommand(op
|
|||||||
ModuleKeyFactories.fromServiceProviders() +
|
ModuleKeyFactories.fromServiceProviders() +
|
||||||
listOf(
|
listOf(
|
||||||
ModuleKeyFactories.file,
|
ModuleKeyFactories.file,
|
||||||
|
ModuleKeyFactories.http,
|
||||||
ModuleKeyFactories.pkg,
|
ModuleKeyFactories.pkg,
|
||||||
ModuleKeyFactories.projectpackage,
|
ModuleKeyFactories.projectpackage,
|
||||||
ModuleKeyFactories.genericUrl
|
ModuleKeyFactories.genericUrl
|
||||||
|
|||||||
@@ -164,6 +164,7 @@ abstract class CliCommand(protected val cliOptions: CliBaseOptions) {
|
|||||||
add(ModuleKeyFactories.projectpackage)
|
add(ModuleKeyFactories.projectpackage)
|
||||||
addAll(ModuleKeyFactories.fromServiceProviders())
|
addAll(ModuleKeyFactories.fromServiceProviders())
|
||||||
add(ModuleKeyFactories.file)
|
add(ModuleKeyFactories.file)
|
||||||
|
add(ModuleKeyFactories.http)
|
||||||
add(ModuleKeyFactories.genericUrl)
|
add(ModuleKeyFactories.genericUrl)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,6 +120,7 @@ public final class EvaluatorBuilder {
|
|||||||
builder
|
builder
|
||||||
.addModuleKeyFactories(ModuleKeyFactories.fromServiceProviders())
|
.addModuleKeyFactories(ModuleKeyFactories.fromServiceProviders())
|
||||||
.addModuleKeyFactory(ModuleKeyFactories.file)
|
.addModuleKeyFactory(ModuleKeyFactories.file)
|
||||||
|
.addModuleKeyFactory(ModuleKeyFactories.http)
|
||||||
.addModuleKeyFactory(ModuleKeyFactories.pkg)
|
.addModuleKeyFactory(ModuleKeyFactories.pkg)
|
||||||
.addModuleKeyFactory(ModuleKeyFactories.projectpackage)
|
.addModuleKeyFactory(ModuleKeyFactories.projectpackage)
|
||||||
.addModuleKeyFactory(ModuleKeyFactories.genericUrl)
|
.addModuleKeyFactory(ModuleKeyFactories.genericUrl)
|
||||||
|
|||||||
@@ -37,6 +37,9 @@ public final class ModuleKeyFactories {
|
|||||||
/** A factory for file based module keys. */
|
/** A factory for file based module keys. */
|
||||||
public static final ModuleKeyFactory file = new File();
|
public static final ModuleKeyFactory file = new File();
|
||||||
|
|
||||||
|
/** A factory for {@code http:} and {@code https:} module keys. */
|
||||||
|
public static final ModuleKeyFactory http = new Http();
|
||||||
|
|
||||||
/** A factory for URL based module keys. */
|
/** A factory for URL based module keys. */
|
||||||
public static final ModuleKeyFactory genericUrl = new GenericUrl();
|
public static final ModuleKeyFactory genericUrl = new GenericUrl();
|
||||||
|
|
||||||
@@ -150,6 +153,19 @@ public final class ModuleKeyFactories {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class Http implements ModuleKeyFactory {
|
||||||
|
private Http() {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<ModuleKey> create(URI uri) {
|
||||||
|
var scheme = uri.getScheme();
|
||||||
|
if ("http".equalsIgnoreCase(scheme) || "https".equalsIgnoreCase(scheme)) {
|
||||||
|
return Optional.of(ModuleKeys.http(uri));
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static class GenericUrl implements ModuleKeyFactory {
|
private static class GenericUrl implements ModuleKeyFactory {
|
||||||
private GenericUrl() {}
|
private GenericUrl() {}
|
||||||
|
|
||||||
|
|||||||
@@ -112,6 +112,11 @@ public final class ModuleKeys {
|
|||||||
return new GenericUrl(url);
|
return new GenericUrl(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Creates a module key for {@code http:} and {@code https:} uris. */
|
||||||
|
public static ModuleKey http(URI url) {
|
||||||
|
return new Http(url);
|
||||||
|
}
|
||||||
|
|
||||||
/** Creates a module key for the given package. */
|
/** Creates a module key for the given package. */
|
||||||
public static ModuleKey pkg(URI uri) throws URISyntaxException {
|
public static ModuleKey pkg(URI uri) throws URISyntaxException {
|
||||||
var assetUri = new PackageAssetUri(uri);
|
var assetUri = new PackageAssetUri(uri);
|
||||||
@@ -446,6 +451,45 @@ public final class ModuleKeys {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class Http implements ModuleKey {
|
||||||
|
|
||||||
|
private final URI uri;
|
||||||
|
|
||||||
|
Http(URI uri) {
|
||||||
|
this.uri = uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public URI getUri() {
|
||||||
|
return uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasHierarchicalUris() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isGlobbable() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResolvedModuleKey resolve(SecurityManager securityManager)
|
||||||
|
throws IOException, SecurityManagerException {
|
||||||
|
var httpClient = VmContext.get(null).getHttpClient();
|
||||||
|
var request = HttpRequest.newBuilder(uri).build();
|
||||||
|
var response = httpClient.send(request, BodyHandlers.ofInputStream());
|
||||||
|
try (var body = response.body()) {
|
||||||
|
HttpUtils.checkHasStatusCode200(response);
|
||||||
|
securityManager.checkResolveModule(response.uri());
|
||||||
|
String text = IoUtils.readString(body);
|
||||||
|
// intentionally use uri instead of response.uri()
|
||||||
|
return ResolvedModuleKeys.virtual(this, uri, text, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static class GenericUrl implements ModuleKey {
|
private static class GenericUrl implements ModuleKey {
|
||||||
final URI uri;
|
final URI uri;
|
||||||
|
|
||||||
@@ -472,20 +516,6 @@ public final class ModuleKeys {
|
|||||||
public ResolvedModuleKey resolve(SecurityManager securityManager)
|
public ResolvedModuleKey resolve(SecurityManager securityManager)
|
||||||
throws IOException, SecurityManagerException {
|
throws IOException, SecurityManagerException {
|
||||||
securityManager.checkResolveModule(uri);
|
securityManager.checkResolveModule(uri);
|
||||||
|
|
||||||
if (HttpUtils.isHttpUrl(uri)) {
|
|
||||||
var httpClient = VmContext.get(null).getHttpClient();
|
|
||||||
var request = HttpRequest.newBuilder(uri).build();
|
|
||||||
var response = httpClient.send(request, BodyHandlers.ofInputStream());
|
|
||||||
try (var body = response.body()) {
|
|
||||||
HttpUtils.checkHasStatusCode200(response);
|
|
||||||
securityManager.checkResolveModule(response.uri());
|
|
||||||
String text = IoUtils.readString(body);
|
|
||||||
// intentionally use uri instead of response.uri()
|
|
||||||
return ResolvedModuleKeys.virtual(this, uri, text, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var url = IoUtils.toUrl(uri);
|
var url = IoUtils.toUrl(uri);
|
||||||
var conn = url.openConnection();
|
var conn = url.openConnection();
|
||||||
conn.connect();
|
conn.connect();
|
||||||
|
|||||||
@@ -18,13 +18,9 @@ package org.pkl.core.module;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.http.HttpRequest;
|
|
||||||
import java.net.http.HttpResponse.BodyHandlers;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import org.pkl.core.runtime.VmContext;
|
|
||||||
import org.pkl.core.util.HttpUtils;
|
|
||||||
import org.pkl.core.util.IoUtils;
|
import org.pkl.core.util.IoUtils;
|
||||||
|
|
||||||
/** Utilities for obtaining and using resolved module keys. */
|
/** Utilities for obtaining and using resolved module keys. */
|
||||||
@@ -106,14 +102,6 @@ public final class ResolvedModuleKeys {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String loadSource() throws IOException {
|
public String loadSource() throws IOException {
|
||||||
if (HttpUtils.isHttpUrl(url)) {
|
|
||||||
var httpClient = VmContext.get(null).getHttpClient();
|
|
||||||
var request = HttpRequest.newBuilder(uri).build();
|
|
||||||
var response = httpClient.send(request, BodyHandlers.ofString());
|
|
||||||
HttpUtils.checkHasStatusCode200(response);
|
|
||||||
return response.body();
|
|
||||||
}
|
|
||||||
|
|
||||||
return IoUtils.readString(url);
|
return IoUtils.readString(url);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -109,6 +109,7 @@ public final class ExecutorSpiImpl implements ExecutorSpi {
|
|||||||
.addModuleKeyFactory(ModuleKeyFactories.pkg)
|
.addModuleKeyFactory(ModuleKeyFactories.pkg)
|
||||||
.addModuleKeyFactory(ModuleKeyFactories.projectpackage)
|
.addModuleKeyFactory(ModuleKeyFactories.projectpackage)
|
||||||
.addModuleKeyFactory(ModuleKeyFactories.file)
|
.addModuleKeyFactory(ModuleKeyFactories.file)
|
||||||
|
.addModuleKeyFactory(ModuleKeyFactories.http)
|
||||||
.addModuleKeyFactory(ModuleKeyFactories.genericUrl)
|
.addModuleKeyFactory(ModuleKeyFactories.genericUrl)
|
||||||
.setEnvironmentVariables(options.getEnvironmentVariables())
|
.setEnvironmentVariables(options.getEnvironmentVariables())
|
||||||
.setExternalProperties(options.getExternalProperties())
|
.setExternalProperties(options.getExternalProperties())
|
||||||
|
|||||||
@@ -223,6 +223,7 @@ class Server(private val transport: MessageTransport, private val httpClient: Ht
|
|||||||
add(ModuleKeyFactories.modulePath(modulePathResolver))
|
add(ModuleKeyFactories.modulePath(modulePathResolver))
|
||||||
add(ModuleKeyFactories.pkg)
|
add(ModuleKeyFactories.pkg)
|
||||||
add(ModuleKeyFactories.projectpackage)
|
add(ModuleKeyFactories.projectpackage)
|
||||||
|
add(ModuleKeyFactories.http)
|
||||||
add(ModuleKeyFactories.genericUrl)
|
add(ModuleKeyFactories.genericUrl)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user