New test.
[mono.git] / mcs / class / System.Web.Services / System.Web.Services.Protocols / SoapMessage.cs
index ac8f8195086920b720f5455ff5bbb8f556bb6150..8fc0f04e2889b793da84a85e8c1808ef0a6f7885 100644 (file)
@@ -7,6 +7,27 @@
 //\r
 // Copyright (C) Tim Coleman, 2002\r
 //\r
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
 \r
 using System.IO;\r
 using System.Web.Services;\r
@@ -17,6 +38,7 @@ namespace System.Web.Services.Protocols {
                #region Fields\r
 \r
                string content_type = "text/xml";\r
+               string content_encoding;\r
                SoapException exception = null;\r
                SoapHeaderCollection headers;\r
                SoapMessageStage stage;\r
@@ -24,6 +46,10 @@ namespace System.Web.Services.Protocols {
                object[] inParameters;\r
                object[] outParameters;\r
                \r
+#if NET_2_0\r
+               SoapProtocolVersion soapVersion;\r
+#endif\r
+\r
                #endregion // Fields\r
 \r
                #region Constructors\r
@@ -33,11 +59,6 @@ namespace System.Web.Services.Protocols {
                        headers = new SoapHeaderCollection ();\r
                }\r
 \r
-               internal SoapMessage (Stream stream)\r
-               {\r
-                       this.stream = stream;\r
-               }\r
-\r
                internal SoapMessage (Stream stream, SoapException exception)\r
                {\r
                        this.exception = exception;\r
@@ -73,6 +94,9 @@ namespace System.Web.Services.Protocols {
 \r
                public SoapException Exception {\r
                        get { return exception; }\r
+#if NET_2_0\r
+                       set { exception = value; }\r
+#endif\r
                }\r
 \r
                public SoapHeaderCollection Headers {\r
@@ -105,6 +129,35 @@ namespace System.Web.Services.Protocols {
                public abstract string Url {\r
                        get;\r
                }\r
+               \r
+#if NET_1_1\r
+               public string ContentEncoding\r
+               {\r
+                       get { return content_encoding; }\r
+                       set { content_encoding = value; }\r
+               }\r
+#else\r
+               internal string ContentEncoding\r
+               {\r
+                       get { return content_encoding; }\r
+                       set { content_encoding = value; }\r
+               }\r
+#endif\r
+\r
+#if NET_2_0\r
+               [System.Runtime.InteropServices.ComVisible(false)]\r
+               public virtual SoapProtocolVersion SoapVersion {\r
+                       get { return soapVersion; }\r
+               }\r
+#endif\r
\r
+               internal Stream InternalStream \r
+               { \r
+                       // for getter use public stream property\r
+                       set {\r
+                               stream = value;\r
+                       }\r
+               }\r
 \r
                #endregion Properties\r
 \r
@@ -151,7 +204,7 @@ namespace System.Web.Services.Protocols {
                        Headers.Clear ();\r
                        foreach (HeaderInfo hi in headers) \r
                        {\r
-                               if ((hi.Direction & direction) != 0) \r
+                               if ((hi.Direction & direction) != 0 && !hi.IsUnknownHeader\r
                                {\r
                                        SoapHeader headerVal = hi.GetHeaderValue (target) as SoapHeader;\r
                                        if (headerVal != null)\r
@@ -165,20 +218,24 @@ namespace System.Web.Services.Protocols {
                        foreach (SoapHeader header in Headers)\r
                        {\r
                                HeaderInfo hinfo = FindHeader (headersInfo, header.GetType ());\r
-                               if (hinfo != null)\r
-                                       hinfo.SetHeaderValue (target, header);\r
-                               else\r
-                                       if (header.MustUnderstand)\r
-                                       throw new SoapHeaderException ("Unknown header", SoapException.MustUnderstandFaultCode);\r
-                               header.DidUnderstand = false;\r
+                               if (hinfo != null) {\r
+                                       hinfo.SetHeaderValue (target, header);
+                                       header.DidUnderstand = !hinfo.IsUnknownHeader;
+                               }\r
                        }\r
                }\r
 \r
                HeaderInfo FindHeader (HeaderInfo[] headersInfo, Type headerType)\r
-               {\r
-                       foreach (HeaderInfo headerInfo in headersInfo)
-                               if (headerInfo.HeaderType == headerType) return headerInfo;
-                       return null;
+               {
+                       HeaderInfo unknownHeaderInfo = null;
+               \r
+                       foreach (HeaderInfo headerInfo in headersInfo) {
+                               if (headerInfo.HeaderType == headerType)
+                                       return headerInfo;
+                               else if (headerInfo.IsUnknownHeader) 
+                                       unknownHeaderInfo = headerInfo;
+                       }
+                       return unknownHeaderInfo;
                }\r
 \r
                #endregion // Methods\r