⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 proxiedrequestdispatcher.java

📁 这是linux下ssl vpn的实现程序
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
 *  SSL-Explorer
 *
 *  Copyright (C) 2003-2006 3SP LTD. All Rights Reserved
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU General Public License
 *  as published by the Free Software Foundation; either version 2 of
 *  the License, or (at your option) any later version.
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public
 *  License along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
			
package com.sslexplorer.replacementproxy;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;

import javax.servlet.http.HttpSession;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.transaction.util.FileHelper;

import com.maverick.http.HttpAuthenticatorFactory;
import com.maverick.http.HttpClient;
import com.maverick.http.HttpConnection;
import com.maverick.http.HttpResponse;
import com.maverick.http.PasswordCredentials;
import com.sslexplorer.boot.CaseInsensitiveMap;
import com.sslexplorer.boot.HttpConstants;
import com.sslexplorer.boot.Util;
import com.sslexplorer.core.CookieItem;
import com.sslexplorer.core.CookieMap;
import com.sslexplorer.core.CoreServlet;
import com.sslexplorer.core.CoreUtil;
import com.sslexplorer.reverseproxy.ReverseProxyProxiedMethod;
import com.sslexplorer.reverseproxy.SessionClients;
import com.sslexplorer.security.Constants;
import com.sslexplorer.security.User;

/**
 * @author Brett Smith <brett@3sp.com>
 */
public class ProxiedRequestDispatcher {
    final static Log log = LogFactory.getLog(ProxiedRequestDispatcher.class);
    static CaseInsensitiveMap ignoreHeaders = new CaseInsensitiveMap();


    final static String sessionIdCookieName = System.getProperty("sslexplorer.cookie", "JSESSIONID");

    static {

        ignoreHeaders.put(HttpConstants.HDR_PROXY_CONNECTION, Boolean.TRUE);
        ignoreHeaders.put(HttpConstants.HDR_ACCEPT_ENCODING, Boolean.TRUE);
        ignoreHeaders.put(HttpConstants.HDR_TRANSFER_ENCODING, Boolean.TRUE);
        ignoreHeaders.put(HttpConstants.HDR_TE, Boolean.TRUE);
        ignoreHeaders.put(HttpConstants.HDR_TRAILER, Boolean.TRUE);
        ignoreHeaders.put(HttpConstants.HDR_PROXY_AUTHORIZATION, Boolean.TRUE);
        ignoreHeaders.put(HttpConstants.HDR_PROXY_AUTHENTICATE, Boolean.TRUE);
        ignoreHeaders.put(HttpConstants.HDR_UPGRADE, Boolean.TRUE);

    }

    private RequestProcessor requestProcessor;
    private User user;
    //private boolean keepAlive;
    private HttpResponse serverResponse;
    //private InputStream serverIn;
    private int responseCode;
    private String responseMessage;
    private CookieMap cookieMap;
   // private URLConnection connection;
    private URL connectionURL;

    public ProxiedRequestDispatcher(RequestProcessor requestProcessor, User user, CookieMap cookieMap) {
        this.user = user;
        this.requestProcessor = requestProcessor;
        //keepAlive = requestProcessor.isKeepAlive();
        this.cookieMap = cookieMap;
    }

   // public boolean isKeepAlive() {
   //     return keepAlive;
  //  }
    public RequestProcessor getRequestProcessor() {
        return requestProcessor;
    }

    public boolean sendProxiedRequest() throws Exception {

        byte[] content = requestProcessor.getContent();
        OutputStream serverOut = null;
        HttpClient client;
        SessionClients clients = null;
        HttpSession session = requestProcessor.getSession();
        connectionURL = new URL(requestProcessor.getConnectionPath());

        // Manage the sessions clients
        synchronized(session) {
            clients =
                (SessionClients)session.getAttribute(Constants.HTTP_CLIENTS);
            if(clients == null) {
                clients = new SessionClients();
                session.setAttribute(Constants.HTTP_CLIENTS, clients);
            }
            cookieMap = (CookieMap) session.getAttribute(Constants.ATTR_COOKIE_MAP);
            if (cookieMap == null) {
                cookieMap = new CookieMap();
                session.setAttribute(Constants.ATTR_COOKIE_MAP, cookieMap);
            }
        }

        synchronized(clients) {
            String key = connectionURL.getHost()
                         + ":"
                         + (connectionURL.getPort() > 0 ? connectionURL.getPort() : connectionURL.getProtocol().equals("https") ? 443 : 80)
                         + ":"
                         + connectionURL.getProtocol().equals("https")
                         + ":"
                         + requestProcessor.getWebForward().getResourceId()
                         + Thread.currentThread().getName();
            client = (HttpClient) clients.get(key);

            if (client == null) {
                client = new HttpClient(connectionURL.getHost(),
                                        (connectionURL.getPort() > 0 ? connectionURL.getPort() : connectionURL.getProtocol().equals("https") ? 443 : 80),
                                        connectionURL.getProtocol().equals("https"));

                if(!requestProcessor.getWebForward().getPreferredAuthenticationScheme().equals(HttpAuthenticatorFactory.NONE)
                                && !requestProcessor.getWebForward().getAuthenticationUsername().equals("")
                                && !requestProcessor.getWebForward().getAuthenticationPassword().equals("")) {
                    PasswordCredentials pwd = new PasswordCredentials();
                    pwd.setUsername(CoreUtil.doStandardReplacements(requestProcessor.getSessionInfo(), requestProcessor.getWebForward().getAuthenticationUsername()));
                    pwd.setPassword(CoreUtil.doStandardReplacements(requestProcessor.getSessionInfo(), requestProcessor.getWebForward().getAuthenticationPassword()));
                    client.setCredentials(pwd);
                }

                // Set the preferred scheme
                client.setPreferredAuthentication(requestProcessor.getWebForward().getPreferredAuthenticationScheme());

                // If we're using basic authentication then preempt the 401 response
                client.setPreemtiveAuthentication(requestProcessor.getWebForward().getPreferredAuthenticationScheme().equalsIgnoreCase("BASIC"));
                clients.put(key, client);
            }
        }

        if (log.isDebugEnabled())
        	log.debug("Connecting to [" + requestProcessor.getConnectionPath() + "] ");

        ReverseProxyProxiedMethod method;
        
        if (!requestProcessor.getWebForward().getFormType().equals("NONE") 
                        && requestProcessor.getRequestParameters().containsKey("launched")) {

            requestProcessor.getRequestParameters().remove("launched");

            method = new ReverseProxyProxiedMethod(requestProcessor.getWebForward().getFormType(), 
                CoreUtil.doStandardReplacements(requestProcessor.getSessionInfo(), requestProcessor.getEncodedUri()),
                requestProcessor.getRequestParameters(),
                requestProcessor.getSessionInfo());

            StringTokenizer tokens = new StringTokenizer(requestProcessor.getWebForward().getFormParameters(), "\n");
            int idx;
            String param;
            while (tokens.hasMoreTokens()) {
                param = CoreUtil.doStandardReplacements(requestProcessor.getSessionInfo(), tokens.nextToken().trim());
                idx = param.indexOf('=');
                if (idx > -1) {
                    method.setParameter(param.substring(0, idx), param.substring(idx + 1));
                } else
                    method.setParameter(param, "");
            }
        } else {
            method = new ReverseProxyProxiedMethod(requestProcessor.getMethod(),
                CoreUtil.doStandardReplacements(requestProcessor.getSessionInfo(), requestProcessor.getEncodedUri()),
                requestProcessor.getRequestParameters(),
                requestProcessor.getSessionInfo());        }        
        




       int contentLength = 0;

       for (Enumeration e = requestProcessor.getHeaderNames(); e.hasMoreElements(); ) {

           String hdr = (String) e.nextElement();

           if (ignoreHeaders.containsKey(hdr)) {
        	   if (log.isDebugEnabled())
        		   log.debug("Ignoring " + hdr + " = " + requestProcessor.getHeader(hdr));
               continue;
           }

           // See if there any replacements for this header
           List replacements = CoreServlet.getServlet().getSystemDatabase().getReplacementsForContent(
                           user.getPrincipalName(), Replacement.REPLACEMENT_TYPE_SENT_HEADER, hdr,
                           connectionURL.toExternalForm());

           Enumeration vals = requestProcessor.getHeaders(hdr);
           while (vals.hasMoreElements()) {
               String val = (String) vals.nextElement();

               // Do the replacements
               for (Iterator i = replacements.iterator(); i.hasNext();) {
                   Replacement r = (Replacement) i.next();
                   val = val.replaceAll(r.getMatchPattern(), r.getReplacePattern());
               }

               if (val != null) {
                   if (hdr.equalsIgnoreCase(HttpConstants.HDR_HOST)) {
                       if (connectionURL.getPort() == -1) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -