in google-http-client/src/main/java/com/google/api/client/http/HttpHeaders.java [1129:1174]
void parseHeader(String headerName, String headerValue, ParseHeaderState state) {
List<Type> context = state.context;
ClassInfo classInfo = state.classInfo;
ArrayValueMap arrayValueMap = state.arrayValueMap;
StringBuilder logger = state.logger;
if (logger != null) {
logger.append(headerName + ": " + headerValue).append(StringUtils.LINE_SEPARATOR);
}
// use field information if available
FieldInfo fieldInfo = classInfo.getFieldInfo(headerName);
if (fieldInfo != null) {
Type type = Data.resolveWildcardTypeOrTypeVariable(context, fieldInfo.getGenericType());
// type is now class, parameterized type, or generic array type
if (Types.isArray(type)) {
// array that can handle repeating values
Class<?> rawArrayComponentType =
Types.getRawArrayComponentType(context, Types.getArrayComponentType(type));
arrayValueMap.put(fieldInfo.getField(), rawArrayComponentType,
parseValue(rawArrayComponentType, context, headerValue));
} else if (Types.isAssignableToOrFrom(
Types.getRawArrayComponentType(context, type), Iterable.class)) {
// iterable that can handle repeating values
@SuppressWarnings("unchecked")
Collection<Object> collection = (Collection<Object>) fieldInfo.getValue(this);
if (collection == null) {
collection = Data.newCollectionInstance(type);
fieldInfo.setValue(this, collection);
}
Type subFieldType = type == Object.class ? null : Types.getIterableParameter(type);
collection.add(parseValue(subFieldType, context, headerValue));
} else {
// parse value based on field type
fieldInfo.setValue(this, parseValue(type, context, headerValue));
}
} else {
// store header values in an array list
@SuppressWarnings("unchecked")
ArrayList<String> listValue = (ArrayList<String>) this.get(headerName);
if (listValue == null) {
listValue = new ArrayList<String>();
this.set(headerName, listValue);
}
listValue.add(headerValue);
}
}