joechastain
02/21/2023, 8:20 PMroute helper function in cbPlaywright on Windows? For me, I'm just passing in "/" — so `navigate( page, route( "/" ) );`— and it's giving an error "*Illegal char <:> at index 4: http://127.0.0.1:63337\/*". For some reason, it's blowing up because of the colon, which obviously is a problem since we're talking about urls here.
I've traced it to the definition of the route method in models/PlaywrightMixins.cfm of the cbPlaywright project. The return value of the method, return variables.javaPaths.get( baseURL, javacast( "String[]", pathArray ) ).toString(); , is calling javaPaths.get which is itself an object instantiated with the following variables.javaPaths = createObject( "java", "java.nio.file.Paths" );. baseURL is just my URL - <http://127.0.0.1:63337> - and pathArray is just ["/"]. There is no problem with the javacast portion of the line. The error is coming from the javaPaths.get call and specifically the baseURL value that is being passed in with the colon. The most I've found is here which also is referencing java.nio.file.Path, and the explanation found here, unless I'm wrong (which is very possible), suggests that this code in the route helper method won't work on Windows.
I'm on v1.0.3 of cbPlaywright. I tried both ACF2021u5 and Lucee 5.3.10. Running v11.0.18 of Java and Windows 11.zackster
02/21/2023, 11:50 PMjoechastain
02/22/2023, 12:10 AMlucee.runtime.exp.NativeException: Illegal char <:> at index 4: <http://127.0.0.1:54081>\/
at sun.nio.fs.WindowsPathParser.normalize(Unknown Source)
at sun.nio.fs.WindowsPathParser.parse(Unknown Source)
at sun.nio.fs.WindowsPathParser.parse(Unknown Source)
at sun.nio.fs.WindowsPath.parse(Unknown Source)
at sun.nio.fs.WindowsFileSystem.getPath(Unknown Source)
at java.nio.file.Paths.get(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at lucee.runtime.reflection.pairs.MethodInstance.invoke(MethodInstance.java:56)
at lucee.runtime.java.JavaObject.call(JavaObject.java:265)
at lucee.runtime.java.JavaObject.call(JavaObject.java:287)
at lucee.runtime.util.VariableUtilImpl.callFunctionWithoutNamedValues(VariableUtilImpl.java:787)
at lucee.runtime.PageContextIjoechastain
02/22/2023, 12:11 AMjava.nio.file.InvalidPathException: Illegal char <:> at index 4: <http://127.0.0.1:63337>\/
at java.base/sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:182)
at java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:153)
at java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77)
at java.base/sun.nio.fs.WindowsPath.parse(WindowsPath.java:92)
at java.base/sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:229)
at java.base/java.nio.file.Path.of(Path.java:147)
at java.base/java.nio.file.Paths.get(Paths.java:69)
at java.base/jdk.internal.reflect.GeneratedMethodAccessor47.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at coldfusion.runtime.java.JavaProxy.invoke(JavaProxy.java:106)
at coldfusion.runtime.CfJspPage._invoke(CfJspPage.java:4254)
at coldfusion.runtime.CfJspPage.zackster
02/22/2023, 12:12 AMjoechastain
02/22/2023, 12:15 AMjoechastain
02/22/2023, 2:04 AMjavaPaths.get call in the last line causing the error:
public string function route() {
var baseURL = CGI.HTTPS == "on" ? "https://" : "http://" & CGI.HTTP_HOST;
var pathArray = [];
for ( var currentKey in arguments ){
pathArray.append( arguments[currentKey] );
}
return variables.javaPaths.get( baseURL, javacast( "String[]", pathArray ) ).toString();
}
I wonder if this could be updated to something like so (only change is to that last line):
public string function route() {
var baseURL = CGI.HTTPS == "on" ? "https://" : "http://" & CGI.HTTP_HOST;
var pathArray = [];
for ( var currentKey in arguments ){
pathArray.append( arguments[currentKey] );
}
return pathArray.reduce( ( concatenator, pathPart ) => concatenator & "/" & pathPart, baseUrl );
}
I could be missing some of the finer nuances of what was going on here. And, of course, passing in the slash in route( '/' or route( "/users", "joe" ) wouldn't work anymore. You would just want route() or route( "users", "joe"). But again, I could be, and likely am, missing something about what was meant to be happening here. Just thinking out loud.
At this point, it appears to be a bug so I'll go ahead and submit something when I get a few.joechastain
02/23/2023, 12:46 PM