/* * Copyright 2011 gitblit.com. * * Licensed 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 com.gitblit.utils; import javax.servlet.http.HttpServletRequest; /** * Collection of utility methods for http requests. * * @author James Moger * */ public class HttpUtils { /** * Returns the Gitblit URL based on the request. * * @param request * @return the host url */ public static String getGitblitURL(HttpServletRequest request) { // default to the request scheme and port String scheme = request.getScheme(); int port = request.getServerPort(); // try to use reverse-proxy server's port String forwardedPort = request.getHeader("X-Forwarded-Port"); if (StringUtils.isEmpty(forwardedPort)) { forwardedPort = request.getHeader("X_Forwarded_Port"); } if (!StringUtils.isEmpty(forwardedPort)) { // reverse-proxy server has supplied the original port try { port = Integer.parseInt(forwardedPort); } catch (Throwable t) { } } // try to use reverse-proxy server's scheme String forwardedScheme = request.getHeader("X-Forwarded-Proto"); if (StringUtils.isEmpty(forwardedScheme)) { forwardedScheme = request.getHeader("X_Forwarded_Proto"); } if (!StringUtils.isEmpty(forwardedScheme)) { // reverse-proxy server has supplied the original scheme scheme = forwardedScheme; if ("https".equals(scheme) && port == 80) { // proxy server is https, inside server is 80 // this is likely because the proxy server has not supplied // x-forwarded-port. since 80 is almost definitely wrong, // make an educated guess that 443 is correct. port = 443; } } StringBuilder sb = new StringBuilder(); sb.append(scheme); sb.append("://"); sb.append(request.getServerName()); if (("http".equals(scheme) && port != 80) || ("https".equals(scheme) && port != 443)) { sb.append(":" + port); } sb.append(request.getContextPath()); return sb.toString(); } }