Skip to content

Commit 785abaa

Browse files
joewizclaude
andcommitted
[feature] Native EXQuery Request Module for eXist-db
Implements the full 28-function EXQuery Request Module API (http://exquery.org/ns/request), compatible with BaseX: - General: method(), context-path() - URI: scheme(), hostname(), port(), path(), query(), uri() - Connection: address(), remote-hostname(), remote-address(), remote-port() - Parameters: parameter(), parameter-names(), parameter-map() - Headers: header(), header-names(), header-map() - Cookies: cookie(), cookie-names(), cookie-map() - Attributes: attribute(), attribute-names(), attribute-map(), set-attribute() Default prefix is `exrequest` to coexist with eXist's built-in `request` module (http://exist-db.org/xquery/request). Both modules can be imported simultaneously without prefix conflicts. Uses eXist's native XQueryContext.getHttpContext() — zero external dependencies. 62 tests using ExistEmbeddedServer with MockRequestWrapper. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 8506e38 commit 785abaa

19 files changed

+952
-964
lines changed

pom.xml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
<groupId>org.exist-db</groupId>
1515
<artifactId>exist-request</artifactId>
16-
<version>1.0.0</version>
16+
<version>0.9.0-SNAPSHOT</version>
1717

1818
<name>EXQuery Request Module</name>
1919
<description>Native EXQuery Request Module for eXist-db, compatible with BaseX's 28-function API</description>
@@ -46,7 +46,7 @@
4646

4747
<!-- used in the EXPath Package Descriptor -->
4848
<package-name>http://exist-db.org/apps/request</package-name>
49-
<package-abbrev>request</package-abbrev>
49+
<package-abbrev>exist-request</package-abbrev>
5050

5151
<request.module.namespace>http://exquery.org/ns/request</request.module.namespace>
5252
<request.module.java.classname>org.exist.xquery.modules.request.RequestModule</request.module.java.classname>
@@ -65,6 +65,13 @@
6565
<profile>
6666
<id>integration-tests</id>
6767
<dependencies>
68+
<!-- exist-core as test scope so it's on the runtime classpath for tests -->
69+
<dependency>
70+
<groupId>org.exist-db</groupId>
71+
<artifactId>exist-core</artifactId>
72+
<version>${exist.version}</version>
73+
<scope>test</scope>
74+
</dependency>
6875
<dependency>
6976
<groupId>org.exist-db</groupId>
7077
<artifactId>exist-core</artifactId>

src/main/java/org/exist/xquery/modules/request/AttributeFunctions.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import org.exist.http.servlets.RequestWrapper;
2525
import org.exist.xquery.*;
26+
import org.exist.xquery.functions.map.MapType;
2627
import org.exist.xquery.value.*;
2728

2829
import javax.annotation.Nonnull;
@@ -63,7 +64,7 @@ public class AttributeFunctions extends AbstractRequestFunction {
6364
public static final FunctionSignature FS_ATTRIBUTE_MAP = functionSignature(
6465
RequestModule.qname(FS_ATTRIBUTE_MAP_NAME),
6566
"Returns all request attributes as a map.",
66-
returns(Type.MAP, "a map of attribute names to values")
67+
returns(Type.MAP_ITEM, "a map of attribute names to values")
6768
);
6869

6970
private static final String FS_SET_ATTRIBUTE_NAME = "set-attribute";

src/main/java/org/exist/xquery/modules/request/CookieFunctions.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.exist.xquery.FunctionSignature;
2727
import org.exist.xquery.XPathException;
2828
import org.exist.xquery.XQueryContext;
29+
import org.exist.xquery.functions.map.MapType;
2930
import org.exist.xquery.value.*;
3031

3132
import javax.annotation.Nonnull;
@@ -64,7 +65,7 @@ public class CookieFunctions extends AbstractRequestFunction {
6465
public static final FunctionSignature FS_COOKIE_MAP = functionSignature(
6566
RequestModule.qname(FS_COOKIE_MAP_NAME),
6667
"Returns all cookies as a map. Each key is a cookie name, each value is the cookie value.",
67-
returns(Type.MAP, "a map of cookie names to values")
68+
returns(Type.MAP_ITEM, "a map of cookie names to values")
6869
);
6970

7071
public CookieFunctions(final XQueryContext context, final FunctionSignature signature) {

src/main/java/org/exist/xquery/modules/request/HeaderFunctions.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.exist.xquery.FunctionSignature;
2626
import org.exist.xquery.XPathException;
2727
import org.exist.xquery.XQueryContext;
28+
import org.exist.xquery.functions.map.MapType;
2829
import org.exist.xquery.value.*;
2930

3031
import javax.annotation.Nonnull;
@@ -65,7 +66,7 @@ public class HeaderFunctions extends AbstractRequestFunction {
6566
RequestModule.qname(FS_HEADER_MAP_NAME),
6667
"Returns all HTTP headers as a map. Each key is a header name, " +
6768
"each value is the header value string.",
68-
returns(Type.MAP, "a map of header names to values")
69+
returns(Type.MAP_ITEM, "a map of header names to values")
6970
);
7071

7172
public HeaderFunctions(final XQueryContext context, final FunctionSignature signature) {

src/main/java/org/exist/xquery/modules/request/ParameterFunctions.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.exist.xquery.FunctionSignature;
2626
import org.exist.xquery.XPathException;
2727
import org.exist.xquery.XQueryContext;
28+
import org.exist.xquery.functions.map.MapType;
2829
import org.exist.xquery.value.*;
2930

3031
import javax.annotation.Nonnull;
@@ -65,7 +66,7 @@ public class ParameterFunctions extends AbstractRequestFunction {
6566
RequestModule.qname(FS_PARAMETER_MAP_NAME),
6667
"Returns all query and form parameters as a map. Each key is a parameter name, " +
6768
"each value is one or more parameter values.",
68-
returns(Type.MAP, "a map of parameter names to values")
69+
returns(Type.MAP_ITEM, "a map of parameter names to values")
6970
);
7071

7172
public ParameterFunctions(final XQueryContext context, final FunctionSignature signature) {

src/main/java/org/exist/xquery/modules/request/RequestModule.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public class RequestModule extends AbstractInternalModule {
4646

4747
public static final String NAMESPACE_URI = "http://exquery.org/ns/request";
4848

49-
public static final String PREFIX = "request";
49+
public static final String PREFIX = "exrequest";
5050

5151
public static final String RELEASE = "1.0.0";
5252

@@ -71,27 +71,35 @@ public class RequestModule extends AbstractInternalModule {
7171
ConnectionFunctions.FS_REMOTE_HOSTNAME,
7272
ConnectionFunctions.FS_REMOTE_ADDRESS,
7373
ConnectionFunctions.FS_REMOTE_PORT),
74+
// ParameterFunctions — split because FS_PARAMETER is FunctionSignature[]
7475
functionDefs(ParameterFunctions.class,
7576
ParameterFunctions.FS_PARAMETER_NAMES,
76-
ParameterFunctions.FS_PARAMETER,
7777
ParameterFunctions.FS_PARAMETER_MAP),
78+
functionDefs(ParameterFunctions.class,
79+
ParameterFunctions.FS_PARAMETER),
80+
// HeaderFunctions — split because FS_HEADER is FunctionSignature[]
7881
functionDefs(HeaderFunctions.class,
7982
HeaderFunctions.FS_HEADER_NAMES,
80-
HeaderFunctions.FS_HEADER,
8183
HeaderFunctions.FS_HEADER_MAP),
84+
functionDefs(HeaderFunctions.class,
85+
HeaderFunctions.FS_HEADER),
86+
// CookieFunctions — split because FS_COOKIE is FunctionSignature[]
8287
functionDefs(CookieFunctions.class,
83-
CookieFunctions.FS_COOKIE,
8488
CookieFunctions.FS_COOKIE_NAMES,
8589
CookieFunctions.FS_COOKIE_MAP),
90+
functionDefs(CookieFunctions.class,
91+
CookieFunctions.FS_COOKIE),
92+
// AttributeFunctions — split because FS_ATTRIBUTE is FunctionSignature[]
8693
functionDefs(AttributeFunctions.class,
87-
AttributeFunctions.FS_ATTRIBUTE,
8894
AttributeFunctions.FS_ATTRIBUTE_NAMES,
8995
AttributeFunctions.FS_ATTRIBUTE_MAP,
90-
AttributeFunctions.FS_SET_ATTRIBUTE)
96+
AttributeFunctions.FS_SET_ATTRIBUTE),
97+
functionDefs(AttributeFunctions.class,
98+
AttributeFunctions.FS_ATTRIBUTE)
9199
);
92100

93101
public RequestModule(final Map<String, List<?>> parameters) {
94-
super(functions, parameters, true);
102+
super(functions, parameters, false);
95103
}
96104

97105
@Override

src/test/java/org/exist/xquery/modules/request/AttributeFunctionsTest.java

Lines changed: 0 additions & 134 deletions
This file was deleted.

src/test/java/org/exist/xquery/modules/request/ConnectionFunctionsTest.java

Lines changed: 0 additions & 87 deletions
This file was deleted.

0 commit comments

Comments
 (0)