blob: b3b299d66ff7c1983ff67f5f35bbb5f9fb296344 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.chemistry.opencmis.server.filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class ProxyHttpServletRequestWrapper extends HttpServletRequestWrapper {
public static final String FORWARDED_HOST_HEADER = "X-Forwarded-Host";
public static final String FORWARDED_PROTO_HEADER = "X-Forwarded-Proto";
public static final String HTTPS_SCHEME = "https";
public static final String HTTP_SCHEME = "http";
private String scheme;
private String serverName;
private int serverPort;
private final String contextPath;
private final String servletPath;
private final String requestURI;
public ProxyHttpServletRequestWrapper(HttpServletRequest request, String basePath) {
super(request);
scheme = request.getHeader(FORWARDED_PROTO_HEADER);
if (!HTTP_SCHEME.equalsIgnoreCase(scheme) && !HTTPS_SCHEME.equalsIgnoreCase(scheme)) {
scheme = request.getScheme();
}
serverName = request.getServerName();
serverPort = request.getServerPort();
String host = request.getHeader(FORWARDED_HOST_HEADER);
if ((host != null) && (host.length() > 0)) {
int index = host.indexOf(':');
if (index < 0) {
serverName = host;
serverPort = getDefaultPort(scheme);
} else {
serverName = host.substring(0, index);
try {
serverPort = Integer.parseInt(host.substring(index + 1));
} catch (NumberFormatException e) {
serverPort = getDefaultPort(scheme);
}
}
}
servletPath = request.getServletPath();
if (basePath != null && basePath.length() > 0) {
final String path = request.getRequestURI().substring(
request.getContextPath().length() + request.getServletPath().length());
contextPath = (basePath.charAt(0) == '/' ? basePath : "/" + basePath);
requestURI = contextPath + servletPath + path;
} else {
contextPath = request.getContextPath();
requestURI = request.getRequestURI();
}
}
private int getDefaultPort(String scheme) {
if (HTTPS_SCHEME.equalsIgnoreCase(scheme)) {
return 443;
}
return 80;
}
@Override
public String getScheme() {
return scheme;
}
@Override
public String getServerName() {
return serverName;
}
@Override
public int getServerPort() {
return serverPort;
}
@Override
public String getContextPath() {
return contextPath;
}
@Override
public String getServletPath() {
return servletPath;
}
@Override
public String getRequestURI() {
return requestURI;
}
@Override
public StringBuffer getRequestURL() {
StringBuffer sb = new StringBuffer();
sb.append(scheme);
sb.append("://");
sb.append(serverName);
sb.append(':');
sb.append(serverPort);
sb.append(getRequestURI());
return sb;
}
}