Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Undertow: servletContext.getResourcePaths("/") not listed in PROD mode #28028

Open
melloware opened this issue Sep 17, 2022 · 15 comments · Fixed by #32656 · May be fixed by #35836
Open

Undertow: servletContext.getResourcePaths("/") not listed in PROD mode #28028

melloware opened this issue Sep 17, 2022 · 15 comments · Fixed by #32656 · May be fixed by #35836
Labels
area/undertow env/windows Impacts Windows machines kind/bug Something isn't working

Comments

@melloware
Copy link
Contributor

melloware commented Sep 17, 2022

Describe the bug

I have a simple ApplicationInitializer to print out all the available servlet resource paths...

public class ApplicationInitializer implements ServletContainerInitializer {

	private static final Logger logger = Logger.getLogger(ApplicationInitializer.class.getName());

	@Override
	public void onStartup(Set<Class<?>> c, ServletContext servletContext) throws ServletException {
		logger.info("Checking servlet resource paths...");

		Set<String> resourcePaths = servletContext.getResourcePaths("/");
		for (String resourcePath : resourcePaths) {
			logger.info("Resource: " + resourcePath);
		}
		
		if (resourcePaths.isEmpty()) {
			logger.warning("NO servlet resource paths found!");
		}
	}
}

When running in DEV mode mvn quarkus:dev the following is printed out it finds the mapped /index.html:

2022-09-17 07:51:08,575 INFO  [org.acm.ApplicationInitializer] (Quarkus Main Thread) Checking servlet resource paths...
2022-09-17 07:51:08,577 INFO  [org.acm.ApplicationInitializer] (Quarkus Main Thread) Resource: /index.html

When running in PRD mode mvn clean package -DskipTests && java -jar target/quarkus-app/quarkus-run.jar it doesn't find anything:

2022-09-17 07:49:05,376 INFO  [org.acm.ApplicationInitializer] (main) Checking servlet resource paths...
2022-09-17 07:49:05,376 WARNING [org.acm.ApplicationInitializer] (main) NO servlet resource paths found!

Expected behavior

All servlet resource paths should be available in both DEV and PRD mode.

Actual behavior

Resource Paths are only available in DEV mode.

How to Reproduce?

quarkus-servlet.zip

  1. Unzip the reproducer attached
  2. Run mvn clean quarkus:dev and see the servlet paths printed out 2022-12-27 13:00:20,489 INFO [org.acm.ApplicationInitializer] (Quarkus Main Thread) Resource: /index.html
  3. Run mvn clean package -DskipTests && java -jar target/quarkus-app/quarkus-run.jar and see the WARNING that no paths found 2022-12-27 13:01:06,297 WARNING [org.acm.ApplicationInitializer] (main) NO servlet resource paths found!

Output of uname -a or ver

OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

Output of java -version

OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.10+9, mixed mode)

GraalVM version (if different from Java)

No response

Quarkus version or git rev

2.15.1

Build tool (ie. output of mvnw --version or gradlew --version)

Apache Maven 3.8.5 (3599d3414f046de2324203b78ddcf9b5e4388aa0) Maven home: C:\Tools\apache-maven-3.8.5 Java version: 11.0.10, vendor: AdoptOpenJDK, runtime: C:\Tools\jdk-11.0.10 Default locale: en_US, platform encoding: Cp1252 OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

Additional information

No response

@melloware

This comment was marked as outdated.

@melloware

This comment was marked as outdated.

@manovotn
Copy link
Contributor

@melloware not sure how you arrived at my name as I haven't done much in Undertow, but I could take a look once I am back from X-mass break. I am unlikely to know though as I am unfamiliar with UT codebase :⁠-⁠)

@melloware

This comment was marked as off-topic.

@manovotn
Copy link
Contributor

No problem. Like I said, I can take a look once I am operational again.
I think Martin will be in very much the same situation :⁠-⁠)

