package io.cattle.platform.api.parser;
import io.cattle.platform.archaius.util.ArchaiusUtil;
import io.cattle.platform.server.context.ServerContext;
import io.cattle.platform.server.context.ServerContext.BaseProtocol;
import io.github.ibuildthecloud.gdapi.request.ApiRequest;
import io.github.ibuildthecloud.gdapi.request.parser.DefaultApiRequestParser;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import com.netflix.config.DynamicBooleanProperty;
import com.netflix.config.DynamicStringListProperty;
public class ApiRequestParser extends DefaultApiRequestParser {
private static final DynamicBooleanProperty ALLOW_OVERRIDE = ArchaiusUtil.getBoolean("api.allow.client.override");
private static final DynamicStringListProperty HTTPS_PORTS = ArchaiusUtil.getList("proxy.protocol.https.ports");
@Override
public boolean isAllowClientOverrideHeaders() {
return ALLOW_OVERRIDE.get();
}
@Override
public boolean isHttpsPort(String host, String port) {
if (port == null && host != null) {
String[] parts = host.split(":", 2);
if (parts.length > 1) {
port = parts[1];
} else if (ServerContext.isCustomApiHost()) {
if (ServerContext.getHostApiBaseUrl(BaseProtocol.HTTP).startsWith("https")) {
port = "443";
} else {
port = "80";
}
}
}
for (String p : HTTPS_PORTS.get()) {
if (p.equals(port)) {
return true;
}
}
return false;
}
@Override
public boolean parse(ApiRequest apiRequest) throws IOException {
HttpServletRequest request = apiRequest.getServletContext().getRequest();
String path = request.getServletPath();
String[] parts = path.split("/");
if (parts.length > 4 && "projects".equalsIgnoreCase(parts[2]) && !"projectMembers".equalsIgnoreCase(parts[4])) {
String projectId = parts[3];
apiRequest.setSubContext(String.format("/%s/%s", parts[2], projectId));
String[] newPath = ArrayUtils.addAll(new String[]{"", parts[1]}, ArrayUtils.subarray(parts, 4, Integer.MAX_VALUE));
String servletPath = StringUtils.join(newPath, "/");
request = new ProjectHttpServletRequest(request, projectId, servletPath);
apiRequest.getServletContext().setRequest(request);
}
return super.parse(apiRequest);
}
}