Author: davsclaus Date: Thu Oct 18 05:36:28 2012 New Revision: 1399522 URL: http://svn.apache.org/viewvc?rev=1399522&view=rev Log: CAMEL-5710: Restlet should parse date headers using RFC-2822 date format.
Modified: camel/branches/camel-2.9.x/ (props changed) camel/branches/camel-2.9.x/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java Propchange: camel/branches/camel-2.9.x/ ------------------------------------------------------------------------------ Merged /camel/trunk:r1399519 Merged /camel/branches/camel-2.10.x:r1399520 Propchange: camel/branches/camel-2.9.x/ ------------------------------------------------------------------------------ Binary property 'svnmerge-integrated' - no diff available. Modified: camel/branches/camel-2.9.x/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java URL: http://svn.apache.org/viewvc/camel/branches/camel-2.9.x/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java?rev=1399522&r1=1399521&r2=1399522&view=diff ============================================================================== --- camel/branches/camel-2.9.x/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java (original) +++ camel/branches/camel-2.9.x/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java Thu Oct 18 05:36:28 2012 @@ -20,14 +20,16 @@ import java.io.File; import java.io.InputStream; import java.io.PrintWriter; import java.io.StringWriter; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; +import java.util.Locale; import java.util.Map; import javax.xml.transform.dom.DOMSource; import org.apache.camel.Exchange; import org.apache.camel.Message; -import org.apache.camel.NoTypeConversionAvailableException; import org.apache.camel.StringSource; import org.apache.camel.WrappedFile; import org.apache.camel.component.file.GenericFile; @@ -55,6 +57,7 @@ import org.slf4j.LoggerFactory; */ public class DefaultRestletBinding implements RestletBinding, HeaderFilterStrategyAware { private static final Logger LOG = LoggerFactory.getLogger(DefaultRestletBinding.class); + private static final String RFC_2822_DATE_PATTERN = "EEE, dd MMM yyyy HH:mm:ss Z"; private HeaderFilterStrategy headerFilterStrategy; public void populateExchangeFromRestletRequest(Request request, Response response, Exchange exchange) throws Exception { @@ -276,11 +279,15 @@ public class DefaultRestletBinding imple MessageHelper.copyHeaders(exchange.getIn(), exchange.getOut(), false); } - @SuppressWarnings("unchecked") - protected void setResponseHeader(Exchange exchange, org.restlet.Message message, String header, Object value) throws NoTypeConversionAvailableException { + protected void setResponseHeader(Exchange exchange, org.restlet.Message message, String header, Object value) { // put the header first message.getAttributes().put(header, value); + // there must be a value going forward + if (value == null) { + return; + } + // special for certain headers if (message.getEntity() != null) { if (header.equalsIgnoreCase(HeaderConstants.HEADER_EXPIRES)) { @@ -288,9 +295,14 @@ public class DefaultRestletBinding imple message.getEntity().setExpirationDate(((Calendar) value).getTime()); } else if (value instanceof Date) { message.getEntity().setExpirationDate((Date) value); - } else { - Date date = exchange.getContext().getTypeConverter().mandatoryConvertTo(Date.class, value); - message.getEntity().setExpirationDate(date); + } else if (value instanceof String) { + SimpleDateFormat format = new SimpleDateFormat(RFC_2822_DATE_PATTERN, Locale.ENGLISH); + try { + Date date = format.parse((String) value); + message.getEntity().setExpirationDate(date); + } catch (ParseException e) { + LOG.debug("Header {} with value {} cannot be converted as a Date. The value will be ignored.", HeaderConstants.HEADER_EXPIRES, value); + } } } @@ -299,9 +311,14 @@ public class DefaultRestletBinding imple message.getEntity().setModificationDate(((Calendar) value).getTime()); } else if (value instanceof Date) { message.getEntity().setModificationDate((Date) value); - } else { - Date date = exchange.getContext().getTypeConverter().mandatoryConvertTo(Date.class, value); - message.getEntity().setModificationDate(date); + } else if (value instanceof String) { + SimpleDateFormat format = new SimpleDateFormat(RFC_2822_DATE_PATTERN, Locale.ENGLISH); + try { + Date date = format.parse((String) value); + message.getEntity().setModificationDate(date); + } catch (ParseException e) { + LOG.debug("Header {} with value {} cannot be converted as a Date. The value will be ignored.", HeaderConstants.HEADER_LAST_MODIFIED, value); + } } } @@ -311,8 +328,12 @@ public class DefaultRestletBinding imple } else if (value instanceof Integer) { message.getEntity().setSize((Integer) value); } else { - Long num = exchange.getContext().getTypeConverter().mandatoryConvertTo(Long.class, value); - message.getEntity().setSize(num); + Long num = exchange.getContext().getTypeConverter().tryConvertTo(Long.class, value); + if (num != null) { + message.getEntity().setSize(num); + } else { + LOG.debug("Header {} with value {} cannot be converted as a Long. The value will be ignored.", HeaderConstants.HEADER_CONTENT_LENGTH, value); + } } } @@ -325,7 +346,7 @@ public class DefaultRestletBinding imple if (media != null) { message.getEntity().setMediaType(media); } else { - LOG.debug("Value {} cannot be converted as a MediaType. The value will be ignored.", value); + LOG.debug("Header {} with value {} cannot be converted as a MediaType. The value will be ignored.", HeaderConstants.HEADER_CONTENT_TYPE, value); } } }