package com.limegroup.gnutella.http;
import java.io.IOException;
import java.net.URLEncoder;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import org.limewire.util.StringUtils;
/**
* This class supplies general facilities for handling HTTP, such as writing
* headers, extracting header values, etc..
*/
public final class HTTPUtils {
/**
* Constant for the carriage-return linefeed sequence that marks the end of
* an HTTP header
*/
private static final String CRLF = "\r\n";
/**
* Cached colon followed by a space to avoid excessive allocations.
*/
private static final String COLON_SPACE = ": ";
/**
* Cached colon to avoid excessive allocations.
*/
public static final String COLON = ":";
/**
* Cached slash to avoid excessive allocations.
*/
private static final String SLASH = "/";
/**
* Private constructor to ensure that this class cannot be constructed
*/
private HTTPUtils() {
}
public static String createHeader(String name, String value) {
StringBuilder sb = new StringBuilder(name.length() + value.length() + 4);
return sb.append(name).append(COLON_SPACE).append(value).append(CRLF).toString();
}
/**
* Utility method for extracting the version from a feature token.
*/
public static float parseFeatureToken(String token) throws ProblemReadingHeaderException {
int slashIndex = token.indexOf(SLASH);
if (slashIndex == -1 || slashIndex >= token.length() - 1)
throw new ProblemReadingHeaderException("invalid feature token");
String versionS = token.substring(slashIndex + 1);
try {
return Float.parseFloat(versionS);
} catch (NumberFormatException bad) {
throw new ProblemReadingHeaderException(bad);
}
}
/** Utility for extracting a value from a K=V string. */
public static String parseValue(String keyValuePair) throws IOException {
int equalIndex = keyValuePair.indexOf("=");
if (equalIndex == -1 || equalIndex >= keyValuePair.length() - 1)
throw new IOException("invalid keyValuePair: " + keyValuePair);
return keyValuePair.substring(equalIndex + 1).trim();
}
/**
* Utility method for getting the date value for the "Date" header in
* standard format.
*
* @return the current date as a standardized date string -- see RFC 2616
* section 14.18
*/
public static String getDateValue() {
DateFormat df = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", Locale.US);
df.setTimeZone(TimeZone.getTimeZone("GMT"));
return df.format(new Date());
}
/**
* Encodes a name using URLEncoder, using %20 instead of + for spaces.
*/
public static String encode(String name, String encoding) throws IOException {
return StringUtils.replace(URLEncoder.encode(name, encoding), "+", "%20");
}
}