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

flex.messaging.services.http.proxy.RequestUtil Maven / Gradle / Ivy

There is a newer version: 4.8.0
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 flex.messaging.services.http.proxy;

import flex.messaging.log.Log;
import flex.messaging.services.HTTPProxyService;

/**
 *
 * Request methods shared by J2EE and .NET.
 */
public class RequestUtil
{
    public static CookieInfo createCookie(CookieInfo cookie, SharedProxyContext context, String targetHost,
                                          String targetPath)
    {
        String path = cookie.path;
        String name = cookie.name;
        if (path == null)
        {
            path = "/";
        }
        String domain = null, actualName = null;

        // FIXME: append domain+path to existing path instead of doing cookie hack?

        //Cookie name format: COOKIE_PREFIX[COOKIE_SEPARATOR]domain[COOKIE_SEPARATOR]path[COOKIE_SEPARATOR]name
        if (name.startsWith(ProxyConstants.COOKIE_PREFIX) && name.indexOf(ProxyConstants.COOKIE_SEPARATOR) != -1)
        {
            //use indexOf and substring instead of split or string tokenizer for performance
            int domainHash;
            int pathHash;
            int startIndex = name.indexOf(ProxyConstants.COOKIE_SEPARATOR) + 1;
            int endIndex = name.indexOf(ProxyConstants.COOKIE_SEPARATOR, startIndex);
            if (endIndex == -1) return null;
            try
            {
                domainHash = Integer.parseInt(name.substring(startIndex, endIndex));
                startIndex = endIndex + 1;
                endIndex = name.indexOf(ProxyConstants.COOKIE_SEPARATOR, startIndex);
                if (endIndex == -1) return null;
                pathHash = Integer.parseInt(name.substring(startIndex, endIndex));
            }
            catch (NumberFormatException e)
            {
                Log.getLogger(HTTPProxyService.LOG_CATEGORY).error("Could not parse cookie hash value in: " + name + " (may be beta cookie)");
                return null;
            }
            startIndex = endIndex + 1;
            if (name.length() <= startIndex) return null;
            actualName = name.substring(startIndex);
            //see if the context.target domain fuzzy matches the cookie's domain
            domain = targetHost;
            while (domain != null && domainHash != domain.hashCode())
            {
                int dotIndex = domain.indexOf(".", 1);
                if (dotIndex != -1)
                {
                    domain = domain.substring(dotIndex);
                }
                else
                {
                    domain = null;
                }
            }
            if (domain == null) return null;

            //see if the context.target path fuzzy matches the cookie's path.  i think this has to be done the long way
            //to make sure we match cases where the path might have ended with a / or not. perhaps
            //we could do it slightly more efficiently by testing /foo/ and /foo in one go but not testing /fo
            path = targetPath;
            while (path != null && path.length() != 0 && pathHash != path.hashCode())
            {
                path = path.substring(0, path.length() - 1);
            }
            if (path == null || path.length() == 0) return null;
        }
        else if (context.isLocalDomain())
        {
            domain = cookie.domain;
            if (domain == null)
            {
                domain = targetHost;
            }
            actualName = cookie.name;
        }
        else
        {
            return null;
        }

        CookieInfo cookieInfo = new CookieInfo(name, domain, actualName, cookie.value, path,
                cookie.maxAge, cookie.maxAgeObj, cookie.secure);
        return cookieInfo;
    }

    public static boolean ignoreHeader(String headerName, SharedProxyContext context)
    {
        boolean ignoreHeader = false;

        // FIXME: do we really want to disallow Host- what does this do?
        if ("Host".equalsIgnoreCase(headerName) ||
                // FIXME: we should really ALWAYS send this header and handle compression within
                // the proxy.  Would save bandwidth when the endpoint could handle it
                "Accept-Encoding".equalsIgnoreCase(headerName) ||
                "Content-Length".equalsIgnoreCase(headerName) ||
                "Set-Cookie".equalsIgnoreCase(headerName) ||
                "Set-Cookie2".equalsIgnoreCase(headerName) ||
                "Cookie".equalsIgnoreCase(headerName) ||
                "Connection".equalsIgnoreCase(headerName) ||
                ProxyConstants.HEADER_CREDENTIALS.equalsIgnoreCase(headerName) ||
                ("Authorization".equalsIgnoreCase(headerName) && (context.hasAuthorization() || !context.isLocalDomain())))
        {

            ignoreHeader = true;
        }
        return ignoreHeader;
    }


}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy