MessageFormatOptions.cs 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. using System;
  2. using System.IO;
  3. using System.Collections.Generic;
  4. using Google.ProtocolBuffers.Collections;
  5. namespace Google.ProtocolBuffers.Serialization.Http
  6. {
  7. /// <summary>
  8. /// A delegate used to specify a method that constructs an ICodedInputStream from a .NET Stream.
  9. /// </summary>
  10. public delegate ICodedInputStream CodedInputBuilder(Stream stream);
  11. /// <summary>
  12. /// A delegate used to specify a method that constructs an ICodedOutputStream from a .NET Stream.
  13. /// </summary>
  14. public delegate ICodedOutputStream CodedOutputBuilder(Stream stream);
  15. /// <summary>
  16. /// Defines control information for the various formatting used with HTTP services
  17. /// </summary>
  18. public class MessageFormatOptions
  19. {
  20. /// <summary>The mime type for xml content</summary>
  21. /// <remarks>Other valid xml mime types include: application/binary, application/x-protobuf</remarks>
  22. public const string ContentTypeProtoBuffer = "application/vnd.google.protobuf";
  23. /// <summary>The mime type for xml content</summary>
  24. /// <remarks>Other valid xml mime types include: text/xml</remarks>
  25. public const string ContentTypeXml = "application/xml";
  26. /// <summary>The mime type for json content</summary>
  27. /// <remarks>
  28. /// Other valid json mime types include: application/json, application/x-json,
  29. /// application/x-javascript, text/javascript, text/x-javascript, text/x-json, text/json
  30. /// </remarks>
  31. public const string ContentTypeJson = "application/json";
  32. /// <summary>The mime type for query strings and x-www-form-urlencoded content</summary>
  33. /// <remarks>This mime type is input-only</remarks>
  34. public const string ContentFormUrlEncoded = "application/x-www-form-urlencoded";
  35. /// <summary>
  36. /// Default mime-type handling for input
  37. /// </summary>
  38. private static readonly IDictionary<string, CodedInputBuilder> MimeInputDefaults =
  39. new ReadOnlyDictionary<string, CodedInputBuilder>(
  40. new Dictionary<string, CodedInputBuilder>(StringComparer.OrdinalIgnoreCase)
  41. {
  42. {"application/json", JsonFormatReader.CreateInstance},
  43. {"application/x-json", JsonFormatReader.CreateInstance},
  44. {"application/x-javascript", JsonFormatReader.CreateInstance},
  45. {"text/javascript", JsonFormatReader.CreateInstance},
  46. {"text/x-javascript", JsonFormatReader.CreateInstance},
  47. {"text/x-json", JsonFormatReader.CreateInstance},
  48. {"text/json", JsonFormatReader.CreateInstance},
  49. {"text/xml", XmlFormatReader.CreateInstance},
  50. {"application/xml", XmlFormatReader.CreateInstance},
  51. {"application/binary", CodedInputStream.CreateInstance},
  52. {"application/x-protobuf", CodedInputStream.CreateInstance},
  53. {"application/vnd.google.protobuf", CodedInputStream.CreateInstance},
  54. {"application/x-www-form-urlencoded", FormUrlEncodedReader.CreateInstance},
  55. }
  56. );
  57. /// <summary>
  58. /// Default mime-type handling for output
  59. /// </summary>
  60. private static readonly IDictionary<string, CodedOutputBuilder> MimeOutputDefaults =
  61. new ReadOnlyDictionary<string, CodedOutputBuilder>(
  62. new Dictionary<string, CodedOutputBuilder>(StringComparer.OrdinalIgnoreCase)
  63. {
  64. {"application/json", JsonFormatWriter.CreateInstance},
  65. {"application/x-json", JsonFormatWriter.CreateInstance},
  66. {"application/x-javascript", JsonFormatWriter.CreateInstance},
  67. {"text/javascript", JsonFormatWriter.CreateInstance},
  68. {"text/x-javascript", JsonFormatWriter.CreateInstance},
  69. {"text/x-json", JsonFormatWriter.CreateInstance},
  70. {"text/json", JsonFormatWriter.CreateInstance},
  71. {"text/xml", XmlFormatWriter.CreateInstance},
  72. {"application/xml", XmlFormatWriter.CreateInstance},
  73. {"application/binary", CodedOutputStream.CreateInstance},
  74. {"application/x-protobuf", CodedOutputStream.CreateInstance},
  75. {"application/vnd.google.protobuf", CodedOutputStream.CreateInstance},
  76. }
  77. );
  78. private string _defaultContentType;
  79. private string _xmlReaderRootElementName;
  80. private string _xmlWriterRootElementName;
  81. private ExtensionRegistry _extensionRegistry;
  82. private Dictionary<string, CodedInputBuilder> _mimeInputTypes;
  83. private Dictionary<string, CodedOutputBuilder> _mimeOutputTypes;
  84. /// <summary> Provides access to modify the mime-type input stream construction </summary>
  85. public IDictionary<string, CodedInputBuilder> MimeInputTypes
  86. {
  87. get
  88. {
  89. return _mimeInputTypes ??
  90. (_mimeInputTypes = new Dictionary<string, CodedInputBuilder>(
  91. MimeInputDefaults, StringComparer.OrdinalIgnoreCase));
  92. }
  93. }
  94. /// <summary> Provides access to modify the mime-type input stream construction </summary>
  95. public IDictionary<string, CodedOutputBuilder> MimeOutputTypes
  96. {
  97. get
  98. {
  99. return _mimeOutputTypes ??
  100. (_mimeOutputTypes = new Dictionary<string, CodedOutputBuilder>(
  101. MimeOutputDefaults, StringComparer.OrdinalIgnoreCase));
  102. }
  103. }
  104. internal IDictionary<string, CodedInputBuilder> MimeInputTypesReadOnly
  105. { get { return _mimeInputTypes ?? MimeInputDefaults; } }
  106. internal IDictionary<string, CodedOutputBuilder> MimeOutputTypesReadOnly
  107. { get { return _mimeOutputTypes ?? MimeOutputDefaults; } }
  108. /// <summary>
  109. /// The default content type to use if the input type is null or empty. If this
  110. /// value is not supplied an ArgumentOutOfRangeException exception will be raised.
  111. /// </summary>
  112. public string DefaultContentType
  113. {
  114. get { return _defaultContentType ?? String.Empty; }
  115. set { _defaultContentType = value; }
  116. }
  117. /// <summary>
  118. /// The extension registry to use when reading messages
  119. /// </summary>
  120. public ExtensionRegistry ExtensionRegistry
  121. {
  122. get { return _extensionRegistry ?? ExtensionRegistry.Empty; }
  123. set { _extensionRegistry = value; }
  124. }
  125. /// <summary>
  126. /// The name of the xml root element when reading messages
  127. /// </summary>
  128. public string XmlReaderRootElementName
  129. {
  130. get { return _xmlReaderRootElementName ?? XmlFormatReader.DefaultRootElementName; }
  131. set { _xmlReaderRootElementName = value; }
  132. }
  133. /// <summary>
  134. /// Xml reader options
  135. /// </summary>
  136. public XmlReaderOptions XmlReaderOptions { get; set; }
  137. /// <summary>
  138. /// True to use formatted output including new-lines and default indentation
  139. /// </summary>
  140. public bool FormattedOutput { get; set; }
  141. /// <summary>
  142. /// The name of the xml root element when writing messages
  143. /// </summary>
  144. public string XmlWriterRootElementName
  145. {
  146. get { return _xmlWriterRootElementName ?? XmlFormatWriter.DefaultRootElementName; }
  147. set { _xmlWriterRootElementName = value; }
  148. }
  149. /// <summary>
  150. /// Xml writer options
  151. /// </summary>
  152. public XmlWriterOptions XmlWriterOptions { get; set; }
  153. }
  154. }