/* * 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; } }