protected ResponseBuilder setResponseBuilder(Message outMessage, Exchange exchange) throws Exception {
checkClientException(exchange.getOutMessage(), exchange.getOutMessage().getContent(Exception.class));
int status = (Integer)exchange.get(Message.RESPONSE_CODE);
ResponseBuilder currentResponseBuilder = JAXRSUtils.toResponseBuilder(status);
Message responseMessage = exchange.getInMessage() != null
? exchange.getInMessage() : exchange.getInFaultMessage();
// if there is no response message, we just send the response back directly
if (responseMessage == null) {
ResponseBuilder rb = currentResponseBuilder.clone();
state.setResponseBuilder(currentResponseBuilder);
return rb;
}
@SuppressWarnings("unchecked")
Map<String, List<String>> protocolHeaders =
(Map<String, List<String>>)responseMessage.get(Message.PROTOCOL_HEADERS);
for (Map.Entry<String, List<String>> entry : protocolHeaders.entrySet()) {
if (null == entry.getKey()) {
continue;
}
if (entry.getValue().size() > 0) {
if (HttpUtils.isDateRelatedHeader(entry.getKey())) {
currentResponseBuilder.header(entry.getKey(), entry.getValue().get(0));
continue;
}
for (String val : entry.getValue()) {
String[] values;
if (val == null || val.length() == 0) {
values = new String[]{""};
} else if (val.charAt(0) == '"' && val.charAt(val.length() - 1) == '"') {
// if the value starts with a quote and ends with a quote, we do a best
// effort attempt to determine what the individual values are.
values = parseQuotedHeaderValue(val);
} else {
boolean splitPossible = !(HttpHeaders.SET_COOKIE.equalsIgnoreCase(entry.getKey())
&& val.toUpperCase().contains(HttpHeaders.EXPIRES.toUpperCase()));
values = splitPossible ? val.split(",") : new String[]{val};
}
for (String s : values) {
String theValue = s.trim();
if (theValue.length() > 0) {
currentResponseBuilder.header(entry.getKey(), theValue);
}
}
}
}
}
InputStream mStream = responseMessage.getContent(InputStream.class);
currentResponseBuilder.entity(mStream);
ResponseBuilder rb = currentResponseBuilder.clone();
state.setResponseBuilder(currentResponseBuilder);
return rb;
}