Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'jetty-proxy/src/main/java/org/eclipse/jetty/proxy/BalancerServlet.java')
-rw-r--r--jetty-proxy/src/main/java/org/eclipse/jetty/proxy/BalancerServlet.java308
1 files changed, 0 insertions, 308 deletions
diff --git a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/BalancerServlet.java b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/BalancerServlet.java
deleted file mode 100644
index 44a323bf2f..0000000000
--- a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/BalancerServlet.java
+++ /dev/null
@@ -1,308 +0,0 @@
-//
-// ========================================================================
-// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.opensource.org/licenses/apache2.0.php
-//
-// You may elect to redistribute this code under either of these licenses.
-// ========================================================================
-//
-
-package org.eclipse.jetty.proxy;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicLong;
-
-import javax.servlet.ServletException;
-import javax.servlet.UnavailableException;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-
-public class BalancerServlet extends ProxyServlet
-{
- private static final String BALANCER_MEMBER_PREFIX = "balancerMember.";
- private static final List<String> FORBIDDEN_CONFIG_PARAMETERS;
-
- static
- {
- List<String> params = new LinkedList<>();
- params.add("hostHeader");
- params.add("whiteList");
- params.add("blackList");
- FORBIDDEN_CONFIG_PARAMETERS = Collections.unmodifiableList(params);
- }
-
- private static final List<String> REVERSE_PROXY_HEADERS;
-
- static
- {
- List<String> params = new LinkedList<>();
- params.add("Location");
- params.add("Content-Location");
- params.add("URI");
- REVERSE_PROXY_HEADERS = Collections.unmodifiableList(params);
- }
-
- private static final String JSESSIONID = "jsessionid";
- private static final String JSESSIONID_URL_PREFIX = JSESSIONID + "=";
-
- private final List<BalancerMember> _balancerMembers = new ArrayList<>();
- private final AtomicLong counter = new AtomicLong();
- private boolean _stickySessions;
- private boolean _proxyPassReverse;
-
- @Override
- public void init() throws ServletException
- {
- validateConfig();
- super.init();
- initStickySessions();
- initBalancers();
- initProxyPassReverse();
- }
-
- private void validateConfig() throws ServletException
- {
- for (String initParameterName : Collections.list(getServletConfig().getInitParameterNames()))
- {
- if (FORBIDDEN_CONFIG_PARAMETERS.contains(initParameterName))
- {
- throw new UnavailableException(initParameterName + " not supported in " + getClass().getName());
- }
- }
- }
-
- private void initStickySessions() throws ServletException
- {
- _stickySessions = Boolean.parseBoolean(getServletConfig().getInitParameter("stickySessions"));
- }
-
- private void initBalancers() throws ServletException
- {
- Set<BalancerMember> members = new HashSet<>();
- for (String balancerName : getBalancerNames())
- {
- String memberProxyToParam = BALANCER_MEMBER_PREFIX + balancerName + ".proxyTo";
- String proxyTo = getServletConfig().getInitParameter(memberProxyToParam);
- if (proxyTo == null || proxyTo.trim().length() == 0)
- throw new UnavailableException(memberProxyToParam + " parameter is empty.");
- members.add(new BalancerMember(balancerName, proxyTo));
- }
- _balancerMembers.addAll(members);
- }
-
- private void initProxyPassReverse()
- {
- _proxyPassReverse = Boolean.parseBoolean(getServletConfig().getInitParameter("proxyPassReverse"));
- }
-
- private Set<String> getBalancerNames() throws ServletException
- {
- Set<String> names = new HashSet<>();
- for (String initParameterName : Collections.list(getServletConfig().getInitParameterNames()))
- {
- if (!initParameterName.startsWith(BALANCER_MEMBER_PREFIX))
- continue;
-
- int endOfNameIndex = initParameterName.lastIndexOf(".");
- if (endOfNameIndex <= BALANCER_MEMBER_PREFIX.length())
- throw new UnavailableException(initParameterName + " parameter does not provide a balancer member name");
-
- names.add(initParameterName.substring(BALANCER_MEMBER_PREFIX.length(), endOfNameIndex));
- }
- return names;
- }
-
- @Override
- protected URI rewriteURI(HttpServletRequest request)
- {
- BalancerMember balancerMember = selectBalancerMember(request);
- _log.debug("Selected {}", balancerMember);
- String path = request.getRequestURI();
- String query = request.getQueryString();
- if (query != null)
- path += "?" + query;
- return URI.create(balancerMember.getProxyTo() + "/" + path).normalize();
- }
-
- private BalancerMember selectBalancerMember(HttpServletRequest request)
- {
- if (_stickySessions)
- {
- String name = getBalancerMemberNameFromSessionId(request);
- if (name != null)
- {
- BalancerMember balancerMember = findBalancerMemberByName(name);
- if (balancerMember != null)
- return balancerMember;
- }
- }
- int index = (int)(counter.getAndIncrement() % _balancerMembers.size());
- return _balancerMembers.get(index);
- }
-
- private BalancerMember findBalancerMemberByName(String name)
- {
- for (BalancerMember balancerMember : _balancerMembers)
- {
- if (balancerMember.getName().equals(name))
- return balancerMember;
- }
- return null;
- }
-
- private String getBalancerMemberNameFromSessionId(HttpServletRequest request)
- {
- String name = getBalancerMemberNameFromSessionCookie(request);
- if (name == null)
- name = getBalancerMemberNameFromURL(request);
- return name;
- }
-
- private String getBalancerMemberNameFromSessionCookie(HttpServletRequest request)
- {
- for (Cookie cookie : request.getCookies())
- {
- if (JSESSIONID.equalsIgnoreCase(cookie.getName()))
- return extractBalancerMemberNameFromSessionId(cookie.getValue());
- }
- return null;
- }
-
- private String getBalancerMemberNameFromURL(HttpServletRequest request)
- {
- String requestURI = request.getRequestURI();
- int idx = requestURI.lastIndexOf(";");
- if (idx > 0)
- {
- String requestURISuffix = requestURI.substring(idx + 1);
- if (requestURISuffix.startsWith(JSESSIONID_URL_PREFIX))
- return extractBalancerMemberNameFromSessionId(requestURISuffix.substring(JSESSIONID_URL_PREFIX.length()));
- }
- return null;
- }
-
- private String extractBalancerMemberNameFromSessionId(String sessionId)
- {
- int idx = sessionId.lastIndexOf(".");
- if (idx > 0)
- {
- String sessionIdSuffix = sessionId.substring(idx + 1);
- return sessionIdSuffix.length() > 0 ? sessionIdSuffix : null;
- }
- return null;
- }
-
- @Override
- protected String filterResponseHeader(HttpServletRequest request, String headerName, String headerValue)
- {
- if (_proxyPassReverse && REVERSE_PROXY_HEADERS.contains(headerName))
- {
- URI locationURI = URI.create(headerValue).normalize();
- if (locationURI.isAbsolute() && isBackendLocation(locationURI))
- {
- String newURI = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort();
- String component = locationURI.getRawPath();
- if (component != null)
- newURI += component;
- component = locationURI.getRawQuery();
- if (component != null)
- newURI += "?" + component;
- component = locationURI.getRawFragment();
- if (component != null)
- newURI += "#" + component;
- return URI.create(newURI).normalize().toString();
- }
- }
- return headerValue;
- }
-
- private boolean isBackendLocation(URI locationURI)
- {
- for (BalancerMember balancerMember : _balancerMembers)
- {
- URI backendURI = balancerMember.getBackendURI();
- if (backendURI.getHost().equals(locationURI.getHost()) &&
- backendURI.getScheme().equals(locationURI.getScheme())
- && backendURI.getPort() == locationURI.getPort())
- {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public boolean validateDestination(String host, int port)
- {
- return true;
- }
-
- private static class BalancerMember
- {
- private final String _name;
- private final String _proxyTo;
- private final URI _backendURI;
-
- public BalancerMember(String name, String proxyTo)
- {
- _name = name;
- _proxyTo = proxyTo;
- _backendURI = URI.create(_proxyTo).normalize();
- }
-
- public String getName()
- {
- return _name;
- }
-
- public String getProxyTo()
- {
- return _proxyTo;
- }
-
- public URI getBackendURI()
- {
- return _backendURI;
- }
-
- @Override
- public String toString()
- {
- return String.format("%s[name=%s,proxyTo=%s]", getClass().getSimpleName(), _name, _proxyTo);
- }
-
- @Override
- public int hashCode()
- {
- return _name.hashCode();
- }
-
- @Override
- public boolean equals(Object obj)
- {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- BalancerMember that = (BalancerMember)obj;
- return _name.equals(that._name);
- }
- }
-}

Back to the top