/*
 * Copyright 1999,2004 The Apache Software Foundation.
 * 
 * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
 * 
 * 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.apache.catalina.ssi;

import javax.servlet.http.HttpServletRequest;
import org.apache.catalina.util.RequestUtil;

public class SSIServletRequestUtil {
    /**
     * Return the relative path associated with this servlet.
     *
     * Taken from DefaultServlet.java.  Perhaps this should be put in
     * org.apache.catalina.util somewhere?  Seems like it would be widely used.
     *
     * @param request The servlet request we are processing
     */
    public static String getRelativePath(HttpServletRequest request) {

        // Are we being processed by a RequestDispatcher.include()?
        if (request.getAttribute("javax.servlet.include.request_uri")!=null) {
            String result = (String)
                request.getAttribute("javax.servlet.include.path_info");
            if (result == null)
                result = (String)
                    request.getAttribute("javax.servlet.include.servlet_path");
            if ((result == null) || (result.equals("")))
                result = "/";
            return (result);
        }

        // No, extract the desired path directly from the request
        String result = request.getPathInfo();
        if (result == null) {
            result = request.getServletPath();
        }
        if ((result == null) || (result.equals(""))) {
            result = "/";
        }
        return normalize(result);
    }

    /**
     * Return a context-relative path, beginning with a "/", that represents
     * the canonical version of the specified path after ".." and "." elements
     * are resolved out.  If the specified path attempts to go outside the
     * boundaries of the current context (i.e. too many ".." path elements
     * are present), return <code>null</code> instead.
     *
     * This normalize should be the same as DefaultServlet.normalize, which is almost the same
     * ( see source code below ) as RequestUtil.normalize.  Do we need all this duplication?
     *
     * @param path Path to be normalized
     */
    public static String normalize(String path) {
        if (path == null)
            return null;

	String normalized = path;

	//Why doesn't RequestUtil do this??

        // Normalize the slashes and add leading slash if necessary
        if ( normalized.indexOf('\\') >= 0 )
            normalized = normalized.replace( '\\', '/' );

	normalized = RequestUtil.normalize( path );
	return normalized;
    }
}
