summaryrefslogtreecommitdiffstats
path: root/src/com/gitblit/utils/HttpUtils.java
diff options
context:
space:
mode:
authorJames Moger <james.moger@gitblit.com>2012-08-02 19:39:35 -0400
committerJames Moger <james.moger@gitblit.com>2012-08-02 19:39:35 -0400
commitf1b488ea55c036931d14e6b0df6ed711e3189212 (patch)
tree872656e75b6866dea86a58a043738c6b238a5485 /src/com/gitblit/utils/HttpUtils.java
parentbb55f5aec092b22ee4b86152c0e0111df48eb34e (diff)
downloadgitblit-f1b488ea55c036931d14e6b0df6ed711e3189212.tar.gz
gitblit-f1b488ea55c036931d14e6b0df6ed711e3189212.zip
Support for X-Forwarded-Proto and X-Forwarded-Port (issue 115)
Diffstat (limited to 'src/com/gitblit/utils/HttpUtils.java')
-rw-r--r--src/com/gitblit/utils/HttpUtils.java43
1 files changed, 39 insertions, 4 deletions
diff --git a/src/com/gitblit/utils/HttpUtils.java b/src/com/gitblit/utils/HttpUtils.java
index 079d1a6b..3903f8c7 100644
--- a/src/com/gitblit/utils/HttpUtils.java
+++ b/src/com/gitblit/utils/HttpUtils.java
@@ -32,13 +32,48 @@ public class HttpUtils {
* @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(request.getScheme());
+ sb.append(scheme);
sb.append("://");
sb.append(request.getServerName());
- if ((request.getScheme().equals("http") && request.getServerPort() != 80)
- || (request.getScheme().equals("https") && request.getServerPort() != 443)) {
- sb.append(":" + request.getServerPort());
+ if (("http".equals(scheme) && port != 80)
+ || ("https".equals(scheme) && port != 443)) {
+ sb.append(":" + port);
}
sb.append(request.getContextPath());
return sb.toString();