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;
}
}