Last change for http support, adding a simple reader for query strings and/or
url-encoded form data to support restful apis.  Also exposed the mime to reader
and mime to writer via dictionaries in the MessageFormatOptions structure.
diff --git a/src/ProtocolBuffers.Serialization/Http/MessageFormatOptions.cs b/src/ProtocolBuffers.Serialization/Http/MessageFormatOptions.cs
index 02f2ea4..4ee1889 100644
--- a/src/ProtocolBuffers.Serialization/Http/MessageFormatOptions.cs
+++ b/src/ProtocolBuffers.Serialization/Http/MessageFormatOptions.cs
@@ -1,4 +1,7 @@
 using System;

+using System.IO;

+using System.Collections.Generic;

+using Google.ProtocolBuffers.Collections;

 

 namespace Google.ProtocolBuffers.Serialization.Http

 {

@@ -22,10 +25,92 @@
         /// </remarks>

         public const string ContentTypeJson = "application/json";

 

+        /// <summary>The mime type for query strings and x-www-form-urlencoded content</summary>

+        /// <remarks>This mime type is input-only</remarks>

+        public const string ContentFormUrlEncoded = "application/x-www-form-urlencoded";

+

+        /// <summary>

+        /// Default mime-type handling for input

+        /// </summary>

+        private static readonly IDictionary<string, Converter<Stream, ICodedInputStream>> MimeInputDefaults =

+            new ReadOnlyDictionary<string, Converter<Stream, ICodedInputStream>>(

+            new Dictionary<string, Converter<Stream, ICodedInputStream>>(StringComparer.OrdinalIgnoreCase)

+                {

+                    {"application/json", JsonFormatReader.CreateInstance},

+                    {"application/x-json", JsonFormatReader.CreateInstance},

+                    {"application/x-javascript", JsonFormatReader.CreateInstance},

+                    {"text/javascript", JsonFormatReader.CreateInstance},

+                    {"text/x-javascript", JsonFormatReader.CreateInstance},

+                    {"text/x-json", JsonFormatReader.CreateInstance},

+                    {"text/json", JsonFormatReader.CreateInstance},

+                    {"text/xml", XmlFormatReader.CreateInstance},

+                    {"application/xml", XmlFormatReader.CreateInstance},

+                    {"application/binary", CodedInputStream.CreateInstance},

+                    {"application/x-protobuf", CodedInputStream.CreateInstance},

+                    {"application/vnd.google.protobuf", CodedInputStream.CreateInstance},

+                    {"application/x-www-form-urlencoded", FormUrlEncodedReader.CreateInstance},

+                }

+            );

+

+        /// <summary>

+        /// Default mime-type handling for output

+        /// </summary>

+        private static readonly IDictionary<string, Converter<Stream, ICodedOutputStream>> MimeOutputDefaults =

+            new ReadOnlyDictionary<string, Converter<Stream, ICodedOutputStream>>(

+            new Dictionary<string, Converter<Stream, ICodedOutputStream>>(StringComparer.OrdinalIgnoreCase)

+                {

+                    {"application/json", JsonFormatWriter.CreateInstance},

+                    {"application/x-json", JsonFormatWriter.CreateInstance},

+                    {"application/x-javascript", JsonFormatWriter.CreateInstance},

+                    {"text/javascript", JsonFormatWriter.CreateInstance},

+                    {"text/x-javascript", JsonFormatWriter.CreateInstance},

+                    {"text/x-json", JsonFormatWriter.CreateInstance},

+                    {"text/json", JsonFormatWriter.CreateInstance},

+                    {"text/xml", XmlFormatWriter.CreateInstance},

+                    {"application/xml", XmlFormatWriter.CreateInstance},

+                    {"application/binary", CodedOutputStream.CreateInstance},

+                    {"application/x-protobuf", CodedOutputStream.CreateInstance},

+                    {"application/vnd.google.protobuf", CodedOutputStream.CreateInstance},

+                }

+            );

+

+

+

+

         private string _defaultContentType;

         private string _xmlReaderRootElementName;

         private string _xmlWriterRootElementName;

         private ExtensionRegistry _extensionRegistry;

+        private Dictionary<string, Converter<Stream, ICodedInputStream>> _mimeInputTypes;

+        private Dictionary<string, Converter<Stream, ICodedOutputStream>> _mimeOutputTypes;

+

+        /// <summary> Provides access to modify the mime-type input stream construction </summary>

+        public IDictionary<string, Converter<Stream, ICodedInputStream>> MimeInputTypes

+        {

+            get

+            {

+                return _mimeInputTypes ??

+                    (_mimeInputTypes = new Dictionary<string, Converter<Stream, ICodedInputStream>>(

+                                           MimeInputDefaults, StringComparer.OrdinalIgnoreCase));

+            }

+        }

+

+        /// <summary> Provides access to modify the mime-type input stream construction </summary>

+        public IDictionary<string, Converter<Stream, ICodedOutputStream>> MimeOutputTypes

+        {

+            get

+            {

+                return _mimeOutputTypes ??

+                    (_mimeOutputTypes = new Dictionary<string, Converter<Stream, ICodedOutputStream>>(

+                                           MimeOutputDefaults, StringComparer.OrdinalIgnoreCase));

+            }

+        }

+

+        internal IDictionary<string, Converter<Stream, ICodedInputStream>> MimeInputTypesReadOnly

+        { get { return _mimeInputTypes ?? MimeInputDefaults; } }

+

+        internal IDictionary<string, Converter<Stream, ICodedOutputStream>> MimeOutputTypesReadOnly

+        { get { return _mimeOutputTypes ?? MimeOutputDefaults; } }

 

         /// <summary>

         /// The default content type to use if the input type is null or empty.  If this