]> source.dussan.org Git - archiva.git/blob
914f440f39b7f42e5d917277ba0d2a0d2ef1af44
[archiva.git] /
1 package org.apache.archiva.web.util;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  *  http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  * KIND, either express or implied.  See the License for the
18  * specific language governing permissions and limitations
19  * under the License.
20  */
21
22 import org.apache.commons.lang.StringUtils;
23
24 import java.util.HashMap;
25 import java.util.Map;
26
27 import javax.servlet.http.HttpServletRequest;
28 import javax.servlet.jsp.PageContext;
29
30 /**
31  * ContextUtils 
32  *
33  *
34  */
35 public class ContextUtils
36 {
37     private static final Map<String, Integer> defaultSchemePortMap;
38
39     static
40     {
41         defaultSchemePortMap = new HashMap<String, Integer>();
42         defaultSchemePortMap.put( "http", Integer.valueOf( 80 ) );
43         defaultSchemePortMap.put( "https", Integer.valueOf( 443 ) );
44     }
45
46     /**
47      * Using the page context, get the base url.
48      * 
49      * @param pageContext the page context to use
50      * @return the base url with module name.
51      */
52     public static String getBaseURL( PageContext pageContext )
53     {
54         return getBaseURL( pageContext, null );
55     }
56
57     /**
58      * Using the page context, get the base url and append an optional resource name to the end of the provided url.
59      * 
60      * @param pageContext the page context to use
61      * @param resource the resource name (or null if no resource name specified)
62      * @return the base url with resource name.
63      */
64     public static String getBaseURL( PageContext pageContext, String resource )
65     {
66         HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
67         return getBaseURL( request, resource );
68     }
69     
70     /**
71      * Using the http servlet request, get the base url and append an optional resource name to the end of the url.
72      * 
73      * @param request the request to use
74      * @param resource the resource name (or null if not resource name should be appended)
75      * @return the base url with resource name.
76      */
77     public static String getBaseURL( HttpServletRequest request, String resource )
78     {
79         StringBuilder baseUrl = new StringBuilder();
80         
81         baseUrl.append( request.getScheme() ).append( "://" );
82         baseUrl.append( getServerName( request ) );
83         baseUrl.append( request.getContextPath() );
84
85         if ( StringUtils.isNotBlank( resource ) )
86         {
87             if ( !baseUrl.toString().endsWith( "/" ) )
88             {
89                 baseUrl.append( "/" );
90             }
91
92             baseUrl.append( resource );
93         }
94
95         return baseUrl.toString();
96     }
97
98     private static String getServerName( HttpServletRequest request )
99     {
100         String name = request.getHeader( "X-Forwarded-Host" );
101         if ( name == null )
102         {
103             name = request.getServerName();
104             int portnum = request.getServerPort();
105
106             // Only add port if non-standard.
107             Integer defaultPortnum = (Integer) defaultSchemePortMap.get( request.getScheme() );
108             if ( ( defaultPortnum == null ) || ( defaultPortnum.intValue() != portnum ) )
109             {
110                 name = name + ":" + String.valueOf( portnum );
111             }
112             return name;
113         }
114         else
115         {
116             // respect chains of proxies, return first one (as it's the outermost visible one)
117             String[] hosts = name.split( "," );
118             name = hosts[0].trim();
119         }
120         return name;
121     }
122 }