in aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java [656:725]
protected List<HeaderValue> parseHeaderValue(String headerValue, String valueSeparator, String qualifierSeparator) {
// Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8
// Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5
// Cookie: name=value; name2=value2; name3=value3
// X-Custom-Header: YQ==
List<HeaderValue> values = new ArrayList<>();
if (headerValue == null) {
return values;
}
for (String curValue : headerValue.split(valueSeparator)) {
float curPreference = 1.0f;
HeaderValue newValue = new HeaderValue();
newValue.setRawValue(curValue);
for (String q : curValue.split(qualifierSeparator)) {
String[] kv = q.split(HEADER_KEY_VALUE_SEPARATOR, 2);
String key = null;
String val = null;
// no separator, set the value only
if (kv.length == 1) {
val = q.trim();
}
// we have a separator
if (kv.length == 2) {
// if the length of the value is 0 we assume that we are looking at a
// base64 encoded value with padding so we just set the value. This is because
// we assume that empty values in a key/value pair will contain at least a white space
if (kv[1].isEmpty()) {
val = q.trim();
}
// this was a base64 string with an additional = for padding, set the value only
if ("=".equals(kv[1].trim())) {
val = q.trim();
} else { // it's a proper key/value set both
key = kv[0].trim();
val = ("".equals(kv[1].trim()) ? null : kv[1].trim());
}
}
if (newValue.getValue() == null) {
newValue.setKey(key);
newValue.setValue(val);
} else {
// special case for quality q=
if ("q".equals(key)) {
curPreference = Float.parseFloat(val);
} else {
newValue.addAttribute(key, val);
}
}
}
newValue.setPriority(curPreference);
values.add(newValue);
}
// sort list by preference
values.sort((HeaderValue first, HeaderValue second) -> {
if ((first.getPriority() - second.getPriority()) < .001f) {
return 0;
}
if (first.getPriority() < second.getPriority()) {
return 1;
}
return -1;
});
return values;
}