/**
* 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.
*/
import java.nio.charset.Charset;
import java.nio.charset.IllegalCharsetNameException;
import java.nio.charset.UnsupportedCharsetException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public final class HttpHeaderHelper {
public static final String ACCEPT_ENCODING = "Accept-Encoding";
public static final String CONTENT_TYPE = "Content-Type";
public static final String CONTENT_ID = "Content-ID";
public static final String CONTENT_ENCODING = "Content-Encoding";
public static final String CONTENT_TRANSFER_ENCODING = "Content-Transfer-Encoding";
public static final String COOKIE = "Cookie";
public static final String TRANSFER_ENCODING = "Transfer-Encoding";
public static final String CHUNKED = "chunked";
public static final String CONNECTION = "Connection";
public static final String CLOSE = "close";
public static final String AUTHORIZATION = "Authorization";
private static final Charset UTF8 = Charset.forName("utf-8");
private static Map<String, String> internalHeaders = new HashMap<String, String>();
private static Map<String, String> encodings = new ConcurrentHashMap<String, String>();
static {
internalHeaders.put("Accept-Encoding", "accept-encoding");
internalHeaders.put("Content-Encoding", "content-encoding");
internalHeaders.put("Content-Type", "content-type");
internalHeaders.put("Content-ID", "content-id");
internalHeaders.put("Content-Transfer-Encoding", "content-transfer-encoding");
internalHeaders.put("Transfer-Encoding", "transfer-encoding");
internalHeaders.put("Connection", "connection");
internalHeaders.put("authorization", "Authorization");
internalHeaders.put("soapaction", "SOAPAction");
internalHeaders.put("accept", "Accept");
}
private HttpHeaderHelper() {
}
public static List getHeader(Map<String, List<String>> headerMap, String key) {
return headerMap.get(getHeaderKey(key));
}
public static String getHeaderKey(String key) {
if (internalHeaders.containsKey(key)) {
return internalHeaders.get(key);
} else {
return key;
}
}
//helper to map the charsets that various things send in the http Content-Type header
//into something that is actually supported by Java and the Stax parsers and such.
public static String mapCharset(String enc) {
if (enc == null) {
return UTF8.name();
}
//older versions of tomcat don't properly parse ContentType headers with stuff
//after charset="UTF-8"
int idx = enc.indexOf(";");
if (idx != -1) {
enc = enc.substring(0, idx);
}
// Charsets can be quoted. But it's quite certain that they can't have escaped quoted or
// anything like that.
enc = enc.replace("\"", "").trim();
enc = enc.replace("'", "");
if ("".equals(enc)) {
return UTF8.name();
}
String newenc = encodings.get(enc);
if (newenc == null) {
try {
newenc = Charset.forName(enc).name();
} catch (IllegalCharsetNameException icne) {
return null;
} catch (UnsupportedCharsetException uce) {
return null;
}
encodings.put(enc, newenc);
}
return newenc;
}
}