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);
- }
-}