package io.fathom.cloud.identity.api.os.resources; import java.io.IOException; import java.net.URI; import java.util.Set; 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; import com.google.common.collect.Sets; @Singleton @Provider public class BrokenClientsFilter implements ContainerRequestFilter { private static final Logger log = LoggerFactory.getLogger(BrokenClientsFilter.class); @Override public void filter(ContainerRequestContext requestContext) throws IOException { boolean redirect = false; Set<String> BROKEN_USER_AGENTS = Sets.newHashSet(); BROKEN_USER_AGENTS.add("python-keystoneclient"); String userAgent = requestContext.getHeaderString("User-Agent"); if (userAgent == null || !BROKEN_USER_AGENTS.contains(userAgent)) { return; } UriInfo uriInfo = requestContext.getUriInfo(); String path = uriInfo.getPath(); if (path.contains("v2.0/") || path.contains("v3/")) { // if (path.startsWith("//v2/") || path.startsWith("//v3/")) { // path = path.substring(1); // } if (!path.startsWith("/")) { path = "/" + path; } if (path.startsWith("/v2.0/") || path.startsWith("/v3/")) { path = "/openstack/identity" + 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); } } }