Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/rustcfml-reportaslucee-detection.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Engine detection now recognizes RustCFML v0.507+ running in its default `reportAsLucee` mode (where `server.coldfusion.productName` reports "Lucee") by matching the stable `server.lucee.versionName == "RustCFML"` identity marker, so the dedicated RustCFML engine adapter is selected instead of the Lucee adapter and adapter-gated behavior (image-info support, capability probes, engine version gates) routes correctly again.
16 changes: 16 additions & 0 deletions vendor/wheels/events/onapplicationstart.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -538,6 +538,14 @@ component {
* branch or RustCFML is misclassified as Lucee and its dedicated engine
* adapter becomes dead code. Other probe-verified RustCFML markers:
* server.java.vendor = "RustCFML (no JVM)".
*
* As of RustCFML v0.507.0, reportAsLucee defaults to true: the productName
* marker reports "Lucee" (with Lucee's productVersion) and the real engine
* version moves to server.lucee.version behind a Lucee-major prefix
* ("7.0.519.0" means RustCFML 0.519.0). The one field upstream documents
* as the stable identity marker — their own isRustCFML() BIF keys on it —
* is server.lucee.versionName == "RustCFML", so that branch must also run
* BEFORE the Lucee branch.
*/
public struct function $detectEngine(required struct serverScope) {
local.rv = {};
Expand All @@ -551,6 +559,14 @@ component {
) {
local.rv.serverName = "RustCFML";
local.rv.serverVersion = arguments.serverScope.coldfusion.productVersion;
} else if (
StructKeyExists(arguments.serverScope, "lucee")
&& StructKeyExists(arguments.serverScope.lucee, "versionName")
&& arguments.serverScope.lucee.versionName == "RustCFML"
) {
local.rv.serverName = "RustCFML";
// Strip the impersonated Lucee major ("7.0.519.0" -> "0.519.0").
local.rv.serverVersion = ListRest(arguments.serverScope.lucee.version, ".");
} else if (StructKeyExists(arguments.serverScope, "lucee")) {
local.rv.serverName = "Lucee";
local.rv.serverVersion = arguments.serverScope.lucee.version;
Expand Down
20 changes: 19 additions & 1 deletion vendor/wheels/tests/specs/engineAdapterSpec.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -203,10 +203,28 @@ component extends="wheels.WheelsTest" {
expect(detected.serverVersion).toBe("0.417.0");
});

it("resolves RustCFML under reportAsLucee impersonation (v0.507+) via the versionName marker", function() {
// As of RustCFML v0.507.0 reportAsLucee defaults to true:
// productName reports "Lucee" with Lucee's productVersion, and
// the real engine version hides behind a Lucee-major prefix in
// server.lucee.version. The stable identity marker upstream
// documents (and keys its own isRustCFML() on) is
// server.lucee.versionName == "RustCFML".
var events = CreateObject("component", "wheels.events.onapplicationstart");
var fakeServer = {
lucee: {version: "7.0.519.0", versionName: "RustCFML"},
coldfusion: {productName: "Lucee", productVersion: "2016,0,03,300357"},
java: {vendor: "RustCFML (no JVM)"}
};
var detected = events.$detectEngine(serverScope = fakeServer);
expect(detected.serverName).toBe("RustCFML");
expect(detected.serverVersion).toBe("0.519.0");
});

it("resolves Lucee when server.lucee exists without the RustCFML product marker", function() {
var events = CreateObject("component", "wheels.events.onapplicationstart");
var fakeServer = {
lucee: {version: "6.2.0.321"},
lucee: {version: "6.2.0.321", versionName: "Gelert"},
coldfusion: {productName: "Lucee", productVersion: "6.2.0.321"}
};
var detected = events.$detectEngine(serverScope = fakeServer);
Expand Down
Loading