View Javadoc
1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2016 Mort Bay Consulting Pty. Ltd.
4   //  ------------------------------------------------------------------------
5   //  All rights reserved. This program and the accompanying materials
6   //  are made available under the terms of the Eclipse Public License v1.0
7   //  and Apache License v2.0 which accompanies this distribution.
8   //
9   //      The Eclipse Public License is available at
10  //      http://www.eclipse.org/legal/epl-v10.html
11  //
12  //      The Apache License v2.0 is available at
13  //      http://www.opensource.org/licenses/apache2.0.php
14  //
15  //  You may elect to redistribute this code under either of these licenses.
16  //  ========================================================================
17  //
18  
19  package org.eclipse.jetty.rewrite.handler;
20  
21  import java.io.IOException;
22  
23  import javax.servlet.http.HttpServletRequest;
24  import javax.servlet.http.HttpServletResponse;
25  
26  import org.eclipse.jetty.util.ArrayUtil;
27  
28  /**
29   * Groups rules that apply only to a specific virtual host
30   * or sets of virtual hosts
31   * 
32   *  
33   */
34  
35  public class VirtualHostRuleContainer extends RuleContainer
36  {
37      private String[] _virtualHosts;
38  
39      /* ------------------------------------------------------------ */
40      /** Set the virtual hosts that the rules within this container will apply to
41       * @param virtualHosts Array of virtual hosts that the rules within this container are applied to. 
42       * A null hostname or null/empty array means any hostname is acceptable.
43       */
44      public void setVirtualHosts( String[] virtualHosts )
45      {
46          if ( virtualHosts == null )
47          {
48              _virtualHosts = virtualHosts;
49          } 
50          else 
51          {
52              _virtualHosts = new String[virtualHosts.length];
53              for ( int i = 0; i < virtualHosts.length; i++ )
54                  _virtualHosts[i] = normalizeHostname( virtualHosts[i]);
55          }
56      }
57  
58      /* ------------------------------------------------------------ */
59      /** Get the virtual hosts that the rules within this container will apply to
60       * @return Array of virtual hosts that the rules within this container are applied to. 
61       * A null hostname or null/empty array means any hostname is acceptable.
62       */
63      public String[] getVirtualHosts()
64      {
65          return _virtualHosts;
66      }
67      
68      /* ------------------------------------------------------------ */
69      /**
70       * @param virtualHost add a virtual host to the existing list of virtual hosts
71       * A null hostname means any hostname is acceptable 
72       */
73      public void addVirtualHost(String virtualHost)
74      {
75          _virtualHosts = ArrayUtil.addToArray(_virtualHosts,virtualHost,String.class);
76      }
77  
78      /**
79       * Process the contained rules if the request is applicable to the virtual hosts of this rule
80       * @param target target field to pass on to the contained rules
81       * @param request request object to pass on to the contained rules
82       * @param response response object to pass on to the contained rules
83       */
84      @Override
85      public String matchAndApply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException
86      {
87          if(_virtualHosts != null && _virtualHosts.length > 0 )
88          {
89              String requestHost = normalizeHostname( request.getServerName() );
90              for( String ruleHost : _virtualHosts )
91              {
92                  if(ruleHost == null || ruleHost.equalsIgnoreCase(requestHost)
93                          || (ruleHost.startsWith("*.") && ruleHost.regionMatches(true,2,requestHost,requestHost.indexOf(".")+1,ruleHost.length()-2)))
94                      return apply(target, request, response);
95              }
96          }
97          else
98          {
99              return apply(target, request, response);
100         }
101         return null;
102     }
103 
104     /* ------------------------------------------------------------ */
105     private String normalizeHostname( String host )
106     {
107         if ( host == null )
108             return null;
109         
110         if ( host.endsWith( "." ) )
111             return host.substring( 0, host.length() -1);
112       
113             return host;
114     }
115 
116 }