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

org.eclipse.jetty.http.HttpHeader Maven / Gradle / Ivy

The newest version!
//
//  ========================================================================
//  Copyright (c) 1995-2012 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.http;

import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.jetty.util.StringMap;
import org.eclipse.jetty.util.StringUtil;


public enum HttpHeader
{
    /* ------------------------------------------------------------ */
    /** General Fields.
     */
    CONNECTION("Connection"),
    CACHE_CONTROL("Cache-Control"),
    DATE("Date"),
    PRAGMA("Pragma"),
    PROXY_CONNECTION ("Proxy-Connection"),
    TRAILER("Trailer"),
    TRANSFER_ENCODING("Transfer-Encoding"),
    UPGRADE("Upgrade"),
    VIA("Via"),
    WARNING("Warning"),
    NEGOTIATE("Negotiate"),

    /* ------------------------------------------------------------ */
    /** Entity Fields.
     */
    ALLOW("Allow"),
    CONTENT_ENCODING("Content-Encoding"),
    CONTENT_LANGUAGE("Content-Language"),
    CONTENT_LENGTH("Content-Length"),
    CONTENT_LOCATION("Content-Location"),
    CONTENT_MD5("Content-MD5"),
    CONTENT_RANGE("Content-Range"),
    CONTENT_TYPE("Content-Type"),
    EXPIRES("Expires"),
    LAST_MODIFIED("Last-Modified"),

    /* ------------------------------------------------------------ */
    /** Request Fields.
     */
    ACCEPT("Accept"),
    ACCEPT_CHARSET("Accept-Charset"),
    ACCEPT_ENCODING("Accept-Encoding"),
    ACCEPT_LANGUAGE("Accept-Language"),
    AUTHORIZATION("Authorization"),
    EXPECT("Expect"),
    FORWARDED("Forwarded"),
    FROM("From"),
    HOST("Host"),
    IF_MATCH("If-Match"),
    IF_MODIFIED_SINCE("If-Modified-Since"),
    IF_NONE_MATCH("If-None-Match"),
    IF_RANGE("If-Range"),
    IF_UNMODIFIED_SINCE("If-Unmodified-Since"),
    KEEP_ALIVE("Keep-Alive"),
    MAX_FORWARDS("Max-Forwards"),
    PROXY_AUTHORIZATION("Proxy-Authorization"),
    RANGE("Range"),
    REQUEST_RANGE("Request-Range"),
    REFERER("Referer"),
    TE("TE"),
    USER_AGENT("User-Agent"),
    X_FORWARDED_FOR("X-Forwarded-For"),
    X_FORWARDED_PROTO("X-Forwarded-Proto"),
    X_FORWARDED_SERVER("X-Forwarded-Server"),
    X_FORWARDED_HOST("X-Forwarded-Host"),

    /* ------------------------------------------------------------ */
    /** Response Fields.
     */
    ACCEPT_RANGES("Accept-Ranges"),
    AGE("Age"),
    ETAG("ETag"),
    LOCATION("Location"),
    PROXY_AUTHENTICATE("Proxy-Authenticate"),
    RETRY_AFTER("Retry-After"),
    SERVER("Server"),
    SERVLET_ENGINE("Servlet-Engine"),
    VARY("Vary"),
    WWW_AUTHENTICATE("WWW-Authenticate"),

    /* ------------------------------------------------------------ */
    /** Other Fields.
     */
    COOKIE("Cookie"),
    SET_COOKIE("Set-Cookie"),
    SET_COOKIE2("Set-Cookie2"),
    MIME_VERSION("MIME-Version"),
    IDENTITY("identity"),

    UNKNOWN("::UNKNOWN::");


    /* ------------------------------------------------------------ */
    public final static StringMap CACHE= new StringMap(true);
    static
    {
        for (HttpHeader header : HttpHeader.values())
            if (header!=UNKNOWN)
                CACHE.put(header.toString(),header);
    }
    
    /* ------------------------------------------------------------ */
    private final static HttpHeader[] __hashed= new HttpHeader[4096]; 
    private final static int __maxHashed;
    static
    {
        // This hash function has been picked to have no collisions for 
        // the known header values.  This allows a very quick lookup.
        int max=0;
        Map hashes=new HashMap<>();
        for (HttpHeader header : HttpHeader.values())
        {
            String s=header.asString();
            max=Math.max(max,s.length());
            int h=0;
            for (char c:s.toCharArray())
                h = 31*h + ((c>='a')?(c-'a'+'A'):c);
            int hash=h%__hashed.length;
            if (hash<0)hash=-hash;
            if (hashes.containsKey(hash))
            {
                // This should not happen with known headers.
                System.err.println("Duplicate hash "+header+" "+hashes.get(hash));
                System.exit(1);
            }
            hashes.put(hash,header);
            __hashed[hash]=header;
        }
        __maxHashed=max;
    }

    public static HttpHeader lookAheadGet(byte[] bytes, int position, int limit)
    {
        int h=0;
        byte b=0;
        limit=Math.min(position+__maxHashed,limit);
        for (int i=position;i='a')?(b-'a'+'A'):b);
        }
        if (b!=':'&&b!=' ')
            return null;

        int hash=h%__hashed.length;
        if (hash<0)hash=-hash;
        HttpHeader header=__hashed[hash];
        
        if (header!=null)
        {
            String s=header.asString();
            for (int i=s.length();i-->0;)
            {
                b=bytes[position+i];
                char c=s.charAt(i);
                if (c!=b && Character.toUpperCase(c)!=(b>='a'?(b-'a'+'A'):b))
                    return null;
            }
        }
        
        return header;
    }
    
    
    private final String _string;
    private final byte[] _bytes;
    private final byte[] _bytesColonSpace;
    private final ByteBuffer _buffer;

    /* ------------------------------------------------------------ */
    HttpHeader(String s)
    {
        _string=s;
        _bytes=StringUtil.getBytes(s);
        _bytesColonSpace=StringUtil.getBytes(s+": ");
        _buffer=ByteBuffer.wrap(_bytes);
    }

    /* ------------------------------------------------------------ */
    public ByteBuffer toBuffer()
    {
        return _buffer.asReadOnlyBuffer();
    }

    /* ------------------------------------------------------------ */
    public byte[] getBytes()
    {
        return _bytes;
    }

    /* ------------------------------------------------------------ */
    public byte[] getBytesColonSpace()
    {
        return _bytesColonSpace;
    }

    /* ------------------------------------------------------------ */
    public boolean is(String s)
    {
        return _string.equalsIgnoreCase(s);    
    }

    /* ------------------------------------------------------------ */
    public String asString()
    {
        return _string;
    }
    
    /* ------------------------------------------------------------ */
    @Override
    public String toString()
    {
        return _string;
    }
    
}





© 2015 - 2024 Weber Informatics LLC | Privacy Policy