All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.tinygroup.weblayer.webcontext.rewrite.RewriteUtil Maven / Gradle / Ivy

The newest version!
/**
 *  Copyright (c) 1997-2013, www.tinygroup.org ([email protected]).
 *
 *  Licensed under the GPL, Version 3.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *       http://www.gnu.org/licenses/gpl.html
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package org.tinygroup.weblayer.webcontext.rewrite;

import org.tinygroup.commons.tools.MatchResultSubstitution;
import org.tinygroup.format.Formater;
import org.tinygroup.format.PatternDefine;
import org.tinygroup.format.impl.DefaultPatternDefine;
import org.tinygroup.format.impl.FormaterImpl;
import org.tinygroup.weblayer.webcontext.parser.ParserWebContext;
import org.tinygroup.weblayer.webcontext.util.WebContextUtil;

import javax.servlet.http.HttpServletRequest;
import java.util.regex.MatchResult;



/**
 * 和rewrite相关的工具类。
 *
 * @author renhui
 */
public class RewriteUtil {
   private static Formater formatter;
   private static RewriteFormatProvider provider;
	static{
		formatter =new FormaterImpl();
		provider=new RewriteFormatProvider();
		PatternDefine define=new  DefaultPatternDefine();
		define.setPrefixPatternString("%{");
		define.setPostfixPatternString("}");
		define.setSplitChar('#');
		define.setPatternString("([%]+[{]+[a-zA-Z0-9[.[_[:[/[#]]]]]]+[}])");
		formatter.setPatternHandle(define);
		formatter.addFormatProvider("", provider);
	}
	
    public static boolean isFullURL(String path) {
        return path.matches("^\\w+:.*");
    }

    public static MatchResultSubstitution getMatchResultSubstitution(MatchResult ruleMatchResult,
                                                                     MatchResult conditionMatchResult) {
        return new MatchResultSubstitution("$%", ruleMatchResult, conditionMatchResult);
    }

    public static String getSubstitutedTestString(String testString, MatchResult ruleMatchResult,
                                                  MatchResult conditionMatchResult, HttpServletRequest request) {
        testString = format(testString, request);

        return getMatchResultSubstitution(ruleMatchResult, conditionMatchResult).substitute(testString);
    }

    public static String format(String testString, HttpServletRequest request) {
    	provider.setRequest(request);
		return formatter.format(null, testString);
	}

    /**
     * 展开变量。
     *
     * @return 注意,如果返回null,表示按原样显示,例如:%{XYZ}
     */
    public static String expand(String varName, HttpServletRequest request) {
        boolean valid = true;
        String result;

        // =====================================================
        //  Client side of the IP connection
        // =====================================================

        if ("REMOTE_HOST".equals(varName)) {
            result = request.getRemoteHost();
        }
        //
        else if ("REMOTE_ADDR".equals(varName)) {
            result = request.getRemoteAddr();
        }
        //
        else if ("REMOTE_USER".equals(varName)) {
            result = request.getRemoteUser();
        }
        //
        else if ("REQUEST_METHOD".equals(varName)) {
            result = request.getMethod();
        }
        //
        else if ("QUERY_STRING".equals(varName)) {
            if ("post".equalsIgnoreCase(request.getMethod())) {
                ParserWebContext parserRequestContext = WebContextUtil.findWebContext(request,
                                                                                                 ParserWebContext.class);

                result = parserRequestContext.getParameters().toQueryString();
            } else {
                result = request.getQueryString();
            }
        }
        //
        else if (varName.startsWith("QUERY:")) {
        	ParserWebContext parserRequestContext = WebContextUtil.findWebContext(request,
            		ParserWebContext.class);

            result = parserRequestContext.getParameters().getString(varName.substring("QUERY:".length()).trim());
        }
        //
        else if ("AUTH_TYPE".equals(varName)) {
            result = request.getAuthType();
        }

        // =====================================================
        //  HTTP layer details extracted from HTTP headers
        // =====================================================

        else if ("SERVER_NAME".equals(varName)) {
            result = request.getServerName();
        }
        //
        else if ("SERVER_PORT".equals(varName)) {
            result = String.valueOf(request.getServerPort());
        }
        //
        else if ("SERVER_PROTOCOL".equals(varName)) {
            result = request.getProtocol();
        }

        // =====================================================
        //  HTTP headers
        // =====================================================

        else if ("HTTP_USER_AGENT".equals(varName)) {
            result = request.getHeader("User-Agent");
        }
        //
        else if ("HTTP_REFERER".equals(varName)) {
            result = request.getHeader("Referer");
        }
        //
        else if ("HTTP_HOST".equals(varName)) {
            result = request.getHeader("Host");
        }
        //
        else if ("HTTP_ACCEPT".equals(varName)) {
            result = request.getHeader("Accept");
        }
        //
        else if ("HTTP_COOKIE".equals(varName)) {
            result = request.getHeader("Cookie");
        }

        // =====================================================
        //  Others
        // =====================================================

        else if ("REQUEST_URI".equals(varName)) {
            result = request.getRequestURI();
        } else {
            result = null;
            valid = false;
        }

        // 如果变量合法,但值为null,则返回""
        if (valid && result == null) {
            result = "";
        }

        return result;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy