You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2011/07/21 21:17:59 UTC

svn commit: r1149326 - in /httpcomponents/httpcore/trunk: httpcore-nio/src/main/java/org/apache/http/nio/entity/ httpcore-nio/src/test/java/org/apache/http/nio/protocol/ httpcore/src/main/java/org/apache/http/entity/ httpcore/src/main/java/org/apache/h...

Author: olegk
Date: Thu Jul 21 19:17:52 2011
New Revision: 1149326

URL: http://svn.apache.org/viewvc?rev=1149326&view=rev
Log:
Improved support for common operations involving Content-Type

Added:
    httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/ContentType.java   (with props)
    httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestContentType.java   (with props)
Modified:
    httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/entity/NFileEntity.java
    httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/entity/NStringEntity.java
    httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestThrottlingNHttpHandlers.java
    httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/FileEntity.java
    httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/InputStreamEntity.java
    httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/StringEntity.java
    httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/util/EntityUtils.java
    httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestEntityTemplate.java
    httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestFileEntity.java
    httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestStringEntity.java
    httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/protocol/TestProtocolIntegration.java
    httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/util/TestEntityUtils.java

Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/entity/NFileEntity.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/entity/NFileEntity.java?rev=1149326&r1=1149325&r2=1149326&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/entity/NFileEntity.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/entity/NFileEntity.java Thu Jul 21 19:17:52 2011
@@ -36,6 +36,7 @@ import java.nio.channels.FileChannel;
 
 import org.apache.http.annotation.NotThreadSafe;
 import org.apache.http.entity.AbstractHttpEntity;
+import org.apache.http.entity.ContentType;
 import org.apache.http.nio.ContentEncoder;
 import org.apache.http.nio.ContentEncoderChannel;
 import org.apache.http.nio.FileContentEncoder;
@@ -67,7 +68,37 @@ public class NFileEntity extends Abstrac
      * @param contentType the content type of the file.
      * @param useFileChannels flag whether the direct transfer from the file
      *   channel should be attempted.
+     *
+     * @since 4.2
      */
+    public NFileEntity(final File file, final ContentType contentType, boolean useFileChannels) {
+        if (file == null) {
+            throw new IllegalArgumentException("File may not be null");
+        }
+        this.file = file;
+        this.useFileChannels = useFileChannels;
+        if (contentType != null) {
+            setContentType(contentType.toString());
+        }
+    }
+
+    /**
+     * Creates new instance of NFileEntity from the given source {@link File}
+     * with the given content type.
+     *
+     * @param file the source file.
+     * @param contentType the content type of the file.
+     *
+     * @since 4.2
+     */
+    public NFileEntity(final File file, final ContentType contentType) {
+        this(file, contentType, true);
+    }
+
+    /**
+     * @deprecated use {@link #NFileEntity(File, ContentType, boolean)}
+     */
+    @Deprecated
     public NFileEntity(final File file, final String contentType, boolean useFileChannels) {
         if (file == null) {
             throw new IllegalArgumentException("File may not be null");
@@ -77,6 +108,10 @@ public class NFileEntity extends Abstrac
         setContentType(contentType);
     }
 
+    /**
+     * @deprecated use {@link #NFileEntity(File, ContentType)}
+     */
+    @Deprecated
     public NFileEntity(final File file, final String contentType) {
         this(file, contentType, true);
     }

Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/entity/NStringEntity.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/entity/NStringEntity.java?rev=1149326&r1=1149325&r2=1149326&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/entity/NStringEntity.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/entity/NStringEntity.java Thu Jul 21 19:17:52 2011
@@ -36,6 +36,7 @@ import java.nio.ByteBuffer;
 
 import org.apache.http.annotation.NotThreadSafe;
 import org.apache.http.entity.AbstractHttpEntity;
+import org.apache.http.entity.ContentType;
 import org.apache.http.nio.ContentEncoder;
 import org.apache.http.nio.IOControl;
 import org.apache.http.nio.protocol.AsyncNHttpServiceHandler;
@@ -55,21 +56,32 @@ public class NStringEntity extends Abstr
     protected final byte[] content;
     protected final ByteBuffer buffer;
 
-    public NStringEntity(final String s, String charset)
+    /**
+     * @since 4.2
+     */
+    public NStringEntity(final String s, final ContentType contentType)
             throws UnsupportedEncodingException {
         if (s == null) {
             throw new IllegalArgumentException("Source string may not be null");
         }
+        String charset = contentType != null ? contentType.getCharset() : null;
         if (charset == null) {
             charset = HTTP.DEFAULT_CONTENT_CHARSET;
         }
         this.content = s.getBytes(charset);
         this.buffer = ByteBuffer.wrap(this.content);
-        setContentType(HTTP.PLAIN_TEXT_TYPE + HTTP.CHARSET_PARAM + charset);
+        if (contentType != null) {
+            setContentType(contentType.toString());
+        }
+    }
+
+    public NStringEntity(final String s, final String charset)
+            throws UnsupportedEncodingException {
+        this(s, ContentType.create(HTTP.PLAIN_TEXT_TYPE, charset));
     }
 
     public NStringEntity(final String s) throws UnsupportedEncodingException {
-        this(s, null);
+        this(s, ContentType.DEFAULT_TEXT);
     }
 
     public boolean isRepeatable() {

Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestThrottlingNHttpHandlers.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestThrottlingNHttpHandlers.java?rev=1149326&r1=1149325&r2=1149326&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestThrottlingNHttpHandlers.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestThrottlingNHttpHandlers.java Thu Jul 21 19:17:52 2011
@@ -55,6 +55,7 @@ import org.apache.http.HttpResponse;
 import org.apache.http.HttpResponseInterceptor;
 import org.apache.http.HttpStatus;
 import org.apache.http.HttpVersion;
+import org.apache.http.entity.ContentType;
 import org.apache.http.entity.InputStreamEntity;
 import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.DefaultConnectionReuseStrategy;
@@ -68,6 +69,7 @@ import org.apache.http.nio.reactor.Liste
 import org.apache.http.nio.reactor.SessionRequest;
 import org.apache.http.params.CoreConnectionPNames;
 import org.apache.http.params.CoreProtocolPNames;
+import org.apache.http.protocol.HTTP;
 import org.apache.http.protocol.HttpContext;
 import org.apache.http.protocol.HttpExpectationVerifier;
 import org.apache.http.protocol.HttpProcessor;
@@ -85,7 +87,6 @@ import org.apache.http.protocol.Response
 import org.apache.http.testserver.SimpleEventListener;
 import org.apache.http.testserver.SimpleHttpRequestHandlerResolver;
 import org.apache.http.util.EncodingUtils;
-import org.apache.http.util.EntityUtils;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -892,8 +893,12 @@ public class TestThrottlingNHttpHandlers
                             Thread.sleep(1);
                             outstream.write(tmp, 0, l);
                         }
-                        content = new String(outstream.toByteArray(),
-                                EntityUtils.getContentCharSet(entity));
+                        ContentType contentType = ContentType.getOrDefault(entity);
+                        String charset = contentType.getCharset();
+                        if (charset == null) {
+                            charset = HTTP.DEFAULT_CONTENT_CHARSET;
+                        }
+                        content = new String(outstream.toByteArray(), charset);
                     } catch (InterruptedException ex) {
                         content = "Interrupted: " + ex.getMessage();
                     } catch (IOException ex) {

Added: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/ContentType.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/ContentType.java?rev=1149326&view=auto
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/ContentType.java (added)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/ContentType.java Thu Jul 21 19:17:52 2011
@@ -0,0 +1,194 @@
+/*
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.http.entity;
+
+import java.util.Locale;
+
+import org.apache.http.Header;
+import org.apache.http.HeaderElement;
+import org.apache.http.HttpEntity;
+import org.apache.http.NameValuePair;
+import org.apache.http.ParseException;
+import org.apache.http.annotation.Immutable;
+import org.apache.http.message.BasicHeaderValueParser;
+import org.apache.http.protocol.HTTP;
+
+/**
+ * Content type information consisting of a MIME type and an optional charset.
+ * <p/>
+ * This class makes no attempts to verify validity of mime-type and charset attributes.
+ * The input parameters of the {@link #create(String, String)} method, however, may not
+ * contain characters <">, <;>, <,> reserved by the HTTP specification.
+ *
+ * @since 4.2
+ */
+@Immutable
+public final class ContentType {
+
+    public static final ContentType DEFAULT_TEXT = new ContentType(
+            HTTP.PLAIN_TEXT_TYPE, HTTP.DEFAULT_CONTENT_CHARSET);
+    public static final ContentType DEFAULT_BINARY = new ContentType(
+            "application/octet-stream", null);
+
+    private final String mimeType;
+    private final String charset;
+
+    ContentType(final String mimeType, final String charset) {
+        super();
+        this.mimeType = mimeType;
+        this.charset = charset;
+    }
+
+    public String getMimeType() {
+        return this.mimeType;
+    }
+
+    public String getCharset() {
+        return this.charset;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder buf = new StringBuilder();
+        buf.append(this.mimeType);
+        if (this.charset != null) {
+            buf.append("; charset=");
+            buf.append(this.charset);
+        }
+        return buf.toString();
+    }
+
+    private static boolean valid(final String s) {
+        for (int i = 0; i < s.length(); i++) {
+            char ch = s.charAt(i);
+            if (ch == '"' || ch == ',' || ch == ';') {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Creates a new instance of {@link ContentType}.
+     *
+     * @param mimeType MIME type. It may not be <code>null</code> or empty. It may not contain
+     *        characters <">, <;>, <,> reserved by the HTTP specification.
+     * @param charset charset. It may not contain characters <">, <;>, <,> reserved by the HTTP
+     *        specification. This parameter is optional.
+     * @return content type
+     */
+    public static ContentType create(final String mimeType, final String charset) {
+        if (mimeType == null) {
+            throw new IllegalArgumentException("MIME type may not be null");
+        }
+        String type = mimeType.trim().toLowerCase(Locale.US);
+        if (type.length() == 0) {
+            throw new IllegalArgumentException("MIME type may not be empty");
+        }
+        if (!valid(type)) {
+            throw new IllegalArgumentException("MIME type may not contain reserved characters");
+        }
+        String cs = null;
+        if (charset != null) {
+            cs = charset.trim().toLowerCase(Locale.US);
+            if (!valid(cs)) {
+                throw new IllegalArgumentException("Charset may not contain reserved characters");
+            }
+        }
+        return new ContentType(type, cs);
+    }
+
+    private static ContentType create(final HeaderElement helem) {
+        String mimeType = helem.getName();
+        String charset = null;
+        NameValuePair param = helem.getParameterByName("charset");
+        if (param != null) {
+            charset = param.getValue();
+        }
+        return create(mimeType, charset);
+    }
+
+    /**
+     * Parses textual representation of <code>Content-Type</code> value.
+     *
+     * @param s text
+     * @return content type
+     * @throws ParseException if the given text does not represent a valid
+     * <code>Content-Type</code> value.
+     */
+    public static ContentType parse(final String s) throws ParseException {
+        if (s == null) {
+            throw new IllegalArgumentException("Content type may not be null");
+        }
+        HeaderElement[] elements = BasicHeaderValueParser.parseElements(s, null);
+        if (elements.length > 0) {
+            return create(elements[0]);
+        } else {
+            throw new ParseException("Invalid content type: " + s);
+        }
+    }
+
+    /**
+     * Extracts <code>Content-Type</code> value from {@link HttpEntity} exactly as
+     * specified by the <code>Content-Type</code> header of the entity. Returns <code>null</code>
+     * if not specified.
+     *
+     * @param entity HTTP entity
+     * @return content type
+     * @throws ParseException if the given text does not represent a valid
+     * <code>Content-Type</code> value.
+     */
+    public static ContentType get(final HttpEntity entity) throws ParseException {
+        if (entity == null) {
+            return null;
+        }
+        Header header = entity.getContentType();
+        if (header != null) {
+            HeaderElement[] elements = header.getElements();
+            if (elements.length > 0) {
+                return create(elements[0]);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Extracts <code>Content-Type</code> value from {@link HttpEntity} or returns default value
+     * if not explicitly specified.
+     *
+     * @param entity HTTP entity
+     * @return content type
+     * @throws ParseException if the given text does not represent a valid
+     * <code>Content-Type</code> value.
+     */
+    public static ContentType getOrDefault(final HttpEntity entity) throws ParseException {
+        ContentType contentType = get(entity);
+        return contentType != null ? contentType : DEFAULT_TEXT;
+    }
+
+}

Propchange: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/ContentType.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/ContentType.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/ContentType.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/FileEntity.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/FileEntity.java?rev=1149326&r1=1149325&r2=1149326&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/FileEntity.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/FileEntity.java Thu Jul 21 19:17:52 2011
@@ -45,6 +45,10 @@ public class FileEntity extends Abstract
 
     protected final File file;
 
+    /**
+     * @deprecated {@link #FileEntity(File, ContentType)}
+     */
+    @Deprecated
     public FileEntity(final File file, final String contentType) {
         super();
         if (file == null) {
@@ -54,6 +58,20 @@ public class FileEntity extends Abstract
         setContentType(contentType);
     }
 
+    /**
+     * @since 4.2
+     */
+    public FileEntity(final File file, final ContentType contentType) {
+        super();
+        if (file == null) {
+            throw new IllegalArgumentException("File may not be null");
+        }
+        this.file = file;
+        if (contentType != null) {
+            setContentType(contentType.toString());
+        }
+    }
+
     public boolean isRepeatable() {
         return true;
     }

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/InputStreamEntity.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/InputStreamEntity.java?rev=1149326&r1=1149325&r2=1149326&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/InputStreamEntity.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/InputStreamEntity.java Thu Jul 21 19:17:52 2011
@@ -48,12 +48,22 @@ public class InputStreamEntity extends A
     private final long length;
 
     public InputStreamEntity(final InputStream instream, long length) {
+        this(instream, length, null);
+    }
+
+    /**
+     * @since 4.2
+     */
+    public InputStreamEntity(final InputStream instream, long length, final ContentType contentType) {
         super();
         if (instream == null) {
             throw new IllegalArgumentException("Source input stream may not be null");
         }
         this.content = instream;
         this.length = length;
+        if (contentType != null) {
+            setContentType(contentType.toString());
+        }
     }
 
     public boolean isRepeatable() {

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/StringEntity.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/StringEntity.java?rev=1149326&r1=1149325&r2=1149326&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/StringEntity.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/entity/StringEntity.java Thu Jul 21 19:17:52 2011
@@ -48,6 +48,34 @@ public class StringEntity extends Abstra
     protected final byte[] content;
 
     /**
+     * Creates a StringEntity with the specified content and content type.
+     *
+     * @param string content to be used. Not {@code null}.
+     * @param contentType content type to be used. May be {@code null}, in which case the default
+     *   MIME type {@link HTTP#PLAIN_TEXT_TYPE} i.e. "text/plain" and the default charset
+     *   {@link HTTP#DEFAULT_CONTENT_CHARSET} i.e. "ISO-8859-1" are assumed.
+     *
+     * @since 4.2
+     *
+     * @throws IllegalArgumentException if the string parameter is null
+     */
+    public StringEntity(final String string, final ContentType contentType)
+            throws UnsupportedEncodingException {
+        super();
+        if (string == null) {
+            throw new IllegalArgumentException("Source string may not be null");
+        }
+        String charset = contentType != null ? contentType.getCharset() : null;
+        if (charset == null) {
+            charset = HTTP.DEFAULT_CONTENT_CHARSET;
+        }
+        this.content = string.getBytes(charset);
+        if (contentType != null) {
+            setContentType(contentType.toString());
+        }
+    }
+
+    /**
      * Creates a StringEntity with the specified content, mimetype and charset
      *
      * @param string content to be used. Not {@code null}.
@@ -56,7 +84,10 @@ public class StringEntity extends Abstra
      *
      * @since 4.1
      * @throws IllegalArgumentException if the string parameter is null
+     *
+     * @deprecated use {@link #StringEntity(String, ContentType)}
      */
+    @Deprecated
     public StringEntity(final String string, String mimeType, String charset)
             throws UnsupportedEncodingException {
         super();
@@ -79,13 +110,14 @@ public class StringEntity extends Abstra
      * The mime type defaults to {@link HTTP#PLAIN_TEXT_TYPE} i.e. "text/plain".
      *
      * @param string content to be used. Not {@code null}.
-     * @param charset character set to be used. May be {@code null}, in which case the default is {@link HTTP#DEFAULT_CONTENT_CHARSET} i.e. "ISO-8859-1"
+     * @param charset character set to be used. May be {@code null}, in which case the default
+     *   is {@link HTTP#DEFAULT_CONTENT_CHARSET} i.e. "ISO-8859-1"
      *
      * @throws IllegalArgumentException if the string parameter is null
      */
-    public StringEntity(final String string, String charset)
+    public StringEntity(final String string, final String charset)
             throws UnsupportedEncodingException {
-        this(string, null, charset);
+        this(string, ContentType.create(HTTP.PLAIN_TEXT_TYPE, charset));
     }
 
     /**
@@ -101,7 +133,7 @@ public class StringEntity extends Abstra
      */
     public StringEntity(final String string)
             throws UnsupportedEncodingException {
-        this(string, null);
+        this(string, ContentType.DEFAULT_TEXT);
     }
 
     public boolean isRepeatable() {

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/util/EntityUtils.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/util/EntityUtils.java?rev=1149326&r1=1149325&r2=1149326&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/util/EntityUtils.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/util/EntityUtils.java Thu Jul 21 19:17:52 2011
@@ -36,6 +36,7 @@ import org.apache.http.HeaderElement;
 import org.apache.http.HttpEntity;
 import org.apache.http.NameValuePair;
 import org.apache.http.ParseException;
+import org.apache.http.entity.ContentType;
 import org.apache.http.protocol.HTTP;
 
 /**
@@ -113,7 +114,10 @@ public final class EntityUtils {
      * @return the character set, or null if not found
      * @throws ParseException if header elements cannot be parsed
      * @throws IllegalArgumentException if entity is null
+     *
+     * @deprecated use {@link ContentType#getOrDefault(HttpEntity)}
      */
+    @Deprecated
     public static String getContentCharSet(final HttpEntity entity) throws ParseException {
         if (entity == null) {
             throw new IllegalArgumentException("HTTP entity may not be null");
@@ -140,7 +144,10 @@ public final class EntityUtils {
      * @throws IllegalArgumentException if entity is null
      *
      * @since 4.1
+     *
+     * @deprecated use {@link ContentType#getOrDefault(HttpEntity)}
      */
+    @Deprecated
     public static String getContentMimeType(final HttpEntity entity) throws ParseException {
         if (entity == null) {
             throw new IllegalArgumentException("HTTP entity may not be null");

Added: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestContentType.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestContentType.java?rev=1149326&view=auto
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestContentType.java (added)
+++ httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestContentType.java Thu Jul 21 19:17:52 2011
@@ -0,0 +1,142 @@
+/*
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.http.entity;
+
+import org.apache.http.Header;
+import org.apache.http.ParseException;
+import org.apache.http.entity.BasicHttpEntity;
+import org.apache.http.message.BasicHeader;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Unit tests for {@link ContentType}.
+ *
+ */
+public class TestContentType {
+
+    @Test
+    public void testBasis() throws Exception {
+        ContentType contentType = ContentType.create("text/plain", "ascii");
+        Assert.assertEquals("text/plain", contentType.getMimeType());
+        Assert.assertEquals("ascii", contentType.getCharset());
+        Assert.assertEquals("text/plain; charset=ascii", contentType.toString());
+    }
+
+    @Test
+    public void testLowCaseText() throws Exception {
+        ContentType contentType = ContentType.create("Text/Plain", "ASCII");
+        Assert.assertEquals("text/plain", contentType.getMimeType());
+        Assert.assertEquals("ascii", contentType.getCharset());
+    }
+
+    @Test
+    public void testCreateInvalidInput() throws Exception {
+        try {
+            ContentType.create(null, null);
+            Assert.fail("IllegalArgumentException should have been thrown");
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
+        try {
+            ContentType.create("  ", null);
+            Assert.fail("IllegalArgumentException should have been thrown");
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
+        try {
+            ContentType.create("stuff;", null);
+            Assert.fail("IllegalArgumentException should have been thrown");
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
+        try {
+            ContentType.create("text/plain", ",");
+            Assert.fail("IllegalArgumentException should have been thrown");
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
+    }
+
+    @Test
+    public void testParse() throws Exception {
+        ContentType contentType = ContentType.parse("text/plain; charset=\"ascii\"");
+        Assert.assertEquals("text/plain", contentType.getMimeType());
+        Assert.assertEquals("ascii", contentType.getCharset());
+        Assert.assertEquals("text/plain; charset=ascii", contentType.toString());
+    }
+
+    @Test
+    public void testParseInvalidInput() throws Exception {
+        try {
+            ContentType.parse(null);
+            Assert.fail("IllegalArgumentException should have been thrown");
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
+        try {
+            ContentType.parse(";");
+            Assert.fail("ParseException should have been thrown");
+        } catch (ParseException ex) {
+            // expected
+        }
+    }
+
+    @Test
+    public void testExtractNullInput() throws Exception {
+        Assert.assertNull(ContentType.get(null));
+    }
+
+    @Test
+    public void testExtractNullContentType() throws Exception {
+        BasicHttpEntity httpentity = new BasicHttpEntity();
+        httpentity.setContentType((Header)null);
+        Assert.assertNull(ContentType.get(httpentity));
+    }
+
+    @Test
+    public void testExtract() throws Exception {
+        BasicHttpEntity httpentity = new BasicHttpEntity();
+        httpentity.setContentType(new BasicHeader("Content-Type", "text/plain; charset = UTF-8"));
+        ContentType contentType = ContentType.get(httpentity);
+        Assert.assertNotNull(contentType);
+        Assert.assertEquals("text/plain", contentType.getMimeType());
+        Assert.assertEquals("utf-8", contentType.getCharset());
+    }
+
+    @Test
+    public void testExtractNoCharset() throws Exception {
+        BasicHttpEntity httpentity = new BasicHttpEntity();
+        httpentity.setContentType(new BasicHeader("Content-Type", "text/plain; param=yadayada"));
+        ContentType contentType = ContentType.get(httpentity);
+        Assert.assertNotNull(contentType);
+        Assert.assertEquals("text/plain", contentType.getMimeType());
+        Assert.assertNull(contentType.getCharset());
+    }
+
+}

Propchange: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestContentType.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestContentType.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestContentType.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestEntityTemplate.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestEntityTemplate.java?rev=1149326&r1=1149325&r2=1149326&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestEntityTemplate.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestEntityTemplate.java Thu Jul 21 19:17:52 2011
@@ -39,6 +39,7 @@ import org.junit.Test;
  * Unit tests for {@link EntityTemplate}.
  *
  */
+@Deprecated
 public class TestEntityTemplate {
 
     @Test

Modified: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestFileEntity.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestFileEntity.java?rev=1149326&r1=1149325&r2=1149326&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestFileEntity.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestFileEntity.java Thu Jul 21 19:17:52 2011
@@ -46,7 +46,8 @@ public class TestFileEntity {
     public void testBasics() throws Exception {
         File tmpfile = File.createTempFile("testfile", ".txt");
         tmpfile.deleteOnExit();
-        FileEntity httpentity = new FileEntity(tmpfile, HTTP.ISO_8859_1);
+        FileEntity httpentity = new FileEntity(tmpfile,
+                ContentType.create("text/plain", HTTP.ISO_8859_1));
 
         Assert.assertEquals(tmpfile.length(), httpentity.getContentLength());
         final InputStream content = httpentity.getContent();
@@ -62,7 +63,7 @@ public class TestFileEntity {
     @Test
     public void testIllegalConstructor() throws Exception {
         try {
-            new FileEntity(null, null);
+            new FileEntity(null, ContentType.create("text/plain", HTTP.ISO_8859_1));
             Assert.fail("IllegalArgumentException should have been thrown");
         } catch (IllegalArgumentException ex) {
             // expected
@@ -81,7 +82,8 @@ public class TestFileEntity {
         outstream.write(3);
         outstream.close();
 
-        FileEntity httpentity = new FileEntity(tmpfile, HTTP.ISO_8859_1);
+        FileEntity httpentity = new FileEntity(tmpfile,
+                ContentType.create("text/plain", HTTP.ISO_8859_1));
 
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         httpentity.writeTo(out);

Modified: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestStringEntity.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestStringEntity.java?rev=1149326&r1=1149325&r2=1149326&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestStringEntity.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/entity/TestStringEntity.java Thu Jul 21 19:17:52 2011
@@ -64,11 +64,11 @@ public class TestStringEntity {
     @Test
     public void testDefaultContent() throws Exception {
         String s = "Message content";
-        StringEntity httpentity = new StringEntity(s, "text/csv", "ANSI_X3.4-1968");
-        Assert.assertEquals("text/csv; charset=ANSI_X3.4-1968",
+        StringEntity httpentity = new StringEntity(s, ContentType.create("text/csv", "ANSI_X3.4-1968"));
+        Assert.assertEquals("text/csv; charset=ansi_x3.4-1968",
                 httpentity.getContentType().getValue());
         httpentity = new StringEntity(s, HTTP.US_ASCII);
-        Assert.assertEquals("text/plain; charset=US-ASCII",
+        Assert.assertEquals("text/plain; charset=us-ascii",
                 httpentity.getContentType().getValue());
         httpentity = new StringEntity(s);
         Assert.assertEquals("text/plain; charset=ISO-8859-1",

Modified: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/protocol/TestProtocolIntegration.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/protocol/TestProtocolIntegration.java?rev=1149326&r1=1149325&r2=1149326&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/protocol/TestProtocolIntegration.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/protocol/TestProtocolIntegration.java Thu Jul 21 19:17:52 2011
@@ -50,6 +50,7 @@ import org.apache.http.HttpStatus;
 import org.apache.http.HttpVersion;
 import org.apache.http.entity.AbstractHttpEntity;
 import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.entity.ContentType;
 import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.DefaultHttpClientConnection;
 import org.apache.http.message.BasicHttpEntityEnclosingRequest;
@@ -702,8 +703,11 @@ public class TestProtocolIntegration {
 
                     HttpEntity incoming = ((HttpEntityEnclosingRequest) request).getEntity();
                     String line = EntityUtils.toString(incoming);
-                    String charset = EntityUtils.getContentCharSet(incoming);
-
+                    ContentType contentType = ContentType.getOrDefault(incoming);
+                    String charset = contentType.getCharset();
+                    if (charset == null) {
+                        charset = HTTP.DEFAULT_CONTENT_CHARSET;
+                    }
                     RepeatingEntity outgoing = new RepeatingEntity(line, charset, n);
                     outgoing.setChunked(n % 2 == 0);
                     response.setEntity(outgoing);
@@ -737,9 +741,10 @@ public class TestProtocolIntegration {
                     HttpEntity incoming = response.getEntity();
                     Assert.assertNotNull(incoming);
                     InputStream instream = incoming.getContent();
-                    String charset = EntityUtils.getContentCharSet(incoming);
+                    ContentType contentType = ContentType.getOrDefault(incoming);
+                    String charset = contentType.getCharset();
                     if (charset == null) {
-                        charset = "US-ASCII";
+                        charset = HTTP.DEFAULT_CONTENT_CHARSET;
                     }
                     Assert.assertNotNull(instream);
                     BufferedReader reader = new BufferedReader(new InputStreamReader(instream, charset));

Modified: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/util/TestEntityUtils.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/util/TestEntityUtils.java?rev=1149326&r1=1149325&r2=1149326&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/util/TestEntityUtils.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/util/TestEntityUtils.java Thu Jul 21 19:17:52 2011
@@ -30,7 +30,6 @@ package org.apache.http.util;
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 
-import org.apache.http.Header;
 import org.apache.http.entity.BasicHttpEntity;
 import org.apache.http.message.BasicHeader;
 import org.junit.Assert;
@@ -102,62 +101,6 @@ public class TestEntityUtils {
     }
 
     @Test
-    public void testNullEntityGetContentCharset() throws Exception {
-        try {
-            EntityUtils.getContentCharSet(null);
-            Assert.fail("IllegalArgumentException should have been thrown");
-        } catch (IllegalArgumentException ex) {
-            // expected
-        }
-    }
-
-    @Test
-    public void testNullContentTypeGetContentCharset() throws Exception {
-        BasicHttpEntity httpentity = new BasicHttpEntity();
-        httpentity.setContentType((Header)null);
-        Assert.assertNull(EntityUtils.getContentCharSet(httpentity));
-    }
-
-    @Test
-    public void testNoCharsetGetContentCharset() throws Exception {
-        BasicHttpEntity httpentity = new BasicHttpEntity();
-        httpentity.setContentType(new BasicHeader("Content-Type", "text/plain; param=yadayada"));
-        Assert.assertNull(EntityUtils.getContentCharSet(httpentity));
-    }
-
-    @Test
-    public void testGetContentCharset() throws Exception {
-        BasicHttpEntity httpentity = new BasicHttpEntity();
-        httpentity.setContentType(new BasicHeader("Content-Type", "text/plain; charset = UTF-8"));
-        Assert.assertEquals("UTF-8", EntityUtils.getContentCharSet(httpentity));
-    }
-
-    @Test
-    public void testGetContentMimeTypeWithCharset() throws Exception {
-        BasicHttpEntity httpentity = new BasicHttpEntity();
-        httpentity.setContentType(new BasicHeader("Content-Type", "text/plain; " +
-                "whatever; charset = UTF-8"));
-        Assert.assertEquals("text/plain", EntityUtils.getContentMimeType(httpentity));
-    }
-
-    @Test
-    public void testGetContentMimeTypeWithoutCharset() throws Exception {
-        BasicHttpEntity httpentity = new BasicHttpEntity();
-        httpentity.setContentType(new BasicHeader("Content-Type", "text/whatever"));
-        Assert.assertEquals("text/whatever", EntityUtils.getContentMimeType(httpentity));
-    }
-
-    @Test
-    public void testNullEntityGetMimeType() throws Exception {
-        try {
-            EntityUtils.getContentMimeType(null);
-            Assert.fail("IllegalArgumentException should have been thrown");
-        } catch (IllegalArgumentException ex) {
-            // expected
-        }
-    }
-
-    @Test
     public void testNullEntityToString() throws Exception {
         try {
             EntityUtils.toString(null);