package io.fathom.cloud.image.api.os.resources; import java.io.IOException; import java.net.URI; import javax.inject.Singleton; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestFilter; import javax.ws.rs.core.UriBuilder; import javax.ws.rs.core.UriInfo; import javax.ws.rs.ext.Provider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Singleton @Provider public class BrokenClientsFilter implements ContainerRequestFilter { private static final Logger log = LoggerFactory.getLogger(BrokenClientsFilter.class); @Override public void filter(ContainerRequestContext requestContext) throws IOException { UriInfo uriInfo = requestContext.getUriInfo(); String path = uriInfo.getPath(); boolean redirect = false; if (path.contains("v1/images")) { if (path.startsWith("//v1/")) { path = path.substring(1); } if (!path.startsWith("/")) { path = "/" + path; } if (path.startsWith("/v1/images")) { // BUG: Glance client doesn't respect relative paths in Keystone path = "/openstack/images" + path; redirect = true; } } if (redirect) { URI uri = uriInfo.getRequestUri(); URI newUri = UriBuilder.fromUri(uri).replacePath(path).build(); log.info("Rewriting URI: {} -> {}", uri, newUri); requestContext.setRequestUri(newUri); } } }