@mkouba
Copy link
Contributor

mkouba commented Dec 28, 2022

I believe that the problem lies in the DirectoryResource#list() method. It returns an empty list because the KnownPathResourceManager#files looks like ["index.html"]. I don't think that NavigableSet.headSet(String) could be used here but maybe I've overlooked something.

@stuartwdouglas could you pls take a look sometime next year ;-)

@melloware

This comment was marked as outdated.

stuartwdouglas added a commit to stuartwdouglas/quarkus that referenced this issue Jan 23, 2023
stuartwdouglas added a commit to stuartwdouglas/quarkus that referenced this issue Jan 30, 2023
stuartwdouglas added a commit to stuartwdouglas/quarkus that referenced this issue Feb 15, 2023
stuartwdouglas added a commit to stuartwdouglas/quarkus that referenced this issue Feb 15, 2023
gastaldi pushed a commit to stuartwdouglas/quarkus that referenced this issue Feb 23, 2023
stuartwdouglas added a commit to stuartwdouglas/quarkus that referenced this issue Apr 13, 2023
@quarkus-bot quarkus-bot bot added this to the 3.1 - main milestone Apr 18, 2023
@melloware

This comment was marked as outdated.

@gsmet gsmet modified the milestones: 3.1 - main, 3.0.2.Final May 2, 2023
@melloware

This comment was marked as resolved.

@melloware

This comment was marked as resolved.

@melloware
Copy link
Contributor Author

melloware commented Jul 8, 2023

@stuartwdouglas I finally got to the bottom of this but have no idea how to fix it. I debugged the code in production mode and its finding the resource correctly using KnownPathResourceManager but in Undertow ServletContextImpl.getResourcePaths() it is returning a URLResource and calling Path file = res.getFilePath(); on that URL resource which ALWAYS returns null.

Resource: jar:file:/C:/temp/quarkus-servlet/target/quarkus-app/app/code-with-quarkus-1.0.0-SNAPSHOT.jar!/META-INF/resources/index.html
getFilePath(): NULL !!!

Undertow Code: https://github.com/undertow-io/undertow/blob/master/servlet/src/main/java/io/undertow/servlet/spec/ServletContextImpl.java#L278

image

Here is that line in the debugger:

image

So basically a URL resource jar:file:/C:/temp/quarkus-servlet/target/quarkus-app/app/code-with-quarkus-1.0.0-SNAPSHOT.jar!/META-INF/resources/index.html returns NULL for getFilePath()

@tony-in-nz
Copy link

tony-in-nz commented Aug 13, 2023

Fails for me on Windows (build and deploy to Ubuntu server).
Sent the code to mate with a mac to build and deploy on the Ubuntu server and it worked.

@melloware
Copy link
Contributor Author

I think @gsmet fix here: #43694 will fix this issue but I will test for real when its released with a real JSF app that has the issue

@melloware
Copy link
Contributor Author

circling back to this i don't think @gsmet fix fixes this particular issue. I think this code needs to be modified to look in JAR or File Path like FlyWay does like this using ClassPathUtils.consumeAsPaths

ClassPathUtils.consumeAsPaths(Thread.currentThread().getContextClassLoader(), location, path -> {
                Set<String> applicationMigrations = null;
                try {
                    applicationMigrations = FlywayProcessor.this.getApplicationMigrationsFromPath(finalLocation, path);
                } catch (IOException e) {
                    LOGGER.warnv(e,
                            "Can't process files in path %s", path);
                }
                if (applicationMigrations != null) {
                    applicationMigrationResources.addAll(applicationMigrations);
                }
            });

@tandraschko
Copy link
Contributor

Found the same issue, which breaks Faces AUTOMATIC_EXTENSIONLESS_MAPPING

See https://issues.apache.org/jira/browse/MYFACES-4707

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/undertow env/windows Impacts Windows machines kind/bug Something isn't working
Projects
None yet
7 participants