diff --git a/core/pom.xml b/core/pom.xml new file mode 100644 index 0000000..aff3a8d --- /dev/null +++ b/core/pom.xml @@ -0,0 +1,49 @@ + + + 4.0.0 + + org.extism.sdk + chicory-sdk + 999-SNAPSHOT + + + chicory-sdk-core + + + + com.dylibso.chicory + runtime + ${chicory.version} + + + com.dylibso.chicory + wasi + ${chicory.version} + + + com.dylibso.chicory + aot-experimental + ${chicory.version} + + + org.extism.sdk + http-api + ${project.version} + + + junit + junit + ${junit.version} + test + + + com.google.jimfs + jimfs + ${jimfs.version} + test + + + + \ No newline at end of file diff --git a/src/main/java/org/extism/sdk/chicory/CachedAotMachineFactory.java b/core/src/main/java/org/extism/sdk/chicory/core/CachedAotMachineFactory.java similarity index 96% rename from src/main/java/org/extism/sdk/chicory/CachedAotMachineFactory.java rename to core/src/main/java/org/extism/sdk/chicory/core/CachedAotMachineFactory.java index 7183d66..a477fba 100644 --- a/src/main/java/org/extism/sdk/chicory/CachedAotMachineFactory.java +++ b/core/src/main/java/org/extism/sdk/chicory/core/CachedAotMachineFactory.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; import com.dylibso.chicory.experimental.aot.AotMachineFactory; import com.dylibso.chicory.runtime.Instance; diff --git a/src/main/java/org/extism/sdk/chicory/ChicoryModule.java b/core/src/main/java/org/extism/sdk/chicory/core/ChicoryModule.java similarity index 97% rename from src/main/java/org/extism/sdk/chicory/ChicoryModule.java rename to core/src/main/java/org/extism/sdk/chicory/core/ChicoryModule.java index 186b218..f50f0be 100644 --- a/src/main/java/org/extism/sdk/chicory/ChicoryModule.java +++ b/core/src/main/java/org/extism/sdk/chicory/core/ChicoryModule.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; import com.dylibso.chicory.runtime.Instance; import com.dylibso.chicory.wasm.Parser; diff --git a/src/main/java/org/extism/sdk/chicory/CompiledPlugin.java b/core/src/main/java/org/extism/sdk/chicory/core/CompiledPlugin.java similarity index 90% rename from src/main/java/org/extism/sdk/chicory/CompiledPlugin.java rename to core/src/main/java/org/extism/sdk/chicory/core/CompiledPlugin.java index 95002ea..debe3c5 100644 --- a/src/main/java/org/extism/sdk/chicory/CompiledPlugin.java +++ b/core/src/main/java/org/extism/sdk/chicory/core/CompiledPlugin.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; /** * A plugin that has been already processed, but not yet instantiated. diff --git a/src/main/java/org/extism/sdk/chicory/ConfigProvider.java b/core/src/main/java/org/extism/sdk/chicory/core/ConfigProvider.java similarity index 87% rename from src/main/java/org/extism/sdk/chicory/ConfigProvider.java rename to core/src/main/java/org/extism/sdk/chicory/core/ConfigProvider.java index 2693509..e6b80e0 100644 --- a/src/main/java/org/extism/sdk/chicory/ConfigProvider.java +++ b/core/src/main/java/org/extism/sdk/chicory/core/ConfigProvider.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; import java.util.Map; diff --git a/src/main/java/org/extism/sdk/chicory/CurrentPlugin.java b/core/src/main/java/org/extism/sdk/chicory/core/CurrentPlugin.java similarity index 93% rename from src/main/java/org/extism/sdk/chicory/CurrentPlugin.java rename to core/src/main/java/org/extism/sdk/chicory/core/CurrentPlugin.java index 72bf543..78edf9d 100644 --- a/src/main/java/org/extism/sdk/chicory/CurrentPlugin.java +++ b/core/src/main/java/org/extism/sdk/chicory/core/CurrentPlugin.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; public class CurrentPlugin { private final Plugin plugin; diff --git a/src/main/java/org/extism/sdk/chicory/DependencyGraph.java b/core/src/main/java/org/extism/sdk/chicory/core/DependencyGraph.java similarity index 99% rename from src/main/java/org/extism/sdk/chicory/DependencyGraph.java rename to core/src/main/java/org/extism/sdk/chicory/core/DependencyGraph.java index 3dab2fe..699163f 100644 --- a/src/main/java/org/extism/sdk/chicory/DependencyGraph.java +++ b/core/src/main/java/org/extism/sdk/chicory/core/DependencyGraph.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; import com.dylibso.chicory.log.Logger; import com.dylibso.chicory.runtime.ExportFunction; diff --git a/core/src/main/java/org/extism/sdk/chicory/core/ExtismConfigurationException.java b/core/src/main/java/org/extism/sdk/chicory/core/ExtismConfigurationException.java new file mode 100644 index 0000000..3938742 --- /dev/null +++ b/core/src/main/java/org/extism/sdk/chicory/core/ExtismConfigurationException.java @@ -0,0 +1,12 @@ +package org.extism.sdk.chicory.core; + +public class ExtismConfigurationException extends ExtismException { + + public ExtismConfigurationException(String message) { + super(message); + } + + public ExtismConfigurationException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/org/extism/sdk/chicory/ExtismException.java b/core/src/main/java/org/extism/sdk/chicory/core/ExtismException.java similarity index 89% rename from src/main/java/org/extism/sdk/chicory/ExtismException.java rename to core/src/main/java/org/extism/sdk/chicory/core/ExtismException.java index 0430d81..0eff09e 100644 --- a/src/main/java/org/extism/sdk/chicory/ExtismException.java +++ b/core/src/main/java/org/extism/sdk/chicory/core/ExtismException.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; public class ExtismException extends RuntimeException { diff --git a/src/main/java/org/extism/sdk/chicory/ExtismFunction.java b/core/src/main/java/org/extism/sdk/chicory/core/ExtismFunction.java similarity index 80% rename from src/main/java/org/extism/sdk/chicory/ExtismFunction.java rename to core/src/main/java/org/extism/sdk/chicory/core/ExtismFunction.java index f286600..c126ef8 100644 --- a/src/main/java/org/extism/sdk/chicory/ExtismFunction.java +++ b/core/src/main/java/org/extism/sdk/chicory/core/ExtismFunction.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; @FunctionalInterface public interface ExtismFunction { diff --git a/src/main/java/org/extism/sdk/chicory/ExtismFunctionException.java b/core/src/main/java/org/extism/sdk/chicory/core/ExtismFunctionException.java similarity index 91% rename from src/main/java/org/extism/sdk/chicory/ExtismFunctionException.java rename to core/src/main/java/org/extism/sdk/chicory/core/ExtismFunctionException.java index f2eeaee..1e521a8 100644 --- a/src/main/java/org/extism/sdk/chicory/ExtismFunctionException.java +++ b/core/src/main/java/org/extism/sdk/chicory/core/ExtismFunctionException.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; public class ExtismFunctionException extends ExtismException { diff --git a/src/main/java/org/extism/sdk/chicory/ExtismHostFunction.java b/core/src/main/java/org/extism/sdk/chicory/core/ExtismHostFunction.java similarity index 98% rename from src/main/java/org/extism/sdk/chicory/ExtismHostFunction.java rename to core/src/main/java/org/extism/sdk/chicory/core/ExtismHostFunction.java index c2bbc46..a811dcf 100644 --- a/src/main/java/org/extism/sdk/chicory/ExtismHostFunction.java +++ b/core/src/main/java/org/extism/sdk/chicory/core/ExtismHostFunction.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; import com.dylibso.chicory.runtime.HostFunction; import com.dylibso.chicory.runtime.Instance; diff --git a/src/main/java/org/extism/sdk/chicory/ExtismTypeConversionException.java b/core/src/main/java/org/extism/sdk/chicory/core/ExtismTypeConversionException.java similarity index 88% rename from src/main/java/org/extism/sdk/chicory/ExtismTypeConversionException.java rename to core/src/main/java/org/extism/sdk/chicory/core/ExtismTypeConversionException.java index caea963..58396a4 100644 --- a/src/main/java/org/extism/sdk/chicory/ExtismTypeConversionException.java +++ b/core/src/main/java/org/extism/sdk/chicory/core/ExtismTypeConversionException.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; public class ExtismTypeConversionException extends ExtismException { diff --git a/src/main/java/org/extism/sdk/chicory/ExtismValType.java b/core/src/main/java/org/extism/sdk/chicory/core/ExtismValType.java similarity index 96% rename from src/main/java/org/extism/sdk/chicory/ExtismValType.java rename to core/src/main/java/org/extism/sdk/chicory/core/ExtismValType.java index 28938be..d09d38e 100644 --- a/src/main/java/org/extism/sdk/chicory/ExtismValType.java +++ b/core/src/main/java/org/extism/sdk/chicory/core/ExtismValType.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; import com.dylibso.chicory.wasm.types.ValueType; diff --git a/src/main/java/org/extism/sdk/chicory/ExtismValTypeList.java b/core/src/main/java/org/extism/sdk/chicory/core/ExtismValTypeList.java similarity index 96% rename from src/main/java/org/extism/sdk/chicory/ExtismValTypeList.java rename to core/src/main/java/org/extism/sdk/chicory/core/ExtismValTypeList.java index 07c945d..e6aaf9b 100644 --- a/src/main/java/org/extism/sdk/chicory/ExtismValTypeList.java +++ b/core/src/main/java/org/extism/sdk/chicory/core/ExtismValTypeList.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; import com.dylibso.chicory.wasm.types.ValueType; diff --git a/src/main/java/org/extism/sdk/chicory/ExtismValue.java b/core/src/main/java/org/extism/sdk/chicory/core/ExtismValue.java similarity index 96% rename from src/main/java/org/extism/sdk/chicory/ExtismValue.java rename to core/src/main/java/org/extism/sdk/chicory/core/ExtismValue.java index 69473ae..0e8c313 100644 --- a/src/main/java/org/extism/sdk/chicory/ExtismValue.java +++ b/core/src/main/java/org/extism/sdk/chicory/core/ExtismValue.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; import com.dylibso.chicory.wasm.types.Value; diff --git a/src/main/java/org/extism/sdk/chicory/ExtismValueList.java b/core/src/main/java/org/extism/sdk/chicory/core/ExtismValueList.java similarity index 97% rename from src/main/java/org/extism/sdk/chicory/ExtismValueList.java rename to core/src/main/java/org/extism/sdk/chicory/core/ExtismValueList.java index f1ebeb4..c67da61 100644 --- a/src/main/java/org/extism/sdk/chicory/ExtismValueList.java +++ b/core/src/main/java/org/extism/sdk/chicory/core/ExtismValueList.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; import com.dylibso.chicory.wasm.types.Value; diff --git a/src/main/java/org/extism/sdk/chicory/HostEnv.java b/core/src/main/java/org/extism/sdk/chicory/core/HostEnv.java similarity index 85% rename from src/main/java/org/extism/sdk/chicory/HostEnv.java rename to core/src/main/java/org/extism/sdk/chicory/core/HostEnv.java index 88ac625..f6ab9ad 100644 --- a/src/main/java/org/extism/sdk/chicory/HostEnv.java +++ b/core/src/main/java/org/extism/sdk/chicory/core/HostEnv.java @@ -1,9 +1,13 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; import com.dylibso.chicory.log.Logger; import com.dylibso.chicory.runtime.HostFunction; import com.dylibso.chicory.runtime.Instance; import com.dylibso.chicory.wasm.types.ValueType; +import org.extism.sdk.chicory.http.ExtismHttpException; +import org.extism.sdk.chicory.http.HttpClientAdapter; +import org.extism.sdk.chicory.http.HttpConfig; +import org.extism.sdk.chicory.http.HttpJsonCodec; import java.net.URI; import java.nio.charset.StandardCharsets; @@ -11,7 +15,6 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Supplier; public class HostEnv { @@ -30,7 +33,7 @@ public HostEnv(Kernel kernel, ConfigProvider config, String[] allowedHosts, Http this.config = new Config(config); this.var = new Var(); this.log = new Log(); - this.http = new Http(allowedHosts, httpConfig); + this.http = httpConfig == null ? null : new Http(allowedHosts, httpConfig); } public Log log() { @@ -46,6 +49,12 @@ public Config config() { } public Http http() { + if (http == null) { + throw new ExtismConfigurationException( + "Http has not been configured properly. " + + "Verify you have added a dependency to the JSON deserializer (default: Jackson Databind) " + + "and you have have configure the HTTP client properly (default: java.net.http.HttpClient)"); + } return http; } @@ -55,7 +64,7 @@ public HostFunction[] toHostFunctions() { log.toHostFunctions(), var.toHostFunctions(), config.toHostFunctions(), - http.toHostFunctions()); + http == null ? new HostFunction[0] : http.toHostFunctions()); } private HostFunction[] concat(HostFunction[]... hfs) { @@ -93,22 +102,22 @@ public long alloc(long size) { return kernel.alloc.apply(size)[0]; } - byte[] readBytes(long offset) { + public byte[] readBytes(long offset) { long length = length(offset); return memory().readBytes((int) offset, (int) length); } - String readString(long offset) { + public String readString(long offset) { return new String(readBytes(offset), StandardCharsets.UTF_8); } - long writeBytes(byte[] bytes) { + public long writeBytes(byte[] bytes) { long ptr = alloc(bytes.length); memory().write((int) ptr, bytes); return ptr; } - long writeString(String s) { + public long writeString(String s) { return writeBytes(s.getBytes(StandardCharsets.UTF_8)); } } @@ -116,7 +125,9 @@ long writeString(String s) { public class Log { private LogLevel logLevel = LogLevel.INFO; - private Log() {} + + private Log() { + } public void setLogLevel(LogLevel level) { // We assume the Chicory logger is a j.u.l.Logger. @@ -274,10 +285,11 @@ HostFunction[] toHostFunctions() { } + public class Http { private final HostPattern[] hostPatterns; - Lazy jsonCodec; - Lazy clientAdapter; + HttpJsonCodec jsonCodec; + HttpClientAdapter clientAdapter; public Http(String[] allowedHosts, HttpConfig httpConfig) { if (allowedHosts == null) { @@ -287,16 +299,8 @@ public Http(String[] allowedHosts, HttpConfig httpConfig) { for (int i = 0; i < allowedHosts.length; i++) { this.hostPatterns[i] = new HostPattern(allowedHosts[i]); } - this.jsonCodec = new Lazy<>(httpConfig.httpJsonCodec); - this.clientAdapter = new Lazy<>(httpConfig.httpClientAdapter); - } - - public HttpJsonCodec jsonCodec() { - return jsonCodec.get(); - } - - public HttpClientAdapter clientAdapter() { - return clientAdapter.get(); + this.jsonCodec = httpConfig.httpJsonCodec().get(); + this.clientAdapter = httpConfig.httpClientAdapter().get(); } long[] request(Instance instance, long... args) { @@ -316,7 +320,7 @@ long[] request(Instance instance, long... args) { kernel.free.apply(bodyOffset); } - var requestMetadata = jsonCodec().decodeMetadata(requestJson); + var requestMetadata = jsonCodec.decodeMetadata(requestJson); byte[] body = request( requestMetadata.method(), @@ -333,7 +337,7 @@ long[] request(Instance instance, long... args) { return result; } - byte[] request(String method, URI uri, Map headers, byte[] requestBody) { + public byte[] request(String method, URI uri, Map headers, byte[] requestBody) { var host = uri.getHost(); if (host == null || host.isBlank()) { throw new ExtismHttpException("HTTP request host is invalid for URI: " + uri); @@ -342,24 +346,24 @@ byte[] request(String method, URI uri, Map headers, byte[] reque throw new ExtismHttpException(String.format("HTTP request to '%s' is not allowed", host)); } - return clientAdapter().request(method, uri, headers, requestBody); + return clientAdapter.request(method, uri, headers, requestBody); } long[] statusCode(Instance instance, long... args) { return new long[]{statusCode()}; } - int statusCode() { - return clientAdapter().statusCode(); + public int statusCode() { + return clientAdapter.statusCode(); } long[] headers(Instance instance, long[] longs) { var result = new long[1]; - var headers = clientAdapter().headers(); + var headers = clientAdapter.headers(); if (headers == null) { return result; } - var bytes = jsonCodec().encodeHeaders(Map.of()); + var bytes = jsonCodec.encodeHeaders(Map.of()); result[0] = memory().writeBytes(bytes); return result; } @@ -419,26 +423,4 @@ public boolean matches(String host) { } } - private static final class Lazy { - final Supplier supplier; - T t; - public Lazy(Supplier supplier) { - this.supplier = supplier; - } - public T get() { - if (t == null) { - try { - t = supplier.get(); - } catch (NoClassDefFoundError error) { - throw new ConfigurationException( - "Http has not been configured properly. " + - "Verify you have added a dependency to the JSON deserializer (default: Jackson Databind) " + - "and you have have configure the HTTP client properly (default: java.net.http.HttpClient)", error); - } - } - return t; - } - } - - } diff --git a/src/main/java/org/extism/sdk/chicory/Kernel.java b/core/src/main/java/org/extism/sdk/chicory/core/Kernel.java similarity index 99% rename from src/main/java/org/extism/sdk/chicory/Kernel.java rename to core/src/main/java/org/extism/sdk/chicory/core/Kernel.java index 4dfb224..05866b6 100644 --- a/src/main/java/org/extism/sdk/chicory/Kernel.java +++ b/core/src/main/java/org/extism/sdk/chicory/core/Kernel.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; import com.dylibso.chicory.runtime.ExportFunction; import com.dylibso.chicory.runtime.HostFunction; diff --git a/src/main/java/org/extism/sdk/chicory/Linker.java b/core/src/main/java/org/extism/sdk/chicory/core/Linker.java similarity index 97% rename from src/main/java/org/extism/sdk/chicory/Linker.java rename to core/src/main/java/org/extism/sdk/chicory/core/Linker.java index a864327..861541a 100644 --- a/src/main/java/org/extism/sdk/chicory/Linker.java +++ b/core/src/main/java/org/extism/sdk/chicory/core/Linker.java @@ -1,13 +1,13 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; import com.dylibso.chicory.log.Logger; import com.dylibso.chicory.runtime.HostFunction; import com.dylibso.chicory.runtime.Instance; import com.dylibso.chicory.wasi.WasiOptions; import com.dylibso.chicory.wasi.WasiPreview1; +import org.extism.sdk.chicory.http.HttpConfig; import java.util.Arrays; -import java.util.Map; /** diff --git a/src/main/java/org/extism/sdk/chicory/LogLevel.java b/core/src/main/java/org/extism/sdk/chicory/core/LogLevel.java similarity index 97% rename from src/main/java/org/extism/sdk/chicory/LogLevel.java rename to core/src/main/java/org/extism/sdk/chicory/core/LogLevel.java index 6f95aa5..a28c4ad 100644 --- a/src/main/java/org/extism/sdk/chicory/LogLevel.java +++ b/core/src/main/java/org/extism/sdk/chicory/core/LogLevel.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; import com.dylibso.chicory.log.Logger; diff --git a/src/main/java/org/extism/sdk/chicory/Manifest.java b/core/src/main/java/org/extism/sdk/chicory/core/Manifest.java similarity index 95% rename from src/main/java/org/extism/sdk/chicory/Manifest.java rename to core/src/main/java/org/extism/sdk/chicory/core/Manifest.java index 0013c6d..3bb5e6a 100644 --- a/src/main/java/org/extism/sdk/chicory/Manifest.java +++ b/core/src/main/java/org/extism/sdk/chicory/core/Manifest.java @@ -1,6 +1,7 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; import com.dylibso.chicory.wasi.WasiOptions; +import org.extism.sdk.chicory.http.HttpConfig; import java.util.EnumSet; import java.util.List; @@ -18,7 +19,7 @@ public static class Options { ConfigProvider config = ConfigProvider.empty(); WasiOptions wasiOptions = WasiOptions.builder().build(); String[] allowedHosts = new String[0]; - HttpConfig httpConfig = HttpConfig.defaultConfig(); + HttpConfig httpConfig = null; public Options withAoT() { return withAoT(true); diff --git a/src/main/java/org/extism/sdk/chicory/ManifestWasm.java b/core/src/main/java/org/extism/sdk/chicory/core/ManifestWasm.java similarity index 98% rename from src/main/java/org/extism/sdk/chicory/ManifestWasm.java rename to core/src/main/java/org/extism/sdk/chicory/core/ManifestWasm.java index 8af924d..f5f6c3d 100644 --- a/src/main/java/org/extism/sdk/chicory/ManifestWasm.java +++ b/core/src/main/java/org/extism/sdk/chicory/core/ManifestWasm.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; import java.io.IOException; diff --git a/src/main/java/org/extism/sdk/chicory/Plugin.java b/core/src/main/java/org/extism/sdk/chicory/core/Plugin.java similarity index 88% rename from src/main/java/org/extism/sdk/chicory/Plugin.java rename to core/src/main/java/org/extism/sdk/chicory/core/Plugin.java index e8b9869..7565ba8 100644 --- a/src/main/java/org/extism/sdk/chicory/Plugin.java +++ b/core/src/main/java/org/extism/sdk/chicory/core/Plugin.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; import com.dylibso.chicory.log.Logger; import com.dylibso.chicory.log.SystemLogger; @@ -56,7 +56,7 @@ public Plugin build() { Plugin(Instance main, HostEnv hostEnv) { this.mainInstance = main; this.hostEnv = hostEnv; - mainInstance.initialize(true); +// mainInstance.initialize(true); } public HostEnv.Log log() { @@ -83,7 +83,11 @@ String getError() { public byte[] call(String funcName, byte[] input) { var func = mainInstance.export(funcName); setInput(input); - var result = func.apply()[0]; + var results = func.apply(); + if (results == null) { + throw new ExtismFunctionException(funcName, "The function expects an i32 return code. 0 is success and 1 is a failure."); + } + var result = results[0]; if (result == 0) { return getOutput(); } else { diff --git a/src/main/resources/META-INF/native-image/org.extism/chicory-sdk/resource-config.json b/core/src/main/resources/META-INF/native-image/org.extism/chicory-sdk/resource-config.json similarity index 100% rename from src/main/resources/META-INF/native-image/org.extism/chicory-sdk/resource-config.json rename to core/src/main/resources/META-INF/native-image/org.extism/chicory-sdk/resource-config.json diff --git a/src/main/resources/extism-runtime.wasm b/core/src/main/resources/extism-runtime.wasm similarity index 100% rename from src/main/resources/extism-runtime.wasm rename to core/src/main/resources/extism-runtime.wasm diff --git a/src/test/java/org/extism/sdk/chicory/DependencyGraphTest.java b/core/src/test/java/org/extism/sdk/chicory/core/DependencyGraphTest.java similarity index 99% rename from src/test/java/org/extism/sdk/chicory/DependencyGraphTest.java rename to core/src/test/java/org/extism/sdk/chicory/core/DependencyGraphTest.java index 28c774f..8197254 100644 --- a/src/test/java/org/extism/sdk/chicory/DependencyGraphTest.java +++ b/core/src/test/java/org/extism/sdk/chicory/core/DependencyGraphTest.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; import com.dylibso.chicory.log.SystemLogger; import com.dylibso.chicory.runtime.Instance; diff --git a/src/test/java/org/extism/sdk/chicory/ExtismHostFunctionTest.java b/core/src/test/java/org/extism/sdk/chicory/core/ExtismHostFunctionTest.java similarity index 96% rename from src/test/java/org/extism/sdk/chicory/ExtismHostFunctionTest.java rename to core/src/test/java/org/extism/sdk/chicory/core/ExtismHostFunctionTest.java index d0527ce..72e42d9 100644 --- a/src/test/java/org/extism/sdk/chicory/ExtismHostFunctionTest.java +++ b/core/src/test/java/org/extism/sdk/chicory/core/ExtismHostFunctionTest.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; import com.dylibso.chicory.log.SystemLogger; import com.dylibso.chicory.runtime.HostFunction; diff --git a/src/test/java/org/extism/sdk/chicory/HostEnvTest.java b/core/src/test/java/org/extism/sdk/chicory/core/HostEnvTest.java similarity index 56% rename from src/test/java/org/extism/sdk/chicory/HostEnvTest.java rename to core/src/test/java/org/extism/sdk/chicory/core/HostEnvTest.java index 9cb3123..3231a96 100644 --- a/src/test/java/org/extism/sdk/chicory/HostEnvTest.java +++ b/core/src/test/java/org/extism/sdk/chicory/core/HostEnvTest.java @@ -1,10 +1,10 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; import com.dylibso.chicory.log.SystemLogger; import junit.framework.TestCase; +import java.net.URI; import java.nio.charset.StandardCharsets; -import java.util.HashMap; import java.util.Map; public class HostEnvTest extends TestCase { @@ -12,7 +12,7 @@ public void testShowcase() { var logger = new SystemLogger(); var config = Map.of("key", "value"); - var hostEnv = new HostEnv(new Kernel(), ConfigProvider.ofMap(config), new String[0], HttpConfig.defaultConfig(), logger); + var hostEnv = new HostEnv(new Kernel(), ConfigProvider.ofMap(config), new String[0], null, logger); assertEquals(hostEnv.config().get("key"), "value"); @@ -26,4 +26,18 @@ public void testShowcase() { long ptr = hostEnv.memory().alloc(size); assertEquals(hostEnv.memory().length(ptr), size); } + + public void testHttpThrows() { + var logger = new SystemLogger(); + + var config = Map.of("key", "value"); + var hostEnv = new HostEnv(new Kernel(), ConfigProvider.ofMap(config), new String[0], null, logger); + try { + hostEnv.http().request("POST", URI.create("https://www.example.com"), Map.of(), new byte[0]); + fail("It should throw an ExtismConfigurationException"); + } catch (ExtismConfigurationException ex) { + // expected + } + + } } diff --git a/src/test/java/org/extism/sdk/chicory/LogTest.java b/core/src/test/java/org/extism/sdk/chicory/core/LogTest.java similarity index 97% rename from src/test/java/org/extism/sdk/chicory/LogTest.java rename to core/src/test/java/org/extism/sdk/chicory/core/LogTest.java index 079c475..b15421c 100644 --- a/src/test/java/org/extism/sdk/chicory/LogTest.java +++ b/core/src/test/java/org/extism/sdk/chicory/core/LogTest.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core; import com.dylibso.chicory.wasi.WasiOptions; import junit.framework.TestCase; diff --git a/src/test/java/org/extism/sdk/chicory/PluginTest.java b/core/src/test/java/org/extism/sdk/chicory/core/e2e/PluginTest.java similarity index 87% rename from src/test/java/org/extism/sdk/chicory/PluginTest.java rename to core/src/test/java/org/extism/sdk/chicory/core/e2e/PluginTest.java index f53c1b0..a48c137 100644 --- a/src/test/java/org/extism/sdk/chicory/PluginTest.java +++ b/core/src/test/java/org/extism/sdk/chicory/core/e2e/PluginTest.java @@ -1,9 +1,16 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.core.e2e; import com.dylibso.chicory.wasi.WasiOptions; import com.google.common.jimfs.Configuration; import com.google.common.jimfs.Jimfs; import junit.framework.TestCase; +import org.extism.sdk.chicory.core.ExtismFunction; +import org.extism.sdk.chicory.core.ExtismFunctionException; +import org.extism.sdk.chicory.core.ExtismHostFunction; +import org.extism.sdk.chicory.core.ExtismValType; +import org.extism.sdk.chicory.core.Manifest; +import org.extism.sdk.chicory.core.ManifestWasm; +import org.extism.sdk.chicory.core.Plugin; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -16,6 +23,20 @@ public class PluginTest extends TestCase { + public void testRollDice() { + var path = Path.of("./src/test/resources/void-return/void-return.wasm"); + var wasm = ManifestWasm.fromFilePath(path).build(); + var manifest = Manifest.ofWasms(wasm).build(); + var plugin = Plugin.ofManifest(manifest).build(); + ExtismFunctionException ex = null; + try { + var out = plugin.call("dummy", new byte[0]); + } catch (ExtismFunctionException e) { + ex = e; + } + assertTrue(ex.getMessage().contains("i32 return code")); + } + public void testGreet() { var url = "https://github.com/extism/plugins/releases/download/v1.1.1/greet.wasm"; var wasm = ManifestWasm.fromUrl(url).build(); diff --git a/src/test/resources/circular-import-more/circular-import-add.wasm b/core/src/test/resources/circular-import-more/circular-import-add.wasm similarity index 100% rename from src/test/resources/circular-import-more/circular-import-add.wasm rename to core/src/test/resources/circular-import-more/circular-import-add.wasm diff --git a/src/test/resources/circular-import-more/circular-import-add.wat b/core/src/test/resources/circular-import-more/circular-import-add.wat similarity index 100% rename from src/test/resources/circular-import-more/circular-import-add.wat rename to core/src/test/resources/circular-import-more/circular-import-add.wat diff --git a/src/test/resources/circular-import-more/circular-import-expr.wasm b/core/src/test/resources/circular-import-more/circular-import-expr.wasm similarity index 100% rename from src/test/resources/circular-import-more/circular-import-expr.wasm rename to core/src/test/resources/circular-import-more/circular-import-expr.wasm diff --git a/src/test/resources/circular-import-more/circular-import-expr.wat b/core/src/test/resources/circular-import-more/circular-import-expr.wat similarity index 100% rename from src/test/resources/circular-import-more/circular-import-expr.wat rename to core/src/test/resources/circular-import-more/circular-import-expr.wat diff --git a/src/test/resources/circular-import-more/circular-import-main.wasm b/core/src/test/resources/circular-import-more/circular-import-main.wasm similarity index 100% rename from src/test/resources/circular-import-more/circular-import-main.wasm rename to core/src/test/resources/circular-import-more/circular-import-main.wasm diff --git a/src/test/resources/circular-import-more/circular-import-main.wat b/core/src/test/resources/circular-import-more/circular-import-main.wat similarity index 100% rename from src/test/resources/circular-import-more/circular-import-main.wat rename to core/src/test/resources/circular-import-more/circular-import-main.wat diff --git a/src/test/resources/circular-import-more/circular-import-sub.wasm b/core/src/test/resources/circular-import-more/circular-import-sub.wasm similarity index 100% rename from src/test/resources/circular-import-more/circular-import-sub.wasm rename to core/src/test/resources/circular-import-more/circular-import-sub.wasm diff --git a/src/test/resources/circular-import-more/circular-import-sub.wat b/core/src/test/resources/circular-import-more/circular-import-sub.wat similarity index 100% rename from src/test/resources/circular-import-more/circular-import-sub.wat rename to core/src/test/resources/circular-import-more/circular-import-sub.wat diff --git a/src/test/resources/circular-import/circular-import-1.wasm b/core/src/test/resources/circular-import/circular-import-1.wasm similarity index 100% rename from src/test/resources/circular-import/circular-import-1.wasm rename to core/src/test/resources/circular-import/circular-import-1.wasm diff --git a/src/test/resources/circular-import/circular-import-1.wat b/core/src/test/resources/circular-import/circular-import-1.wat similarity index 100% rename from src/test/resources/circular-import/circular-import-1.wat rename to core/src/test/resources/circular-import/circular-import-1.wat diff --git a/src/test/resources/circular-import/circular-import-2.wasm b/core/src/test/resources/circular-import/circular-import-2.wasm similarity index 100% rename from src/test/resources/circular-import/circular-import-2.wasm rename to core/src/test/resources/circular-import/circular-import-2.wasm diff --git a/src/test/resources/circular-import/circular-import-2.wat b/core/src/test/resources/circular-import/circular-import-2.wat similarity index 100% rename from src/test/resources/circular-import/circular-import-2.wat rename to core/src/test/resources/circular-import/circular-import-2.wat diff --git a/src/test/resources/circular-import/circular-import-main.wasm b/core/src/test/resources/circular-import/circular-import-main.wasm similarity index 100% rename from src/test/resources/circular-import/circular-import-main.wasm rename to core/src/test/resources/circular-import/circular-import-main.wasm diff --git a/src/test/resources/circular-import/circular-import-main.wat b/core/src/test/resources/circular-import/circular-import-main.wat similarity index 100% rename from src/test/resources/circular-import/circular-import-main.wat rename to core/src/test/resources/circular-import/circular-import-main.wat diff --git a/src/test/resources/host-functions/import-wasi.wasm b/core/src/test/resources/host-functions/import-wasi.wasm similarity index 100% rename from src/test/resources/host-functions/import-wasi.wasm rename to core/src/test/resources/host-functions/import-wasi.wasm diff --git a/src/test/resources/host-functions/import-wasi.wat b/core/src/test/resources/host-functions/import-wasi.wat similarity index 100% rename from src/test/resources/host-functions/import-wasi.wat rename to core/src/test/resources/host-functions/import-wasi.wat diff --git a/src/test/resources/log/log.wasm b/core/src/test/resources/log/log.wasm similarity index 100% rename from src/test/resources/log/log.wasm rename to core/src/test/resources/log/log.wasm diff --git a/core/src/test/resources/void-return/void-return.wasm b/core/src/test/resources/void-return/void-return.wasm new file mode 100644 index 0000000..203e9ec Binary files /dev/null and b/core/src/test/resources/void-return/void-return.wasm differ diff --git a/core/src/test/resources/void-return/void-return.wat b/core/src/test/resources/void-return/void-return.wat new file mode 100644 index 0000000..5937ed4 --- /dev/null +++ b/core/src/test/resources/void-return/void-return.wat @@ -0,0 +1,2 @@ +(module + (func $dummy (export "dummy") nop)) diff --git a/http/api/pom.xml b/http/api/pom.xml new file mode 100644 index 0000000..cd66531 --- /dev/null +++ b/http/api/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + org.extism.sdk + http + 999-SNAPSHOT + + + http-api + + \ No newline at end of file diff --git a/src/main/java/org/extism/sdk/chicory/ExtismHttpException.java b/http/api/src/main/java/org/extism/sdk/chicory/http/ExtismHttpException.java similarity index 62% rename from src/main/java/org/extism/sdk/chicory/ExtismHttpException.java rename to http/api/src/main/java/org/extism/sdk/chicory/http/ExtismHttpException.java index 6cfa800..2fc3741 100644 --- a/src/main/java/org/extism/sdk/chicory/ExtismHttpException.java +++ b/http/api/src/main/java/org/extism/sdk/chicory/http/ExtismHttpException.java @@ -1,7 +1,6 @@ -package org.extism.sdk.chicory; - -public class ExtismHttpException extends ExtismException { +package org.extism.sdk.chicory.http; +public class ExtismHttpException extends RuntimeException { public ExtismHttpException(String message) { super(message); } diff --git a/http/api/src/main/java/org/extism/sdk/chicory/http/ExtismJsonException.java b/http/api/src/main/java/org/extism/sdk/chicory/http/ExtismJsonException.java new file mode 100644 index 0000000..5863966 --- /dev/null +++ b/http/api/src/main/java/org/extism/sdk/chicory/http/ExtismJsonException.java @@ -0,0 +1,7 @@ +package org.extism.sdk.chicory.http; + +public class ExtismJsonException extends RuntimeException { + public ExtismJsonException(Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/org/extism/sdk/chicory/HttpClientAdapter.java b/http/api/src/main/java/org/extism/sdk/chicory/http/HttpClientAdapter.java similarity index 87% rename from src/main/java/org/extism/sdk/chicory/HttpClientAdapter.java rename to http/api/src/main/java/org/extism/sdk/chicory/http/HttpClientAdapter.java index cb36db8..b23c8aa 100644 --- a/src/main/java/org/extism/sdk/chicory/HttpClientAdapter.java +++ b/http/api/src/main/java/org/extism/sdk/chicory/http/HttpClientAdapter.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.http; import java.net.URI; import java.util.List; diff --git a/src/main/java/org/extism/sdk/chicory/HttpConfig.java b/http/api/src/main/java/org/extism/sdk/chicory/http/HttpConfig.java similarity index 63% rename from src/main/java/org/extism/sdk/chicory/HttpConfig.java rename to http/api/src/main/java/org/extism/sdk/chicory/http/HttpConfig.java index bad1b0c..63aaa41 100644 --- a/src/main/java/org/extism/sdk/chicory/HttpConfig.java +++ b/http/api/src/main/java/org/extism/sdk/chicory/http/HttpConfig.java @@ -1,28 +1,9 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.http; import java.util.Objects; import java.util.function.Supplier; public class HttpConfig { - /** - * Use {@link JdkHttpClientAdapter} for the HTTP client adapter. - * Recommended on recent Java versions. - */ - public static HttpConfig defaultConfig() { - return HttpConfig.builder() - .withClientAdapter(JdkHttpClientAdapter::new) - .withJsonCodec(JacksonJsonCodec::new).build(); - } - - /** - * Use {@link HttpUrlConnectionClientAdapter} for the HTTP client adapter. - * Recommended for Android. - */ - public static HttpConfig urlConnectionConfig() { - return HttpConfig.builder() - .withClientAdapter(HttpUrlConnectionClientAdapter::new) - .withJsonCodec(JakartaJsonCodec::new).build(); - } public static Builder builder() { return new Builder(); @@ -32,7 +13,8 @@ public static class Builder { Supplier httpJsonCodec; Supplier httpClientAdapter; - private Builder() {} + private Builder() { + } public Builder withJsonCodec(Supplier httpJsonCodecFactory) { this.httpJsonCodec = httpJsonCodecFactory; @@ -60,4 +42,12 @@ public HttpConfig(Supplier httpJsonCodec, Supplier httpJsonCodec() { + return httpJsonCodec; + } + + public Supplier httpClientAdapter() { + return httpClientAdapter; + } + } diff --git a/src/main/java/org/extism/sdk/chicory/HttpJsonCodec.java b/http/api/src/main/java/org/extism/sdk/chicory/http/HttpJsonCodec.java similarity index 90% rename from src/main/java/org/extism/sdk/chicory/HttpJsonCodec.java rename to http/api/src/main/java/org/extism/sdk/chicory/http/HttpJsonCodec.java index adb73e5..1c5d8c4 100644 --- a/src/main/java/org/extism/sdk/chicory/HttpJsonCodec.java +++ b/http/api/src/main/java/org/extism/sdk/chicory/http/HttpJsonCodec.java @@ -1,4 +1,4 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.http; import java.net.URI; import java.util.List; diff --git a/http/client-javanet/pom.xml b/http/client-javanet/pom.xml new file mode 100644 index 0000000..256524b --- /dev/null +++ b/http/client-javanet/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + + org.extism.sdk + http + 999-SNAPSHOT + + + http-client-javanet + + + + org.extism.sdk + http-api + ${project.version} + + + + \ No newline at end of file diff --git a/src/main/java/org/extism/sdk/chicory/JdkHttpClientAdapter.java b/http/client-javanet/src/main/java/org/extism/sdk/chicory/http/client/javanet/JavaNetHttpClientAdapter.java similarity index 84% rename from src/main/java/org/extism/sdk/chicory/JdkHttpClientAdapter.java rename to http/client-javanet/src/main/java/org/extism/sdk/chicory/http/client/javanet/JavaNetHttpClientAdapter.java index ab175f0..8b17837 100644 --- a/src/main/java/org/extism/sdk/chicory/JdkHttpClientAdapter.java +++ b/http/client-javanet/src/main/java/org/extism/sdk/chicory/http/client/javanet/JavaNetHttpClientAdapter.java @@ -1,4 +1,7 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.http.client.javanet; + +import org.extism.sdk.chicory.http.ExtismHttpException; +import org.extism.sdk.chicory.http.HttpClientAdapter; import java.io.IOException; import java.net.URI; @@ -7,7 +10,7 @@ import java.net.http.HttpResponse; import java.util.Map; -public class JdkHttpClientAdapter implements HttpClientAdapter { +public class JavaNetHttpClientAdapter implements HttpClientAdapter { HttpResponse lastResponse; HttpClient httpClient; @@ -38,7 +41,7 @@ public byte[] request(String method, URI uri, Map headers, byte[ return lastResponse.body(); } catch (IOException | InterruptedException e) { // FIXME gracefully handle the interruption - throw new ExtismException(e); + throw new ExtismHttpException(e); } } diff --git a/http/client-urlconnection/pom.xml b/http/client-urlconnection/pom.xml new file mode 100644 index 0000000..bea97ba --- /dev/null +++ b/http/client-urlconnection/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + + org.extism.sdk + http + 999-SNAPSHOT + + + http-client-urlconnection + + + + org.extism.sdk + http-api + ${project.version} + + + + \ No newline at end of file diff --git a/src/main/java/org/extism/sdk/chicory/HttpUrlConnectionClientAdapter.java b/http/client-urlconnection/src/main/java/org/extism/sdk/chicory/http/client/urlconnection/HttpUrlConnectionClientAdapter.java similarity index 87% rename from src/main/java/org/extism/sdk/chicory/HttpUrlConnectionClientAdapter.java rename to http/client-urlconnection/src/main/java/org/extism/sdk/chicory/http/client/urlconnection/HttpUrlConnectionClientAdapter.java index c21a41a..a9fdef0 100644 --- a/src/main/java/org/extism/sdk/chicory/HttpUrlConnectionClientAdapter.java +++ b/http/client-urlconnection/src/main/java/org/extism/sdk/chicory/http/client/urlconnection/HttpUrlConnectionClientAdapter.java @@ -1,4 +1,7 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.http.client.urlconnection; + +import org.extism.sdk.chicory.http.ExtismHttpException; +import org.extism.sdk.chicory.http.HttpClientAdapter; import java.io.IOException; import java.io.InputStream; @@ -47,7 +50,7 @@ public byte[] request(String method, URI uri, Map headers, byte[ return lastBody; } catch (IOException e) { // FIXME gracefully handle the interruption - throw new ExtismException(e); + throw new ExtismHttpException(e); } finally { if (conn != null) { conn.disconnect(); @@ -59,7 +62,7 @@ public int statusCode() { return lastResponseCode; } - public Map> headers() { + public Map> headers() { return lastResponseHeaders; } diff --git a/http/config-android/pom.xml b/http/config-android/pom.xml new file mode 100644 index 0000000..de66757 --- /dev/null +++ b/http/config-android/pom.xml @@ -0,0 +1,32 @@ + + + 4.0.0 + + org.extism.sdk + http + 999-SNAPSHOT + + + http-config-android + + + + org.extism.sdk + http-api + ${project.version} + + + org.extism.sdk + http-client-urlconnection + ${project.version} + + + org.extism.sdk + http-json-jackson + ${project.version} + + + + \ No newline at end of file diff --git a/http/config-android/src/main/java/org/extism/sdk/chicory/http/config/android/AndroidHttpConfig.java b/http/config-android/src/main/java/org/extism/sdk/chicory/http/config/android/AndroidHttpConfig.java new file mode 100644 index 0000000..99be552 --- /dev/null +++ b/http/config-android/src/main/java/org/extism/sdk/chicory/http/config/android/AndroidHttpConfig.java @@ -0,0 +1,13 @@ +package org.extism.sdk.chicory.http.config.android; + +import org.extism.sdk.chicory.http.HttpConfig; +import org.extism.sdk.chicory.http.client.urlconnection.HttpUrlConnectionClientAdapter; +import org.extism.sdk.chicory.http.jackson.JacksonJsonCodec; + +public final class AndroidHttpConfig { + public static HttpConfig get() { + return HttpConfig.builder() + .withClientAdapter(HttpUrlConnectionClientAdapter::new) + .withJsonCodec(JacksonJsonCodec::new).build(); + } +} diff --git a/http/config-generic/pom.xml b/http/config-generic/pom.xml new file mode 100644 index 0000000..e121f6d --- /dev/null +++ b/http/config-generic/pom.xml @@ -0,0 +1,32 @@ + + + 4.0.0 + + org.extism.sdk + http + 999-SNAPSHOT + + + http-config-generic + + + + org.extism.sdk + http-api + ${project.version} + + + org.extism.sdk + http-client-javanet + ${project.version} + + + org.extism.sdk + http-json-jackson + ${project.version} + + + + \ No newline at end of file diff --git a/http/config-generic/src/main/java/org/extism/sdk/chicory/http/config/generic/GenericHttpConfig.java b/http/config-generic/src/main/java/org/extism/sdk/chicory/http/config/generic/GenericHttpConfig.java new file mode 100644 index 0000000..44446fe --- /dev/null +++ b/http/config-generic/src/main/java/org/extism/sdk/chicory/http/config/generic/GenericHttpConfig.java @@ -0,0 +1,13 @@ +package org.extism.sdk.chicory.http.config.generic; + +import org.extism.sdk.chicory.http.HttpConfig; +import org.extism.sdk.chicory.http.client.javanet.JavaNetHttpClientAdapter; +import org.extism.sdk.chicory.http.jackson.JacksonJsonCodec; + +public final class GenericHttpConfig { + public static HttpConfig get() { + return HttpConfig.builder() + .withClientAdapter(JavaNetHttpClientAdapter::new) + .withJsonCodec(JacksonJsonCodec::new).build(); + } +} diff --git a/http/integration-tests/pom.xml b/http/integration-tests/pom.xml new file mode 100644 index 0000000..1c0ed9b --- /dev/null +++ b/http/integration-tests/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + org.extism.sdk + http + 999-SNAPSHOT + + + http-integration-tests + + + + org.extism.sdk + chicory-sdk-core + ${project.version} + + + org.extism.sdk + http-api + ${project.version} + + + org.extism.sdk + http-config-generic + ${project.version} + + + org.extism.sdk + http-config-android + ${project.version} + + + org.eclipse.parsson + jakarta.json + ${jakarta.json.version} + test + + + org.gaul + httpbin + ${httpbin.version} + test + + + junit + junit + ${junit.version} + test + + + + + \ No newline at end of file diff --git a/src/test/java/org/extism/sdk/chicory/HttpTest.java b/http/integration-tests/src/test/java/org/extism/sdk/chicory/http/it/HttpTest.java similarity index 66% rename from src/test/java/org/extism/sdk/chicory/HttpTest.java rename to http/integration-tests/src/test/java/org/extism/sdk/chicory/http/it/HttpTest.java index 40f85ef..940ec79 100644 --- a/src/test/java/org/extism/sdk/chicory/HttpTest.java +++ b/http/integration-tests/src/test/java/org/extism/sdk/chicory/http/it/HttpTest.java @@ -1,60 +1,91 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.http.it; import com.dylibso.chicory.log.SystemLogger; import jakarta.json.Json; import jakarta.json.JsonObject; import junit.framework.TestCase; +import org.gaul.httpbin.HttpBin; +import org.extism.sdk.chicory.core.ConfigProvider; +import org.extism.sdk.chicory.core.HostEnv; +import org.extism.sdk.chicory.http.HttpConfig; +import org.extism.sdk.chicory.core.Kernel; +import org.extism.sdk.chicory.http.ExtismHttpException; +import org.extism.sdk.chicory.http.config.android.AndroidHttpConfig; +import org.extism.sdk.chicory.http.config.generic.GenericHttpConfig; import java.io.ByteArrayInputStream; import java.net.URI; import java.nio.charset.StandardCharsets; import java.util.Map; - +// Note: lvh.me resolves to localhost. public class HttpTest extends TestCase { + public static HttpConfig defaultConfig() { + return GenericHttpConfig.get(); + } + + public static HttpConfig urlConnectionConfig() { + return AndroidHttpConfig.get(); + } + + + private HttpBin httpBin; + + protected void setUp() throws Exception { + super.setUp(); + URI httpBinEndpoint = URI.create("http://127.0.0.1:0"); + httpBin = new HttpBin(httpBinEndpoint); + httpBin.start(); + } + + public void tearDown() throws Exception { + httpBin.stop(); + } + public void testInvalidHost() { - var httpConfig = HttpConfig.defaultConfig(); + var httpConfig = defaultConfig(); var logger = new SystemLogger(); - var anyHost = new String[]{"*.httpbin.org"}; + var anyHost = new String[]{"*.lvh.me"}; var hostEnv = new HostEnv(new Kernel(), ConfigProvider.empty(), anyHost, httpConfig, logger); + URI uri = URI.create("test.lvh.me:" + httpBin.getPort() + "/headers"); try { byte[] response = hostEnv.http().request( "GET", - URI.create("httpbin.org/headers"), + uri, Map.of("X-Custom-Header", "hello"), new byte[0]); fail("should throw an exception"); } catch (ExtismHttpException e) { - assertEquals("HTTP request host is invalid for URI: httpbin.org/headers", e.getMessage()); + assertEquals("HTTP request host is invalid for URI: " + uri, e.getMessage()); } } public void testNoAllowedHosts() { - noAllowedHosts(HttpConfig.defaultConfig()); - noAllowedHosts(HttpConfig.urlConnectionConfig()); + noAllowedHosts(defaultConfig()); + noAllowedHosts(urlConnectionConfig()); } public void testAllowSingleHost() { - allowSingleHost(HttpConfig.defaultConfig()); - allowSingleHost(HttpConfig.urlConnectionConfig()); + allowSingleHost(defaultConfig()); + allowSingleHost(urlConnectionConfig()); } public void testAllowHostPattern() { - allowHostPattern(HttpConfig.defaultConfig()); - allowHostPattern(HttpConfig.urlConnectionConfig()); + allowHostPattern(defaultConfig()); + allowHostPattern(urlConnectionConfig()); } public void testAllowMultiHostPattern() { - allowMultiHostPattern(HttpConfig.defaultConfig()); - allowMultiHostPattern(HttpConfig.urlConnectionConfig()); + allowMultiHostPattern(defaultConfig()); + allowMultiHostPattern(urlConnectionConfig()); } public void testAllowAnyHost() { - allowAnyHost(HttpConfig.defaultConfig()); - allowAnyHost(HttpConfig.urlConnectionConfig()); + allowAnyHost(defaultConfig()); + allowAnyHost(urlConnectionConfig()); } public void noAllowedHosts(HttpConfig httpConfig) { @@ -63,27 +94,28 @@ public void noAllowedHosts(HttpConfig httpConfig) { var noAllowedHosts = new String[0]; var hostEnv = new HostEnv(new Kernel(), ConfigProvider.empty(), noAllowedHosts, httpConfig, logger); + URI uri = URI.create("http://lvh.me:" + httpBin.getPort() + "/headers"); try { hostEnv.http().request( "GET", - URI.create("http://httpbin.org/headers"), + uri, Map.of("X-Custom-Header", "hello"), new byte[0]); fail("Should have thrown an exception"); - } catch (ExtismException e) { - assertEquals("HTTP request to 'httpbin.org' is not allowed", e.getMessage()); + } catch (ExtismHttpException e) { + assertEquals("HTTP request to 'lvh.me' is not allowed", e.getMessage()); } } public void allowSingleHost(HttpConfig httpConfig) { var logger = new SystemLogger(); - var anyHost = new String[]{"httpbin.org"}; + var anyHost = new String[]{"lvh.me"}; var hostEnv = new HostEnv(new Kernel(), ConfigProvider.empty(), anyHost, httpConfig, logger); byte[] response = hostEnv.http().request( "GET", - URI.create("http://httpbin.org/headers"), + URI.create("http://lvh.me:" + httpBin.getPort() + "/headers"), Map.of("X-Custom-Header", "hello"), new byte[0]); JsonObject responseObject = Json.createReader(new ByteArrayInputStream(response)).readObject(); @@ -91,7 +123,7 @@ public void allowSingleHost(HttpConfig httpConfig) { byte[] response2 = hostEnv.http().request( "POST", - URI.create("http://httpbin.org/post"), + URI.create("http://lvh.me:" + httpBin.getPort() + "/post"), Map.of("Content-Type", "text/plain"), "hello".getBytes(StandardCharsets.UTF_8)); @@ -105,7 +137,7 @@ public void allowSingleHost(HttpConfig httpConfig) { Map.of("X-Custom-Header", "hello"), new byte[0]); fail("Should have thrown an exception"); - } catch (ExtismException e) { + } catch (ExtismHttpException e) { assertEquals("HTTP request to 'example.com' is not allowed", e.getMessage()); } } @@ -113,12 +145,12 @@ public void allowSingleHost(HttpConfig httpConfig) { public void allowHostPattern(HttpConfig httpConfig) { var logger = new SystemLogger(); - var anyHost = new String[]{"*.httpbin.org"}; + var anyHost = new String[]{"*.lvh.me"}; var hostEnv = new HostEnv(new Kernel(), ConfigProvider.empty(), anyHost, httpConfig, logger); byte[] response = hostEnv.http().request( "GET", - URI.create("http://www.httpbin.org/headers"), + URI.create("http://www.lvh.me:" + httpBin.getPort() + "/headers"), Map.of("X-Custom-Header", "hello"), new byte[0]); JsonObject responseObject = Json.createReader(new ByteArrayInputStream(response)).readObject(); @@ -128,12 +160,12 @@ public void allowHostPattern(HttpConfig httpConfig) { try { hostEnv.http().request( "GET", - URI.create("http://httpbin.org/headers"), + URI.create("http://lvh.me:" + httpBin.getPort() + "/headers"), Map.of("X-Custom-Header", "hello"), new byte[0]); fail("Should have thrown an exception"); - } catch (ExtismException e) { - assertEquals("HTTP request to 'httpbin.org' is not allowed", e.getMessage()); + } catch (ExtismHttpException e) { + assertEquals("HTTP request to 'lvh.me' is not allowed", e.getMessage()); } } @@ -141,12 +173,12 @@ public void allowHostPattern(HttpConfig httpConfig) { public void allowMultiHostPattern(HttpConfig httpConfig) { var logger = new SystemLogger(); - var anyHost = new String[]{"*.httpbin.org", "httpbin.org"}; + var anyHost = new String[]{"*.lvh.me", "lvh.me"}; var hostEnv = new HostEnv(new Kernel(), ConfigProvider.empty(), anyHost, httpConfig, logger); byte[] response = hostEnv.http().request( "GET", - URI.create("http://www.httpbin.org/headers"), + URI.create("http://www.lvh.me:" + httpBin.getPort() + "/headers"), Map.of("X-Custom-Header", "hello"), new byte[0]); JsonObject responseObject = Json.createReader(new ByteArrayInputStream(response)).readObject(); @@ -155,7 +187,7 @@ public void allowMultiHostPattern(HttpConfig httpConfig) { response = hostEnv.http().request( "GET", - URI.create("http://httpbin.org/headers"), + URI.create("http://lvh.me:" + httpBin.getPort() + "/headers"), Map.of("X-Custom-Header", "hello"), new byte[0]); responseObject = Json.createReader(new ByteArrayInputStream(response)).readObject(); @@ -171,7 +203,7 @@ public void allowAnyHost(HttpConfig httpConfig) { byte[] response = hostEnv.http().request( "GET", - URI.create("http://www.httpbin.org/headers"), + URI.create("http://www.lvh.me:" + httpBin.getPort() + "/headers"), Map.of("X-Custom-Header", "hello"), new byte[0]); JsonObject responseObject = Json.createReader(new ByteArrayInputStream(response)).readObject(); @@ -180,7 +212,7 @@ public void allowAnyHost(HttpConfig httpConfig) { response = hostEnv.http().request( "GET", - URI.create("http://httpbin.org/headers"), + URI.create("http://lvh.me:" + httpBin.getPort() + "/headers"), Map.of("X-Custom-Header", "hello"), new byte[0]); responseObject = Json.createReader(new ByteArrayInputStream(response)).readObject(); diff --git a/http/json-jackson/pom.xml b/http/json-jackson/pom.xml new file mode 100644 index 0000000..dd84ae5 --- /dev/null +++ b/http/json-jackson/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + + org.extism.sdk + http + 999-SNAPSHOT + + + http-json-jackson + + + + org.extism.sdk + http-api + ${project.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-core.version} + + + + \ No newline at end of file diff --git a/src/main/java/org/extism/sdk/chicory/JacksonJsonCodec.java b/http/json-jackson/src/main/java/org/extism/sdk/chicory/http/jackson/JacksonJsonCodec.java similarity index 88% rename from src/main/java/org/extism/sdk/chicory/JacksonJsonCodec.java rename to http/json-jackson/src/main/java/org/extism/sdk/chicory/http/jackson/JacksonJsonCodec.java index b459feb..3142015 100644 --- a/src/main/java/org/extism/sdk/chicory/JacksonJsonCodec.java +++ b/http/json-jackson/src/main/java/org/extism/sdk/chicory/http/jackson/JacksonJsonCodec.java @@ -1,7 +1,9 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.http.jackson; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import org.extism.sdk.chicory.http.ExtismJsonException; +import org.extism.sdk.chicory.http.HttpJsonCodec; import java.io.IOException; import java.net.URI; @@ -20,7 +22,7 @@ public RequestMetadata decodeMetadata(byte[] data) { try { request = objectMapper.readTree(data); } catch (IOException e) { - throw new ExtismException(e); + throw new ExtismJsonException(e); } var method = request.get("method").asText(); @@ -63,7 +65,7 @@ public byte[] encodeHeaders(Map> headers) { try { return objectMapper.writeValueAsBytes(objectNode); } catch (IOException e) { - throw new ExtismException(e); + throw new ExtismJsonException(e); } } } diff --git a/http/json-jakarta/pom.xml b/http/json-jakarta/pom.xml new file mode 100644 index 0000000..31e43a7 --- /dev/null +++ b/http/json-jakarta/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + org.extism.sdk + http + 999-SNAPSHOT + + + http-json-jakarta + + + + org.extism.sdk + http-api + ${project.version} + + + jakarta.json + jakarta.json-api + ${jakarta.json-api.version} + + + org.eclipse.parsson + jakarta.json + ${jakarta.json.version} + test + + + + \ No newline at end of file diff --git a/src/main/java/org/extism/sdk/chicory/JakartaJsonCodec.java b/http/json-jakarta/src/main/java/org/extism/sdk/chicory/http/jakarta/JakartaJsonCodec.java similarity index 94% rename from src/main/java/org/extism/sdk/chicory/JakartaJsonCodec.java rename to http/json-jakarta/src/main/java/org/extism/sdk/chicory/http/jakarta/JakartaJsonCodec.java index bdc3f9f..6cee0b5 100644 --- a/src/main/java/org/extism/sdk/chicory/JakartaJsonCodec.java +++ b/http/json-jakarta/src/main/java/org/extism/sdk/chicory/http/jakarta/JakartaJsonCodec.java @@ -1,6 +1,7 @@ -package org.extism.sdk.chicory; +package org.extism.sdk.chicory.http.jakarta; import jakarta.json.Json; +import org.extism.sdk.chicory.http.HttpJsonCodec; import java.io.ByteArrayInputStream; import java.net.URI; diff --git a/http/pom.xml b/http/pom.xml new file mode 100644 index 0000000..afe08f7 --- /dev/null +++ b/http/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + + org.extism.sdk + chicory-sdk + 999-SNAPSHOT + + + http + pom + + json-jackson + json-jakarta + api + integration-tests + client-javanet + client-urlconnection + config-generic + config-android + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 09bd5d6..6d531db 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.extism.sdk chicory-sdk 999-SNAPSHOT - jar + pom chicory-sdk https://github.com/extism/extism @@ -75,55 +75,13 @@ 2.1.3 1.1.7 2.18.2 + 1.4.0 - - - com.dylibso.chicory - runtime - ${chicory.version} - - - com.dylibso.chicory - wasi - ${chicory.version} - - - com.dylibso.chicory - aot-experimental - ${chicory.version} - - - junit - junit - ${junit.version} - test - - - com.google.jimfs - jimfs - ${jimfs.version} - test - - - com.fasterxml.jackson.core - jackson-databind - ${jackson-core.version} - true - - - jakarta.json - jakarta.json-api - ${jakarta.json-api.version} - true - - - org.eclipse.parsson - jakarta.json - ${jakarta.json.version} - test - - + + core + http + diff --git a/src/main/java/org/extism/sdk/chicory/ConfigurationException.java b/src/main/java/org/extism/sdk/chicory/ConfigurationException.java deleted file mode 100644 index bf0b78a..0000000 --- a/src/main/java/org/extism/sdk/chicory/ConfigurationException.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.extism.sdk.chicory; - -public class ConfigurationException extends ExtismException { - public ConfigurationException(String message, Throwable cause) { - super(message, cause); - } -}