package com.limegroup.gnutella.http; import java.util.Locale; /** * This class defines an "enum" for HTTP header names, following the * typesafe enum pattern. */ public class HTTPHeaderName { /** * Constant for the HTTP header name as a string. */ private final String NAME; /** * Constant for the lower-case representation of the header name. */ private final String LOWER_CASE_NAME; /** * Private constructor for creating the "enum" of header names. * Making the constructor private also ensures that this class * cannot be subclassed. * * @param name the string header as it is written out to the * network */ private HTTPHeaderName(final String name) { NAME = name; LOWER_CASE_NAME = name.toLowerCase(Locale.US); } /** * Header for new alternate file locations, as per new spec. */ public static final HTTPHeaderName ALT_LOCATION = new HTTPHeaderName("X-Alt"); /** * Header for alternate locations behind firewalls. */ public static final HTTPHeaderName FALT_LOCATION = new HTTPHeaderName("X-Falt"); /** * Header for bad alternate locations behind firewalls. */ public static final HTTPHeaderName BFALT_LOCATION = new HTTPHeaderName("X-NFalt"); /** * Header that used to be used for alternate locations, * as per HUGE v0.94. */ public static final HTTPHeaderName OLD_ALT_LOCS = new HTTPHeaderName("X-Gnutella-Alternate-Location"); /** * Header for failed Alternate locations to be removed from the mesh. */ public static final HTTPHeaderName NALTS = new HTTPHeaderName("X-NAlt"); /** * Header for specifying the URN of the file, as per HUGE v0.94. */ public static final HTTPHeaderName GNUTELLA_CONTENT_URN = new HTTPHeaderName("X-Gnutella-Content-URN"); /** * Header for specifying the URN of the file, as per the * CAW spec at * http://www.open-content.net/specs/draft-jchapweske-caw-03.html . */ public static final HTTPHeaderName CONTENT_URN = new HTTPHeaderName("X-Content-URN"); /** * Header for specifying the byte range of the content. */ public static final HTTPHeaderName CONTENT_RANGE = new HTTPHeaderName("Content-Range"); /** * Header for specifying the type of content. */ public static final HTTPHeaderName CONTENT_TYPE = new HTTPHeaderName("Content-Type"); /** * Header for specifying the length of the content, in bytes. */ public static final HTTPHeaderName CONTENT_LENGTH = new HTTPHeaderName("Content-Length"); /** * Header for specifying the type of encoding we'll accept. */ public static final HTTPHeaderName ACCEPT_ENCODING = new HTTPHeaderName("Accept-Encoding"); /** * Header for specifying the type of encoding we'll send. */ public static final HTTPHeaderName CONTENT_ENCODING = new HTTPHeaderName("Content-Encoding"); /** * Response header for specifying the server name and version. */ public static final HTTPHeaderName SERVER = new HTTPHeaderName("Server"); /** * Custom header for upload queues. */ public static final HTTPHeaderName QUEUE_HEADER = new HTTPHeaderName("X-Queue"); /** * Header for specifying whether the connection should be kept alive or * closed when using HTTP 1.1. */ public static final HTTPHeaderName CONNECTION = new HTTPHeaderName("Connection"); /** * Header for specifying a THEX URI. THEX URIs are of the form:<p> * * X-Thex-URI: <URI> ; <ROOT>.<p> * * This informs the client where the full Tiger tree hash can be * retrieved. */ public static final HTTPHeaderName THEX_URI = new HTTPHeaderName("X-Thex-URI"); /** * Constant header for the date. */ public static final HTTPHeaderName DATE = new HTTPHeaderName("Date"); /** * Header for the available ranges of a file currently available, * as specified in the Partial File Sharing Protocol. This takes the * save form as the Content-Range header, as in:<p> * * X-Available-Ranges: bytes 0-10,20-30 */ public static final HTTPHeaderName AVAILABLE_RANGES = new HTTPHeaderName("X-Available-Ranges"); /** * Header for queued downloads. */ public static final HTTPHeaderName QUEUE = new HTTPHeaderName("X-Queue"); /** * Header for retry after. Useful for two things: * 1) LimeWire can now be queued in gtk-gnutella's PARQ * 2) It's possible to tune the number of http requests down * when LimeWire is busy */ public static final HTTPHeaderName RETRY_AFTER = new HTTPHeaderName("Retry-After"); /** * Header for creation time. Allows the creation time * of the file to propagate throughout the network. */ public static final HTTPHeaderName CREATION_TIME = new HTTPHeaderName("X-Create-Time"); /** * Header for submitting supported features. Introduced by BearShare. * * Example: X-Features: chat/0.1, browse/1.0, queue/0.1 */ public static final HTTPHeaderName FEATURES = new HTTPHeaderName("X-Features"); /** * Header for updating the set of push proxies for a host. Defined in * section 4.2 of the Push Proxy proposal, v. 0.7 */ public static final HTTPHeaderName PROXIES = new HTTPHeaderName("X-Push-Proxy"); /** * Header for sending your own "<ip>: * <listening port>" */ public static final HTTPHeaderName NODE = new HTTPHeaderName("X-Node"); /** * Header for informing uploader about amount of already * downloaded bytes */ public static final HTTPHeaderName DOWNLOADED = new HTTPHeaderName("X-Downloaded"); /** * Header for the content disposition. */ public static final HTTPHeaderName CONTENT_DISPOSITION = new HTTPHeaderName("Content-Disposition"); /** * Returns whether or not the start of the passed in string matches the * string representation of this HTTP header, ignoring case. * * @param str the string to check for a match * @return <tt>true</tt> if the passed in string matches the string * representation of this HTTP header (ignoring case), otherwise * returns <tt>false</tt> */ public boolean matchesStartOfString(String str) { return str.toLowerCase(Locale.US).startsWith(LOWER_CASE_NAME); } /** * Accessor to obtain the string representation of the header * as it should be written out to the network. * * @return the HTTP header name as a string */ public String httpStringValue() { return NAME; } /** * Overrides Object.toString to give a more informative description of * the header. * * @return the string description of this instance */ public String toString() { return NAME; } }