http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/fa4736b6/juneau-core/src/main/java/org/apache/juneau/http/ContentLocation.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/http/ContentLocation.java 
b/juneau-core/src/main/java/org/apache/juneau/http/ContentLocation.java
new file mode 100644
index 0000000..d8b19f4
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/http/ContentLocation.java
@@ -0,0 +1,72 @@
+// 
***************************************************************************************************************************
+// * 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.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.http;
+
+/**
+ * Represents a parsed <l>Content-Location</l> HTTP response header.
+ * <p>
+ * An alternate location for the returned data.
+ *
+ * <h6 class='figure'>Example</h6>
+ * <p class='bcode'>
+ *     Content-Location: /index.htm
+ * </p>
+ *
+ * <h6 class='topic'>RFC2616 Specification</h6>
+ *
+ * The Content-Location entity-header field MAY be used to supply the resource 
location for the entity enclosed in the
+ * message when that entity is accessible from a location separate from the 
requested resource's URI.
+ * A server SHOULD provide a Content-Location for the variant corresponding to 
the response entity; especially in the
+ * case where a resource has multiple entities associated with it, and those 
entities actually have separate locations
+ * by which they might be individually accessed, the server SHOULD provide a 
Content-Location for the particular variant
+ * which is returned.
+ * <p class='bcode'>
+ *     Content-Location = "Content-Location" ":"
+ *                        ( absoluteURI | relativeURI )
+ * </p>
+ * <p>
+ * The value of Content-Location also defines the base URI for the entity.
+ * <p>
+ * The Content-Location value is not a replacement for the original requested 
URI; it is only a statement of the
+ * location of the resource corresponding to this particular entity at the 
time of the request.
+ * Future requests MAY specify the Content-Location URI as the request- URI if 
the desire is to identify the source of
+ * that particular entity.
+ * <p>
+ * A cache cannot assume that an entity with a Content-Location different from 
the URI used to retrieve it can be used
+ * to respond to later requests on that Content-Location URI.
+ * However, the Content- Location can be used to differentiate between 
multiple entities retrieved from a single
+ * requested resource, as described in section 13.6.
+ * <p>
+ * If the Content-Location is a relative URI, the relative URI is interpreted 
relative to the Request-URI.
+ * <p>
+ * The meaning of the Content-Location header in PUT or POST requests is 
undefined; servers are free to ignore it in
+ * those cases.
+ */
+public final class ContentLocation extends HeaderUri {
+
+       /**
+        * Returns a parsed <code>Content-Location</code> header.
+        *
+        * @param value The <code>Content-Location</code> header string.
+        * @return The parsed <code>Content-Location</code> header, or 
<jk>null</jk> if the string was null.
+        */
+       public static ContentLocation forString(String value) {
+               if (value == null)
+                       return null;
+               return new ContentLocation(value);
+       }
+
+       private ContentLocation(String value) {
+               super(value);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/fa4736b6/juneau-core/src/main/java/org/apache/juneau/http/ContentRange.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/http/ContentRange.java 
b/juneau-core/src/main/java/org/apache/juneau/http/ContentRange.java
new file mode 100644
index 0000000..d437b3b
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/http/ContentRange.java
@@ -0,0 +1,126 @@
+// 
***************************************************************************************************************************
+// * 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.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.http;
+
+/**
+ * Represents a parsed <l>Content-Range</l> HTTP response header.
+ * <p>
+ * Where in a full body message this partial message belongs.
+ *
+ * <h6 class='figure'>Example</h6>
+ * <p class='bcode'>
+ *     Content-Range: bytes 21010-47021/47022
+ * </p>
+ *
+ * <h6 class='topic'>RFC2616 Specification</h6>
+ * The Content-Range entity-header is sent with a partial entity-body to 
specify where in the full entity-body the
+ * partial body should be applied.
+ * Range units are defined in section 3.12.
+ * <p class='bcode'>
+ *     Content-Range = "Content-Range" ":" content-range-spec
+ *     content-range-spec      = byte-content-range-spec
+ *     byte-content-range-spec = bytes-unit SP
+ *                               byte-range-resp-spec "/"
+ *                               ( instance-length | "*" )
+ *     byte-range-resp-spec = (first-byte-pos "-" last-byte-pos)
+ *                                    | "*"
+ *     instance-length           = 1*DIGIT
+ * </p>
+ * <p>
+ * The header SHOULD indicate the total length of the full entity-body, unless 
this length is unknown or difficult to
+ * determine.
+ * The asterisk "*" character means that the instance-length is unknown at the 
time when the response was generated.
+ * <p>
+ * Unlike byte-ranges-specifier values (see section 14.35.1), a byte- 
range-resp-spec MUST only specify one range, and
+ * MUST contain absolute byte positions for both the first and last byte of 
the range.
+ * <p>
+ * A byte-content-range-spec with a byte-range-resp-spec whose last- byte-pos 
value is less than its first-byte-pos
+ * value, or whose instance-length value is less than or equal to its 
last-byte-pos value, is invalid.
+ * The recipient of an invalid byte-content-range- spec MUST ignore it and any 
content transferred along with it.
+ * <p>
+ * A server sending a response with status code 416 (Requested range not 
satisfiable) SHOULD include a Content-Range
+ * field with a byte-range- resp-spec of "*".
+ * The instance-length specifies the current length of the selected resource.
+ * A response with status code 206 (Partial Content) MUST NOT include a 
Content-Range field with a byte-range-resp-spec
+ * of "*".
+ * <p>
+ * Examples of byte-content-range-spec values, assuming that the entity 
contains a total of 1234 bytes:
+ * <p class='bcode'>
+ *     The first 500 bytes:
+ *      bytes 0-499/1234
+ *     The second 500 bytes:
+ *      bytes 500-999/1234
+ *     All except for the first 500 bytes:
+ *      bytes 500-1233/1234
+ *     The last 500 bytes:
+ *      bytes 734-1233/1234
+ * </p>
+ * <p>
+ * When an HTTP message includes the content of a single range (for example, a 
response to a request for a single range,
+ * or to a request for a set of ranges that overlap without any holes), this 
content is transmitted with a Content-Range
+ * header, and a Content-Length header showing the number of bytes actually 
transferred.
+ * For example:
+ * <p class='bcode'>
+ *     HTTP/1.1 206 Partial content
+ *     Date: Wed, 15 Nov 1995 06:25:24 GMT
+ *     Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
+ *     Content-Range: bytes 21010-47021/47022
+ *     Content-Length: 26012
+ *     Content-Type: image/gif
+ * </p>
+ * <p>
+ * When an HTTP message includes the content of multiple ranges (for example, 
a response to a request for multiple
+ * non-overlapping ranges), these are transmitted as a multipart message.
+ * The multipart media type used for this purpose is "multipart/byteranges" as 
defined in appendix 19.2.
+ * See appendix 19.6.3 for a compatibility issue.
+ * <p>
+ * A response to a request for a single range MUST NOT be sent using the 
multipart/byteranges media type.
+ * A response to a request for multiple ranges, whose result is a single 
range, MAY be sent as a multipart/byteranges
+ * media type with one part.
+ * A client that cannot decode a multipart/byteranges message MUST NOT ask for 
multiple byte-ranges in a single request.
+ * <p>
+ * When a client requests multiple byte-ranges in one request, the server 
SHOULD return them in the order that they
+ * appeared in the request.
+ * <p>
+ * If the server ignores a byte-range-spec because it is syntactically 
invalid, the server SHOULD treat the request as
+ * if the invalid Range header field did not exist.
+ * (Normally, this means return a 200 response containing the full entity).
+ * <p>
+ * If the server receives a request (other than one including an If- Range 
request-header field) with an unsatisfiable
+ * Range request- header field
+ * (that is, all of whose byte-range-spec values have a first-byte-pos value 
greater than the current length of the
+ * selected resource),
+ * it SHOULD return a response code of 416 (Requested range not satisfiable) 
(section 10.4.17).
+ * <p>
+ * Note: clients cannot depend on servers to send a 416 (Requested range not 
satisfiable) response instead of a 200 (OK)
+ * response for
+ * an unsatisfiable Range request-header, since not all servers implement this 
request-header.
+ */
+public final class ContentRange extends HeaderString {
+
+       /**
+        * Returns a parsed <code>Content-Range</code> header.
+        *
+        * @param value The <code>Content-Range</code> header string.
+        * @return The parsed <code>Content-Range</code> header, or 
<jk>null</jk> if the string was null.
+        */
+       public static ContentRange forString(String value) {
+               if (value == null)
+                       return null;
+               return new ContentRange(value);
+       }
+
+       private ContentRange(String value) {
+               super(value);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/fa4736b6/juneau-core/src/main/java/org/apache/juneau/http/ContentType.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/http/ContentType.java 
b/juneau-core/src/main/java/org/apache/juneau/http/ContentType.java
index fcf48d8..f2a0dd4 100644
--- a/juneau-core/src/main/java/org/apache/juneau/http/ContentType.java
+++ b/juneau-core/src/main/java/org/apache/juneau/http/ContentType.java
@@ -12,56 +12,54 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.http;
 
-import java.util.concurrent.*;
+import static org.apache.juneau.http.Constants.*;
+
+import org.apache.juneau.internal.*;
 
 /**
- * Represents a parsed <code>Content-Type:</code> HTTP header.
+ * Represents a parsed <l>Content-Type</l> HTTP request/response header.
  * <p>
- * The formal RFC2616 header field definition is as follows:
- * <p class='bcode'>
- *     14.17 Content-Type
+ * The MIME type of this content.
  *
- *     The Content-Type entity-header field indicates the media type of the
- *     entity-body sent to the recipient or, in the case of the HEAD method,
- *     the media type that would have been sent had the request been a GET.
- *
- *             Content-Type   = "Content-Type" ":" media-type
+ * <h6 class='figure'>Example</h6>
+ * <p class='bcode'>
+ *     Content-Type: text/html; charset=utf-8
+ * </p>
  *
- *     Media types are defined in section 3.7. An example of the field is
+ * <h6 class='topic'>RFC2616 Specification</h6>
  *
+ * The Content-Type entity-header field indicates the media type of the 
entity-body sent to the recipient or, in the
+ * case of the HEAD method, the media type that would have been sent had the 
request been a GET.
+ * <p class='bcode'>
+ *     Content-Type   = "Content-Type" ":" media-type
+ * </p>
+ * <p>
+ * Media types are defined in section 3.7.
+ * An example of the field is...
+ * <p class='bcode'>
  *     Content-Type: text/html; charset=ISO-8859-4
  * </p>
  */
 public class ContentType extends MediaType {
 
-       private static final boolean nocache = 
Boolean.getBoolean("juneau.http.ContentType.nocache");
-       private static final ConcurrentHashMap<String,ContentType> cache = new 
ConcurrentHashMap<String,ContentType>();
+       private static Cache<String,ContentType> cache = new 
Cache<String,ContentType>(NOCACHE, CACHE_MAX_SIZE);
 
        /**
         * Returns a parsed <code>Content-Type</code> header.
         *
-        * @param s The <code>Content-Type</code> header string.
+        * @param value The <code>Content-Type</code> header string.
         * @return The parsed <code>Content-Type</code> header, or 
<jk>null</jk> if the string was null.
         */
-       public static ContentType forString(String s) {
-               if (s == null)
+       public static ContentType forString(String value) {
+               if (value == null)
                        return null;
-
-               // Prevent OOM in case of DDOS
-               if (cache.size() > 1000)
-                       cache.clear();
-
-               while (true) {
-                       ContentType mt = cache.get(s);
-                       if (mt != null)
-                               return mt;
-                       mt = new ContentType(s);
-                       if (nocache)
-                               return mt;
-                       cache.putIfAbsent(s, mt);
-               }
+               ContentType ct = cache.get(value);
+               if (ct == null)
+                       ct = cache.put(value, new ContentType(value));
+               return ct;
        }
 
+
        private ContentType(String s) {
                super(s);
        }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/fa4736b6/juneau-core/src/main/java/org/apache/juneau/http/Date.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/http/Date.java 
b/juneau-core/src/main/java/org/apache/juneau/http/Date.java
new file mode 100644
index 0000000..21a0ba7
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/http/Date.java
@@ -0,0 +1,83 @@
+// 
***************************************************************************************************************************
+// * 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.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.http;
+
+/**
+ * Represents a parsed <l>Date</l> HTTP request/response header.
+ * <p>
+ * The date and time that the message was sent (in "HTTP-date" format as 
defined by RFC 7231).
+ *
+ * <h6 class='figure'>Example</h6>
+ * <p class='bcode'>
+ *     Date: Tue, 15 Nov 1994 08:12:31 GMT
+ * </p>
+ *
+ * <h6 class='topic'>RFC2616 Specification</h6>
+ *
+ * The Date general-header field represents the date and time at which the 
message was originated, having the same
+ * semantics as orig-date in RFC 822.
+ * The field value is an HTTP-date, as described in section 3.3.1; it MUST be 
sent in RFC 1123 [8]-date format.
+ * <p class='bcode'>
+ *     Date  = "Date" ":" HTTP-date
+ * </p>
+ * <p>
+ * An example is...
+ * <p class='bcode'>
+ *     Date: Tue, 15 Nov 1994 08:12:31 GMT
+ * </p>
+ * <p>
+ * Origin servers MUST include a Date header field in all responses, except in 
these cases:
+ * <ol>
+ *     <li>If the response status code is 100 (Continue) or 101 (Switching 
Protocols), the response MAY include a Date
+ * header field, at the server's option.
+ *     <li>If the response status code conveys a server error, e.g. 500 
(Internal Server Error) or 503 (Service
+ * Unavailable), and it is inconvenient or impossible to generate a valid Date.
+ *     <li>If the server does not have a clock that can provide a reasonable 
approximation of the current time, its
+ * responses MUST NOT include a Date header field.
+ *             In this case, the rules in section 14.18.1 MUST be followed.
+ * </ol>
+ * A received message that does not have a Date header field MUST be assigned 
one by the recipient if the message will
+ * be cached by that recipient or gatewayed via a protocol which requires a 
Date.
+ * An HTTP implementation without a clock MUST NOT cache responses without 
revalidating them on every use.
+ * An HTTP cache, especially a shared cache, SHOULD use a mechanism, such as 
NTP, to synchronize its clock with a
+ * reliable external standard.
+ * <p>
+ * Clients SHOULD only send a Date header field in messages that include an 
entity-body, as in the case of the PUT and
+ * POST requests, and even then it is optional.
+ * A client without a clock MUST NOT send a Date header field in a request.
+ * <p>
+ * The HTTP-date sent in a Date header SHOULD NOT represent a date and time 
subsequent to the generation of the message.
+ * It SHOULD represent the best available approximation of the date and time 
of message generation, unless the
+ * implementation has no means of generating a reasonably accurate date and 
time.
+ * In theory, the date ought to represent the moment just before the entity is 
generated.
+ * In practice, the date can be generated at any time during the message 
origination without affecting its semantic
+ * value.
+ */
+public final class Date extends HeaderDate {
+
+       /**
+        * Returns a parsed <code>Date</code> header.
+        *
+        * @param value The <code>Date</code> header string.
+        * @return The parsed <code>Date</code> header, or <jk>null</jk> if the 
string was null.
+        */
+       public static Date forString(String value) {
+               if (value == null)
+                       return null;
+               return new Date(value);
+       }
+
+       private Date(String value) {
+               super(value);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/fa4736b6/juneau-core/src/main/java/org/apache/juneau/http/ETag.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/http/ETag.java 
b/juneau-core/src/main/java/org/apache/juneau/http/ETag.java
new file mode 100644
index 0000000..782e2bd
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/http/ETag.java
@@ -0,0 +1,58 @@
+// 
***************************************************************************************************************************
+// * 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.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.http;
+
+/**
+ * Represents a parsed <l>ETag</l> HTTP response header.
+ * <p>
+ * An identifier for a specific version of a resource, often a message digest.
+ *
+ * <h6 class='figure'>Example</h6>
+ * <p class='bcode'>
+ *     ETag: "737060cd8c284d8af7ad3082f209582d"
+ * </p>
+ *
+ * <h6 class='topic'>RFC2616 Specification</h6>
+ *
+ * The ETag response-header field provides the current value of the entity tag 
for the requested variant.
+ * The headers used with entity tags are described in sections 14.24, 14.26 
and 14.44.
+ * The entity tag MAY be used for comparison with other entities from the same 
resource (see section 13.3.3).
+ * <p class='bcode'>
+ *     ETag = "ETag" ":" entity-tag
+ * </p>
+ * <p>
+ * Examples:
+ * <p class='bcode'>
+ *     ETag: "xyzzy"
+ *     ETag: W/"xyzzy"
+ *     ETag: ""
+ * </p>
+ */
+public final class ETag extends HeaderString {
+
+       /**
+        * Returns a parsed <code>ETag</code> header.
+        *
+        * @param value The <code>ETag</code> header string.
+        * @return The parsed <code>ETag</code> header, or <jk>null</jk> if the 
string was null.
+        */
+       public static ETag forString(String value) {
+               if (value == null)
+                       return null;
+               return new ETag(value);
+       }
+
+       private ETag(String value) {
+               super(value);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/fa4736b6/juneau-core/src/main/java/org/apache/juneau/http/EntityValidator.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/http/EntityValidator.java 
b/juneau-core/src/main/java/org/apache/juneau/http/EntityValidator.java
new file mode 100644
index 0000000..7dbb73d
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/http/EntityValidator.java
@@ -0,0 +1,72 @@
+// 
***************************************************************************************************************************
+// * 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.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.http;
+
+/**
+ * Represents a validator value.
+ * <p>
+ * <h6 class='figure'>Example</h6>
+ * <p class='bcode'>
+ *     ETag: "123456789"    – A strong ETag validator
+ *     ETag: W/"123456789"  – A weak ETag validator
+ * </p>
+ */
+public class EntityValidator {
+
+       private final String value;
+       private final boolean isWeak;
+
+       /**
+        * Constructor.
+        *
+        * @param value The validator string value.
+        */
+       protected EntityValidator(String value) {
+               value = value.trim();
+               isWeak = value.startsWith("W/");
+               if (isWeak)
+                       value = value.substring(2);
+               if (value.length() > 1 && value.charAt(0) == '"' && 
value.charAt(value.length()-1) == '"')
+                       value = value.substring(1, value.length()-1);
+               this.value = value;
+       }
+
+       /**
+        * Returns the validator value stripped of quotes and weak tag.
+        * @return The validator value.
+        */
+       public String asString() {
+               return value;
+       }
+
+       /**
+        * Returns <jk>true</jk> if the weak flag is present in the value.
+        * @return <jk>true</jk> if the weak flag is present in the value.
+        */
+       public boolean isWeak() {
+               return isWeak;
+       }
+
+       /**
+        * Returns <jk>true</jk> if the validator string value is 
<code>*</code>.
+        * @return <jk>true</jk> if the validator string value is 
<code>*</code>.
+        */
+       public boolean isAny() {
+               return "*".equals(value);
+       }
+
+       @Override
+       public String toString() {
+               return (isWeak ? "W/" : "") + (isAny() ? "*" : ('"' + value + 
'"'));
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/fa4736b6/juneau-core/src/main/java/org/apache/juneau/http/Expect.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/http/Expect.java 
b/juneau-core/src/main/java/org/apache/juneau/http/Expect.java
new file mode 100644
index 0000000..e5e6910
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/http/Expect.java
@@ -0,0 +1,73 @@
+// 
***************************************************************************************************************************
+// * 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.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.http;
+
+/**
+ * Represents a parsed <l>Expect</l> HTTP request header.
+ * <p>
+ * Indicates that particular server behaviors are required by the client.
+ *
+ * <h6 class='figure'>Example</h6>
+ * <p class='bcode'>
+ *     Expect: 100-continue
+ * </p>
+ *
+ * <h6 class='topic'>RFC2616 Specification</h6>
+ *
+ * The Expect request-header field is used to indicate that particular server 
behaviors are required by the client.
+ * <p class='bcode'>
+ *     Expect       =  "Expect" ":" 1#expectation
+ *     expectation  =  "100-continue" | expectation-extension
+ *     expectation-extension =  token [ "=" ( token | quoted-string )
+ *                              *expect-params ]
+ *     expect-params =  ";" token [ "=" ( token | quoted-string ) ]
+ * </p>
+ * <p>
+ * A server that does not understand or is unable to comply with any of the 
expectation values in the Expect field of a
+ * request MUST respond with appropriate error status.
+ * The server MUST respond with a 417 (Expectation Failed) status if any of 
the expectations cannot be met or, if there
+ * are other problems with the request, some other 4xx status.
+ * <p>
+ * This header field is defined with extensible syntax to allow for future 
extensions.
+ * If a server receives a request containing an Expect field that includes an 
expectation-extension that it does not
+ * support, it MUST respond with a 417 (Expectation Failed) status.
+ * <p>
+ * Comparison of expectation values is case-insensitive for unquoted tokens 
(including the 100-continue token), and is
+ * case-sensitive for quoted-string expectation-extensions.
+ * <p>
+ * The Expect mechanism is hop-by-hop: that is, an HTTP/1.1 proxy MUST return 
a 417 (Expectation Failed) status if it
+ * receives a request with an expectation that it cannot meet.
+ * However, the Expect request-header itself is end-to-end; it MUST be 
forwarded if the request is forwarded.
+ * <p>
+ * Many older HTTP/1.0 and HTTP/1.1 applications do not understand the Expect 
header.
+ * <p>
+ * See section 8.2.3 for the use of the 100 (continue) status.
+ */
+public final class Expect extends HeaderString {
+
+       /**
+        * Returns a parsed <code>Expect</code> header.
+        *
+        * @param value The <code>Expect</code> header string.
+        * @return The parsed <code>Expect</code> header, or <jk>null</jk> if 
the string was null.
+        */
+       public static Expect forString(String value) {
+               if (value == null)
+                       return null;
+               return new Expect(value);
+       }
+
+       private Expect(String value) {
+               super(value);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/fa4736b6/juneau-core/src/main/java/org/apache/juneau/http/Expires.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/http/Expires.java 
b/juneau-core/src/main/java/org/apache/juneau/http/Expires.java
new file mode 100644
index 0000000..1d6cfe8
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/http/Expires.java
@@ -0,0 +1,80 @@
+// 
***************************************************************************************************************************
+// * 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.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.http;
+
+/**
+ * Represents a parsed <l>Expires</l> HTTP response header.
+ * <p>
+ * Gives the date/time after which the response is considered stale (in 
"HTTP-date" format as defined by RFC 7231).
+ *
+ * <h6 class='figure'>Example</h6>
+ * <p class='bcode'>
+ *     Expires: Thu, 01 Dec 1994 16:00:00 GMT
+ * </p>
+ *
+ * <h6 class='topic'>RFC2616 Specification</h6>
+ * The Expires entity-header field gives the date/time after which the 
response is considered stale.
+ * A stale cache entry may not normally be returned by a cache (either a proxy 
cache or a user agent cache) unless it is
+ * first validated with the origin server
+ * (or with an intermediate cache that has a fresh copy of the entity).
+ * See section 13.2 for further discussion of the expiration model.
+ * <p>
+ * The presence of an Expires field does not imply that the original resource 
will change or cease to exist at, before,
+ * or after that time.
+ * <p>
+ * The format is an absolute date and time as defined by HTTP-date in section 
3.3.1; it MUST be in RFC 1123 date format:
+ * <p class='bcode'>
+ *     Expires = "Expires" ":" HTTP-date
+ * </p>
+ * <p>
+ * An example of its use is...
+ * <p class='bcode'>
+ *     Expires: Thu, 01 Dec 1994 16:00:00 GMT
+ * </p>
+ * <p>
+ * Note: if a response includes a Cache-Control field with the max-age 
directive (see section 14.9.3), that directive
+ * overrides the Expires field.
+ * <p>
+ * HTTP/1.1 clients and caches MUST treat other invalid date formats, 
especially including the value "0", as in the past
+ * (i.e., "already expired").
+ * <p>
+ * To mark a response as "already expired," an origin server sends an Expires 
date that is equal to the Date header
+ * value.
+ * (See the rules for expiration calculations in section 13.2.4.)
+ * <p>
+ * To mark a response as "never expires," an origin server sends an Expires 
date approximately one year from the time
+ * the response is sent.
+ * HTTP/1.1 servers SHOULD NOT send Expires dates more than one year in the 
future.
+ * <p>
+ * The presence of an Expires header field with a date value of some time in 
the future on a response that otherwise
+ * would by default be non-cacheable indicates that the response is cacheable, 
unless indicated otherwise by a
+ * Cache-Control header field (section 14.9).
+ */
+public final class Expires extends HeaderDate {
+
+       /**
+        * Returns a parsed <code>Expires</code> header.
+        *
+        * @param value The <code>Expires</code> header string.
+        * @return The parsed <code>Expires</code> header, or <jk>null</jk> if 
the string was null.
+        */
+       public static Expires forString(String value) {
+               if (value == null)
+                       return null;
+               return new Expires(value);
+       }
+
+       private Expires(String value) {
+               super(value);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/fa4736b6/juneau-core/src/main/java/org/apache/juneau/http/From.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/http/From.java 
b/juneau-core/src/main/java/org/apache/juneau/http/From.java
new file mode 100644
index 0000000..7ac0f7a
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/http/From.java
@@ -0,0 +1,72 @@
+// 
***************************************************************************************************************************
+// * 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.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.http;
+
+/**
+ * Represents a parsed <l>From</l> HTTP request header.
+ * <p>
+ * The email address of the user making the request.
+ *
+ * <h6 class='figure'>Example</h6>
+ * <p class='bcode'>
+ *     From: [email protected]
+ * </p>
+ *
+ * <h6 class='topic'>RFC2616 Specification</h6>
+ *
+ * The From request-header field, if given, SHOULD contain an Internet e-mail 
address for the human user who controls
+ * the requesting user agent.
+ * The address SHOULD be machine-usable, as defined by "mailbox" in RFC 822 
[9] as updated by RFC 1123 [8]:
+ * <p class='bcode'>
+ *     From   = "From" ":" mailbox
+ * </p>
+ * <p>
+ * An example is:
+ * <p class='bcode'>
+ *     From: [email protected]
+ * </p>
+ * <p>
+ * This header field MAY be used for logging purposes and as a means for 
identifying the source of invalid or unwanted
+ * requests.
+ * It SHOULD NOT be used as an insecure form of access protection.
+ * The interpretation of this field is that the request is being performed on 
behalf of the person given, who accepts
+ * responsibility for the method performed.
+ * In particular, robot agents SHOULD include this header so that the person 
responsible for running the robot can be
+ * contacted if problems occur on the receiving end.
+ * <p>
+ * The Internet e-mail address in this field MAY be separate from the Internet 
host which issued the request.
+ * For example, when a request is passed through a proxy the original issuer's 
address SHOULD be used.
+ * <p>
+ * The client SHOULD NOT send the From header field without the user's 
approval, as it might conflict with the user's
+ * privacy interests or their site's security policy.
+ * It is strongly recommended that the user be able to disable, enable, and 
modify the value of this field at any time
+ * prior to a request.
+ */
+public final class From extends HeaderString {
+
+       /**
+        * Returns a parsed <code>From</code> header.
+        *
+        * @param value The <code>From</code> header string.
+        * @return The parsed <code>From</code> header, or <jk>null</jk> if the 
string was null.
+        */
+       public static From forString(String value) {
+               if (value == null)
+                       return null;
+               return new From(value);
+       }
+
+       private From(String value) {
+               super(value);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/fa4736b6/juneau-core/src/main/java/org/apache/juneau/http/HeaderDate.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/http/HeaderDate.java 
b/juneau-core/src/main/java/org/apache/juneau/http/HeaderDate.java
new file mode 100644
index 0000000..fa2b0f0
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/http/HeaderDate.java
@@ -0,0 +1,51 @@
+// 
***************************************************************************************************************************
+// * 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.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.http;
+
+import org.apache.juneau.internal.*;
+
+/**
+ * Category of headers that consist of a single HTTP-date.
+ * <p>
+ * <h6 class='figure'>Example</h6>
+ * <p class='bcode'>
+ *     If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
+ * </p>
+ */
+public class HeaderDate {
+
+       private final java.util.Date date;
+       private final String raw;
+
+       /**
+        * Constructor.
+        * @param raw The raw header value.
+        */
+       protected HeaderDate(String raw) {
+               this.raw = raw;
+               this.date = DateUtils.parseDate(raw);
+       }
+
+       /**
+        * Returns this header value as a {@link java.util.Date}.
+        * @return This header value as a {@link java.util.Date}, or 
<jk>null</jk> if the header could not be parsed.
+        */
+       public java.util.Date asDate() {
+               return date;
+       }
+
+       @Override /* Object */
+       public String toString() {
+               return raw;
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/fa4736b6/juneau-core/src/main/java/org/apache/juneau/http/HeaderEntityValidator.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/http/HeaderEntityValidator.java 
b/juneau-core/src/main/java/org/apache/juneau/http/HeaderEntityValidator.java
new file mode 100644
index 0000000..c20591e
--- /dev/null
+++ 
b/juneau-core/src/main/java/org/apache/juneau/http/HeaderEntityValidator.java
@@ -0,0 +1,47 @@
+// 
***************************************************************************************************************************
+// * 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.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.http;
+
+/**
+ * Category of headers that consist of a single entity validator value.
+ * <p>
+ * <h6 class='figure'>Example</h6>
+ * <p class='bcode'>
+ *     ETag: "xyzzy"
+ * </p>
+ */
+public class HeaderEntityValidator {
+
+       private final EntityValidator value;
+
+       /**
+        * Constructor.
+        * @param value The raw header value.
+        */
+       protected HeaderEntityValidator(String value) {
+               this.value = new EntityValidator(value);
+       }
+
+       /**
+        * Returns this header value as a {@link EntityValidator} object.
+        * @return this header value as a {@link EntityValidator} object.
+        */
+       public EntityValidator asValidator() {
+               return value;
+       }
+
+       @Override /* Object */
+       public String toString() {
+               return value.toString();
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/fa4736b6/juneau-core/src/main/java/org/apache/juneau/http/HeaderEntityValidatorArray.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/http/HeaderEntityValidatorArray.java
 
b/juneau-core/src/main/java/org/apache/juneau/http/HeaderEntityValidatorArray.java
new file mode 100644
index 0000000..358492a
--- /dev/null
+++ 
b/juneau-core/src/main/java/org/apache/juneau/http/HeaderEntityValidatorArray.java
@@ -0,0 +1,55 @@
+// 
***************************************************************************************************************************
+// * 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.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.http;
+
+import org.apache.juneau.internal.*;
+
+/**
+ * Category of headers that consist of a comma-delimited list of entity 
validator values.
+ * <p>
+ * <h6 class='figure'>Example</h6>
+ * <p class='bcode'>
+ *     If-Match: "xyzzy"
+ *     If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
+ *     If-Match: *
+ * </p>
+ */
+public class HeaderEntityValidatorArray {
+
+       private final EntityValidator[] value;
+
+       /**
+        * Constructor.
+        * @param value The raw header value.
+        */
+       protected HeaderEntityValidatorArray(String value) {
+               String[] s = StringUtils.split(value, ',');
+               this.value = new EntityValidator[s.length];
+               for (int i = 0; i < s.length; i++) {
+                       this.value[i] = new EntityValidator(s[i]);
+               }
+       }
+
+       /**
+        * Returns this header value as an array of {@link EntityValidator} 
objects.
+        * @return this header value as an array of {@link EntityValidator} 
objects.
+        */
+       public EntityValidator[] asValidators() {
+               return value;
+       }
+
+       @Override /* Object */
+       public String toString() {
+               return StringUtils.join(value, ", ");
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/fa4736b6/juneau-core/src/main/java/org/apache/juneau/http/HeaderEnum.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/http/HeaderEnum.java 
b/juneau-core/src/main/java/org/apache/juneau/http/HeaderEnum.java
new file mode 100644
index 0000000..cccec8c
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/http/HeaderEnum.java
@@ -0,0 +1,70 @@
+// 
***************************************************************************************************************************
+// * 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.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.http;
+
+/**
+ * Category of headers that consist of a single enum value.
+ * <p>
+ * <h6 class='figure'>Example</h6>
+ * <p class='bcode'>
+ *     Accept-Ranges: bytes
+ * </p>
+ * @param <E> The enum type.
+ */
+public class HeaderEnum<E extends Enum<E>> {
+
+       private final String value;
+       private final E enumValue;
+
+       /**
+        * Constructor.
+        * @param value The raw header value.
+        * @param enumClass The enum class.
+        * @param def The default enum value if the value could not be parsed.
+        */
+       protected HeaderEnum(String value, Class<E> enumClass, E def) {
+               this.value = value;
+               E _enumValue = def;
+               try {
+                       _enumValue = Enum.valueOf(enumClass, 
value.toUpperCase());
+               } catch (Exception e) {
+                       _enumValue = def;
+               }
+               this.enumValue = _enumValue;
+       }
+
+       /**
+        * Returns <jk>true</jk> if the specified value is the same using 
{@link String#equalsIgnoreCase(String)}.
+        *
+        * @return <jk>true</jk> if the specified value is the same.
+        */
+       public E asEnum() {
+               return enumValue;
+       }
+
+       /**
+        * Returns this header as a simple string value.
+        * <p>
+        * Functionally equivalent to calling {@link #toString()}.
+        *
+        * @return This header as a simple string.
+        */
+       public String asString() {
+               return value;
+       }
+
+       @Override /* Object */
+       public String toString() {
+               return value == null ? "" : value;
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/fa4736b6/juneau-core/src/main/java/org/apache/juneau/http/HeaderInteger.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/http/HeaderInteger.java 
b/juneau-core/src/main/java/org/apache/juneau/http/HeaderInteger.java
new file mode 100644
index 0000000..5b23064
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/http/HeaderInteger.java
@@ -0,0 +1,59 @@
+// 
***************************************************************************************************************************
+// * 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.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.http;
+
+/**
+ * Category of headers that consist of a single integer value.
+ * <p>
+ * <h6 class='figure'>Example</h6>
+ * <p class='bcode'>
+ *     Age: 300
+ * </p>
+ */
+public class HeaderInteger {
+
+       private final int value;
+
+       /**
+        * Constructor.
+        * @param value The raw header value.
+        */
+       protected HeaderInteger(String value) {
+               int _value = 0;
+               try {
+                       _value = Integer.parseInt(value);
+               } catch (NumberFormatException e) {
+                       try {
+                               Long.parseLong(value);
+                               _value = Integer.MAX_VALUE;
+                       } catch (NumberFormatException e2) {}
+               }
+               this.value = _value;
+       }
+
+       /**
+        * Returns this header as a simple string value.
+        * <p>
+        * Functionally equivalent to calling {@link #toString()}.
+        *
+        * @return This header as a simple string.
+        */
+       public int asInt() {
+               return value;
+       }
+
+       @Override /* Object */
+       public String toString() {
+               return String.valueOf(value);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/fa4736b6/juneau-core/src/main/java/org/apache/juneau/http/HeaderRangeArray.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/http/HeaderRangeArray.java 
b/juneau-core/src/main/java/org/apache/juneau/http/HeaderRangeArray.java
new file mode 100644
index 0000000..0163957
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/http/HeaderRangeArray.java
@@ -0,0 +1,74 @@
+// 
***************************************************************************************************************************
+// * 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.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.http;
+
+import java.util.*;
+
+import org.apache.juneau.internal.*;
+
+/**
+ * Category of headers that consist of simple comma-delimited lists of strings 
with q-values.
+ * <p>
+ * <h6 class='figure'>Example</h6>
+ * <p class='bcode'>
+ *     Accept-Encoding: compress;q=0.5, gzip;q=1.0
+ * </p>
+ */
+public class HeaderRangeArray {
+
+       final StringRange[] typeRanges;
+       private final List<StringRange> typeRangesList;
+
+       /**
+        * Constructor.
+        * @param value The raw header value.
+        */
+       protected HeaderRangeArray(String value) {
+               this.typeRanges = StringRange.parse(value);
+               this.typeRangesList = 
Collections.unmodifiableList(Arrays.asList(typeRanges));
+       }
+
+       /**
+        * Given a list of type values, returns the best match for this header.
+        *
+        * @param types The types to match against.
+        * @return The index into the array of the best match, or 
<code>-1</code> if no suitable matches could be found.
+        */
+       public int findMatch(String[] types) {
+
+               // Type ranges are ordered by 'q'.
+               // So we only need to search until we've found a match.
+               for (StringRange mr : typeRanges)
+                       for (int i = 0; i < types.length; i++)
+                               if (mr.matches(types[i]))
+                                       return i;
+
+               return -1;
+       }
+
+       /**
+        * Returns the list of the types ranges that make up this header.
+        * <p>
+        * The types ranges in the list are sorted by their q-value in 
descending order.
+        *
+        * @return An unmodifiable list of type ranges.
+        */
+       public List<StringRange> asSimpleRanges() {
+               return typeRangesList;
+       }
+
+       @Override /* Object */
+       public String toString() {
+               return StringUtils.join(typeRanges, ',');
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/fa4736b6/juneau-core/src/main/java/org/apache/juneau/http/HeaderString.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/http/HeaderString.java 
b/juneau-core/src/main/java/org/apache/juneau/http/HeaderString.java
new file mode 100644
index 0000000..6e34304
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/http/HeaderString.java
@@ -0,0 +1,72 @@
+// 
***************************************************************************************************************************
+// * 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.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.http;
+
+import org.apache.juneau.internal.*;
+
+/**
+ * Category of headers that consist of a single string value.
+ * <p>
+ * <h6 class='figure'>Example</h6>
+ * <p class='bcode'>
+ *     Accept-Ranges: bytes
+ * </p>
+ */
+public class HeaderString {
+
+       final String value;
+
+       /**
+        * Constructor.
+        * @param value The raw header value.
+        */
+       protected HeaderString(String value) {
+               this.value = StringUtils.trim(value);
+       }
+
+       /**
+        * Returns <jk>true</jk> if the specified value is the same using 
{@link String#equalsIgnoreCase(String)}.
+        *
+        * @param compare The value to compare against.
+        * @return <jk>true</jk> if the specified value is the same.
+        */
+       public boolean eqIC(String compare) {
+               return value.equalsIgnoreCase(compare);
+       }
+
+       /**
+        * Returns <jk>true</jk> if the specified value is the same using 
{@link String#equals(Object)}.
+        *
+        * @param compare The value to compare against.
+        * @return <jk>true</jk> if the specified value is the same.
+        */
+       public boolean eq(String compare) {
+               return value.equals(compare);
+       }
+
+       /**
+        * Returns this header as a simple string value.
+        * <p>
+        * Functionally equivalent to calling {@link #toString()}.
+        *
+        * @return This header as a simple string.
+        */
+       public String asString() {
+               return value;
+       }
+
+       @Override /* Object */
+       public String toString() {
+               return value == null ? "" : value;
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/fa4736b6/juneau-core/src/main/java/org/apache/juneau/http/HeaderStringArray.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/http/HeaderStringArray.java 
b/juneau-core/src/main/java/org/apache/juneau/http/HeaderStringArray.java
new file mode 100644
index 0000000..803cd66
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/http/HeaderStringArray.java
@@ -0,0 +1,80 @@
+// 
***************************************************************************************************************************
+// * 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.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.http;
+
+import org.apache.juneau.internal.*;
+
+/**
+ * Category of headers that consist of a comma-delimited list of string values.
+ * <p>
+ * <h6 class='figure'>Example</h6>
+ * <p class='bcode'>
+ *     Allow: GET, PUT
+ * </p>
+ */
+public class HeaderStringArray {
+
+       private final String[] value;
+
+       /**
+        * Constructor.
+        * @param value The raw header value.
+        */
+       protected HeaderStringArray(String value) {
+               this.value = StringUtils.split(value, ',');
+       }
+
+       /**
+        * Returns this header as a simple string value.
+        * <p>
+        * Functionally equivalent to calling {@link #toString()}.
+        *
+        * @return This header as a simple string.
+        */
+       public String asString() {
+               return StringUtils.join(value, ',');
+       }
+
+       /**
+        * Returns <jk>true</jk> if this header contains the specified value.
+        *
+        * @param val The value to check for.
+        * @return <jk>true</jk> if this header contains the specified value.
+        */
+       public boolean contains(String val) {
+               if (val != null)
+                       for (String v : value)
+                               if (val.equals(v))
+                                       return true;
+               return false;
+       }
+
+       /**
+        * Returns <jk>true</jk> if this header contains the specified value 
using {@link String#equalsIgnoreCase(String)}.
+        *
+        * @param val The value to check for.
+        * @return <jk>true</jk> if this header contains the specified value.
+        */
+       public boolean containsIC(String val) {
+               if (val != null)
+                       for (String v : value)
+                               if (val.equalsIgnoreCase(v))
+                                       return true;
+               return false;
+       }
+
+       @Override /* Object */
+       public String toString() {
+               return asString();
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/fa4736b6/juneau-core/src/main/java/org/apache/juneau/http/HeaderUri.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/http/HeaderUri.java 
b/juneau-core/src/main/java/org/apache/juneau/http/HeaderUri.java
new file mode 100644
index 0000000..d38deb2
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/http/HeaderUri.java
@@ -0,0 +1,62 @@
+// 
***************************************************************************************************************************
+// * 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.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.http;
+
+import java.net.*;
+
+import org.apache.juneau.internal.*;
+
+/**
+ * Category of headers that consist of a single URL value.
+ * <p>
+ * <h6 class='figure'>Example</h6>
+ * <p class='bcode'>
+ *     Location: http://www.w3.org/pub/WWW/People.html
+ * </p>
+ */
+public class HeaderUri{
+
+       final String value;
+
+       /**
+        * Constructor.
+        * @param value The raw header value.
+        */
+       protected HeaderUri(String value) {
+               this.value = StringUtils.trim(value);
+       }
+
+       /**
+        * Returns this header as a {@link URI}.
+        * @return This header as a {@link URI}.
+        */
+       public URI asURI() {
+               return URI.create(toString());
+       }
+
+       /**
+        * Returns this header as a simple string value.
+        * <p>
+        * Functionally equivalent to calling {@link #toString()}.
+        *
+        * @return This header as a simple string.
+        */
+       public String asString() {
+               return value;
+       }
+
+       @Override /* Object */
+       public String toString() {
+               return value == null ? "" : value;
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/fa4736b6/juneau-core/src/main/java/org/apache/juneau/http/Host.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/http/Host.java 
b/juneau-core/src/main/java/org/apache/juneau/http/Host.java
new file mode 100644
index 0000000..cefac84
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/http/Host.java
@@ -0,0 +1,75 @@
+// 
***************************************************************************************************************************
+// * 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.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.http;
+
+/**
+ * Represents a parsed <l>Host</l> HTTP request header.
+ * <p>
+ * The domain name of the server (for virtual hosting), and the TCP port 
number on which the server is listening.
+ * The port number may be omitted if the port is the standard port for the 
service requested.
+ * Mandatory since HTTP/1.1.
+ *
+ * <h6 class='figure'>Example</h6>
+ * <p class='bcode'>
+ *     Host: en.wikipedia.org:8080
+ *     Host: en.wikipedia.org
+ * </p>
+ *
+ * <h6 class='topic'>RFC2616 Specification</h6>
+ *
+ * The Host request-header field specifies the Internet host and port number 
of the resource being requested, as
+ * obtained from the original URI given by the user or referring resource 
(generally an HTTP URL, as described in
+ * section 3.2.2).
+ * The Host field value MUST represent the naming authority of the origin 
server or gateway given by the original URL.
+ * This allows the origin server or gateway to differentiate between 
internally-ambiguous URLs, such as the root "/" URL
+ * of a server for multiple host names on a single IP address.
+ * <p class='bcode'>
+ *     Host = "Host" ":" host [ ":" port ] ; Section 3.2.2
+ * </p>
+ * <p>
+ * A "host" without any trailing port information implies the default port for 
the service requested (e.g., "80" for an
+ * HTTP URL).
+ * For example, a request on the origin server for 
<http://www.w3.org/pub/WWW/> would properly include:
+ * <p class='bcode'>
+ *     GET /pub/WWW/ HTTP/1.1
+ *     Host: www.w3.org
+ * </p>
+ * <p>
+ * A client MUST include a Host header field in all HTTP/1.1 request messages.
+ * If the requested URI does not include an Internet host name for the service 
being requested, then the Host header
+ * field MUST be given with an empty value.
+ * An HTTP/1.1 proxy MUST ensure that any request message it forwards does 
contain an appropriate Host header field that
+ * identifies the service being requested by the proxy.
+ * All Internet-based HTTP/1.1 servers MUST respond with a 400 (Bad Request) 
status code to any HTTP/1.1 request
+ * message which lacks a Host header field.
+ * <p>
+ * See sections 5.2 and 19.6.1.1 for other requirements relating to Host.
+ */
+public final class Host extends HeaderString {
+
+       /**
+        * Returns a parsed <code>Host</code> header.
+        *
+        * @param value The <code>Host</code> header string.
+        * @return The parsed <code>Host</code> header, or <jk>null</jk> if the 
string was null.
+        */
+       public static Host forString(String value) {
+               if (value == null)
+                       return null;
+               return new Host(value);
+       }
+
+       private Host(String value) {
+               super(value);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/fa4736b6/juneau-core/src/main/java/org/apache/juneau/http/IfMatch.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/http/IfMatch.java 
b/juneau-core/src/main/java/org/apache/juneau/http/IfMatch.java
new file mode 100644
index 0000000..a4aab7f
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/http/IfMatch.java
@@ -0,0 +1,90 @@
+// 
***************************************************************************************************************************
+// * 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.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.http;
+
+/**
+ * Represents a parsed <l>If-Match</l> HTTP request header.
+ * <p>
+ * Only perform the action if the client supplied entity matches the same 
entity on the server.
+ * This is mainly for methods like PUT to only update a resource if it has not 
been modified since the user last
+ * updated it.
+ *
+ * <h6 class='figure'>Example</h6>
+ * <p class='bcode'>
+ *     If-Match: "737060cd8c284d8af7ad3082f209582d"
+ * </p>
+ *
+ * <h6 class='topic'>RFC2616 Specification</h6>
+ *
+ * The If-Match request-header field is used with a method to make it 
conditional.
+ * A client that has one or more entities previously obtained from the 
resource can verify that one of those entities
+ * is current by including a list of their associated entity tags in the 
If-Match header field.
+ * Entity tags are defined in section 3.11.
+ * The purpose of this feature is to allow efficient updates of cached 
information with a minimum amount of transaction
+ * overhead.
+ * It is also used, on updating requests, to prevent inadvertent modification 
of the wrong version of a resource.
+ * As a special case, the value "*" matches any current entity of the resource.
+ * <p class='bcode'>
+ *     If-Match = "If-Match" ":" ( "*" | 1#entity-tag )
+ * </p>
+ * <p>
+ * If any of the entity tags match the entity tag of the entity that would 
have been returned in the response to a
+ * similar GET request (without the If-Match header) on that resource, or if 
"*" is given and any current entity exists
+ * for that resource, then the server MAY perform the requested method as if 
the If-Match header field did not exist.
+ * <p>
+ * A server MUST use the strong comparison function (see section 13.3.3) to 
compare the entity tags in If-Match.
+ * <p>
+ * If none of the entity tags match, or if "*" is given and no current entity 
exists, the server MUST NOT perform the
+ * requested method, and MUST return a 412 (Precondition Failed) response.
+ * This behavior is most useful when the client wants to prevent an updating 
method, such as PUT, from modifying a
+ * resource that has changed since the client last retrieved it.
+ * <p>
+ * If the request would, without the If-Match header field, result in anything 
other than a 2xx or 412 status, then the
+ * If-Match header MUST be ignored.
+ * <p>
+ * The meaning of "If-Match: *" is that the method SHOULD be performed if the 
representation selected by the origin
+ * server (or by a cache, possibly using the Vary mechanism, see section 
14.44) exists, and MUST NOT be performed if the
+ * representation does not exist.
+ * <p>
+ * A request intended to update a resource (e.g., a PUT) MAY include an 
If-Match header field to signal that the request
+ * method MUST NOT be applied if the entity corresponding to the If-Match 
value (a single entity tag) is no longer a
+ * representation of that resource.
+ * This allows the user to indicate that they do not wish the request to be 
successful if the resource has been changed
+ * without their knowledge.
+ * Examples:
+ * <p class='bcode'>
+ *     If-Match: "xyzzy"
+ *     If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
+ *     If-Match: *
+ * </p>
+ * The result of a request having both an If-Match header field and either an 
If-None-Match or an If-Modified-Since
+ * header fields is undefined by this specification.
+ */
+public final class IfMatch extends HeaderEntityValidatorArray {
+
+       /**
+        * Returns a parsed <code>If-Match</code> header.
+        *
+        * @param value The <code>If-Match</code> header string.
+        * @return The parsed <code>If-Match</code> header, or <jk>null</jk> if 
the string was null.
+        */
+       public static IfMatch forString(String value) {
+               if (value == null)
+                       return null;
+               return new IfMatch(value);
+       }
+
+       private IfMatch(String value) {
+               super(value);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/fa4736b6/juneau-core/src/main/java/org/apache/juneau/http/IfModifiedSince.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/http/IfModifiedSince.java 
b/juneau-core/src/main/java/org/apache/juneau/http/IfModifiedSince.java
new file mode 100644
index 0000000..28f1ef4
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/http/IfModifiedSince.java
@@ -0,0 +1,92 @@
+// 
***************************************************************************************************************************
+// * 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.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.http;
+
+/**
+ * Represents a parsed <l>If-Modified-Since</l> HTTP request header.
+ * <p>
+ * Allows a 304 Not Modified to be returned if content is unchanged.
+ *
+ * <h6 class='figure'>Example</h6>
+ * <p class='bcode'>
+ *     If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
+ * </p>
+ *
+ * <h6 class='topic'>RFC2616 Specification</h6>
+ *
+ * The If-Modified-Since request-header field is used with a method to make it 
conditional:
+ * if the requested variant has not been modified since the time specified in 
this field, an entity will not be returned
+ * from the server; instead, a 304 (not modified) response will be returned 
without any message-body.
+ * <p class='bcode'>
+ *     If-Modified-Since = "If-Modified-Since" ":" HTTP-date
+ * </p>
+ * <p>
+ * An example of the field is:
+ * <p class='bcode'>
+ *     If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
+ * </p>
+ * <p>
+ * A GET method with an If-Modified-Since header and no Range header requests 
that the identified entity be transferred
+ * only if it has been modified since the date given by the If-Modified-Since 
header.
+ * The algorithm for determining this includes the following cases:
+ * <ol>
+ *     <li>If the request would normally result in anything other than a 200 
(OK) status, or if the passed
+ *             If-Modified-Since date is invalid, the response is exactly the 
same as for a normal GET.
+ *             A date which is later than the server's current time is invalid.
+ *     <li>If the variant has been modified since the If-Modified-Since date, 
the response is exactly the same as for a
+ *             normal GET.
+ *     <li>If the variant has not been modified since a valid 
If-Modified-Since date, the server SHOULD return a 304
+ *             (Not Modified) response.
+ * </ol>
+ * The purpose of this feature is to allow efficient updates of cached 
information with a minimum amount of transaction
+ * overhead.
+ * <p>
+ * Note: The Range request-header field modifies the meaning of 
If-Modified-Since; see section 14.35 for full details.
+ * <p>
+ * Note: If-Modified-Since times are interpreted by the server, whose clock 
might not be synchronized with the client.
+ * <p>
+ * Note: When handling an If-Modified-Since header field, some servers will 
use an exact date comparison function,
+ * rather than a less-than function, for deciding whether to send a 304 (Not 
Modified) response.
+ * To get best results when sending an If-Modified-Since header field for 
cache validation, clients are
+ * advised to use the exact date string received in a previous Last-Modified 
header field whenever possible.
+ * <p>
+ * Note: If a client uses an arbitrary date in the If-Modified-Since header 
instead of a date taken from the
+ * Last-Modified header for the same request, the client should be aware of 
the fact that this date is interpreted in
+ * the server's understanding of time.
+ * The client should consider unsynchronized clocks and rounding problems due 
to the different encodings of time between
+ * the client and server.
+ * This includes the possibility of race conditions if the document has 
changed between the time it was first requested
+ * and the If-Modified-Since date of a subsequent request, and the possibility 
of clock-skew-related problems if the
+ * If-Modified-Since date is derived from the client's clock without 
correction to the server's clock.
+ * Corrections for different time bases between client and server are at best 
approximate due to network latency.
+ * The result of a request having both an If-Modified-Since header field and 
either an If-Match or an
+ * If-Unmodified-Since header fields is undefined by this specification.
+ */
+public final class IfModifiedSince extends HeaderDate {
+
+       /**
+        * Returns a parsed <code>If-Modified-Since</code> header.
+        *
+        * @param value The <code>If-Modified-Since</code> header string.
+        * @return The parsed <code>If-Modified-Since</code> header, or 
<jk>null</jk> if the string was null.
+        */
+       public static IfModifiedSince forString(String value) {
+               if (value == null)
+                       return null;
+               return new IfModifiedSince(value);
+       }
+
+       private IfModifiedSince(String value) {
+               super(value);
+       }
+}

Reply via email to