< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.Channels.AddressHeader
Assembly: CoreWCF.Primitives
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/Channels/AddressHeader.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 109
Coverable lines: 109
Total lines: 411
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 32
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/Channels/AddressHeader.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System;
 5using System.Runtime.Serialization;
 6using System.Text;
 7using System.Xml;
 8using CoreWCF.Dispatcher;
 9using CoreWCF.Runtime;
 10
 11namespace CoreWCF.Channels
 12{
 13    public abstract class AddressHeader
 14    {
 15        private ParameterHeader _header;
 16
 017        protected AddressHeader()
 18        {
 019        }
 20
 21        internal bool IsReferenceProperty
 22        {
 23            get
 24            {
 025                return this is BufferedAddressHeader bah && bah.IsReferencePropertyHeader;
 26            }
 27        }
 28
 29        public abstract string Name { get; }
 30        public abstract string Namespace { get; }
 31
 32        //public static AddressHeader CreateAddressHeader(object value)
 33        //{
 34        //    Type type = GetObjectType(value);
 35        //    return CreateAddressHeader(value, DataContractSerializerDefaults.CreateSerializer(type, int.MaxValue/*maxI
 36        //}
 37
 38        //public static AddressHeader CreateAddressHeader(object value, XmlObjectSerializer serializer)
 39        //{
 40        //    if (serializer == null)
 41        //        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("serializer"));
 42        //    return new XmlObjectSerializerAddressHeader(value, serializer);
 43        //}
 44
 45        public static AddressHeader CreateAddressHeader(string name, string ns, object value)
 46        {
 047            return CreateAddressHeader(name, ns, value, DataContractSerializerDefaults.CreateSerializer(GetObjectType(va
 48        }
 49
 50        internal static AddressHeader CreateAddressHeader(XmlDictionaryString name, XmlDictionaryString ns, object value
 51        {
 052            return new DictionaryAddressHeader(name, ns, value);
 53        }
 54
 55        public static AddressHeader CreateAddressHeader(string name, string ns, object value, XmlObjectSerializer serial
 56        {
 057            if (serializer == null)
 58            {
 059                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(serializer));
 60            }
 61
 062            return new XmlObjectSerializerAddressHeader(name, ns, value, serializer);
 63        }
 64
 65        private static Type GetObjectType(object value)
 66        {
 067            return (value == null) ? typeof(object) : value.GetType();
 68        }
 69
 70        public override bool Equals(object obj)
 71        {
 072            if (!(obj is AddressHeader hdr))
 73            {
 074                return false;
 75            }
 76
 077            StringBuilder builder = new StringBuilder();
 078            string hdr1 = GetComparableForm(builder);
 79
 080            builder.Remove(0, builder.Length);
 081            string hdr2 = hdr.GetComparableForm(builder);
 82
 083            if (hdr1.Length != hdr2.Length)
 84            {
 085                return false;
 86            }
 87
 088            if (string.CompareOrdinal(hdr1, hdr2) != 0)
 89            {
 090                return false;
 91            }
 92
 093            return true;
 94        }
 95
 96        internal string GetComparableForm()
 97        {
 098            return GetComparableForm(new StringBuilder());
 99        }
 100
 101        internal string GetComparableForm(StringBuilder builder)
 102        {
 0103            return EndpointAddressProcessor.GetComparableForm(builder, GetComparableReader());
 104        }
 105
 106        public override int GetHashCode()
 107        {
 0108            return GetComparableForm().GetHashCode();
 109        }
 110
 111        public T GetValue<T>()
 112        {
 0113            return GetValue<T>(DataContractSerializerDefaults.CreateSerializer(typeof(T), Name, Namespace, int.MaxValue/
 114        }
 115
 116        public T GetValue<T>(XmlObjectSerializer serializer)
 117        {
 0118            if (serializer == null)
 119            {
 0120                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(serializer));
 121            }
 122
 0123            using (XmlDictionaryReader reader = GetAddressHeaderReader())
 124            {
 0125                if (serializer.IsStartObject(reader))
 126                {
 0127                    return (T)serializer.ReadObject(reader);
 128                }
 129                else
 130                {
 0131                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new XmlException(SR.Format(SR.ExpectedElem
 132                }
 133            }
 0134        }
 135
 136        public virtual XmlDictionaryReader GetAddressHeaderReader()
 137        {
 0138            XmlBuffer buffer = new XmlBuffer(int.MaxValue);
 0139            XmlDictionaryWriter writer = buffer.OpenSection(XmlDictionaryReaderQuotas.Max);
 0140            WriteAddressHeader(writer);
 0141            buffer.CloseSection();
 0142            buffer.Close();
 0143            return buffer.GetReader(0);
 144        }
 145
 146        private XmlDictionaryReader GetComparableReader()
 147        {
 0148            XmlBuffer buffer = new XmlBuffer(int.MaxValue);
 0149            XmlDictionaryWriter writer = buffer.OpenSection(XmlDictionaryReaderQuotas.Max);
 150            // WSAddressingAugust2004 does not write the IsReferenceParameter attribute,
 151            // and that's good for a consistent comparable form. But it's not available for .Net Core
 0152            ParameterHeader.WriteStartHeader(writer, this, AddressingVersion.WSAddressing10);
 153            //ParameterHeader.WriteStartHeader(writer, this, AddressingVersion.WSAddressingAugust2004);
 0154            ParameterHeader.WriteHeaderContents(writer, this);
 0155            writer.WriteEndElement();
 0156            buffer.CloseSection();
 0157            buffer.Close();
 0158            return buffer.GetReader(0);
 159        }
 160
 161        protected virtual void OnWriteStartAddressHeader(XmlDictionaryWriter writer)
 162        {
 0163            writer.WriteStartElement(Name, Namespace);
 0164        }
 165
 166        protected abstract void OnWriteAddressHeaderContents(XmlDictionaryWriter writer);
 167
 168        public MessageHeader ToMessageHeader()
 169        {
 0170            if (_header == null)
 171            {
 0172                _header = new ParameterHeader(this);
 173            }
 174
 0175            return _header;
 176        }
 177
 178        public void WriteAddressHeader(XmlWriter writer)
 179        {
 0180            WriteAddressHeader(XmlDictionaryWriter.CreateDictionaryWriter(writer));
 0181        }
 182
 183        public void WriteAddressHeader(XmlDictionaryWriter writer)
 184        {
 0185            if (writer == null)
 186            {
 0187                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(writer));
 188            }
 189
 0190            WriteStartAddressHeader(writer);
 0191            WriteAddressHeaderContents(writer);
 0192            writer.WriteEndElement();
 0193        }
 194
 195        public void WriteStartAddressHeader(XmlDictionaryWriter writer)
 196        {
 0197            if (writer == null)
 198            {
 0199                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(writer));
 200            }
 201
 0202            OnWriteStartAddressHeader(writer);
 0203        }
 204
 205        public void WriteAddressHeaderContents(XmlDictionaryWriter writer)
 206        {
 0207            if (writer == null)
 208            {
 0209                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(writer));
 210            }
 211
 0212            OnWriteAddressHeaderContents(writer);
 0213        }
 214
 215        private class ParameterHeader : MessageHeader
 216        {
 217            private readonly AddressHeader _parameter;
 218
 219            public override bool IsReferenceParameter
 220            {
 0221                get { return true; }
 222            }
 223
 224            public override string Name
 225            {
 0226                get { return _parameter.Name; }
 227            }
 228
 229            public override string Namespace
 230            {
 0231                get { return _parameter.Namespace; }
 232            }
 233
 0234            public ParameterHeader(AddressHeader parameter)
 235            {
 0236                _parameter = parameter;
 0237            }
 238
 239            protected override void OnWriteStartHeader(XmlDictionaryWriter writer, MessageVersion messageVersion)
 240            {
 0241                if (messageVersion == null)
 242                {
 0243                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(messageVersion));
 244                }
 245
 0246                WriteStartHeader(writer, _parameter, messageVersion.Addressing);
 0247            }
 248
 249            protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion)
 250            {
 0251                WriteHeaderContents(writer, _parameter);
 0252            }
 253
 254            internal static void WriteStartHeader(XmlDictionaryWriter writer, AddressHeader parameter, AddressingVersion
 255            {
 0256                parameter.WriteStartAddressHeader(writer);
 0257                if (addressingVersion == AddressingVersion.WSAddressing10)
 258                {
 0259                    writer.WriteAttributeString(XD.AddressingDictionary.IsReferenceParameter, XD.Addressing10Dictionary.
 260                }
 0261            }
 262
 263            internal static void WriteHeaderContents(XmlDictionaryWriter writer, AddressHeader parameter)
 264            {
 0265                parameter.WriteAddressHeaderContents(writer);
 0266            }
 267        }
 268
 269        private class XmlObjectSerializerAddressHeader : AddressHeader
 270        {
 271            private readonly XmlObjectSerializer _serializer;
 272            private readonly object _objectToSerialize;
 273            private readonly string _name;
 274            private readonly string _ns;
 275
 0276            public XmlObjectSerializerAddressHeader(object objectToSerialize, XmlObjectSerializer serializer)
 277            {
 0278                _serializer = serializer;
 0279                _objectToSerialize = objectToSerialize;
 280
 0281                throw new PlatformNotSupportedException();
 282
 283                //Type type = (objectToSerialize == null) ? typeof(object) : objectToSerialize.GetType();
 284                //XmlQualifiedName rootName = new XsdDataContractExporter().GetRootElementName(type);
 285                //this.name = rootName.Name;
 286                //this.ns = rootName.Namespace;
 287            }
 288
 0289            public XmlObjectSerializerAddressHeader(string name, string ns, object objectToSerialize, XmlObjectSerialize
 290            {
 0291                if ((null == name) || (name.Length == 0))
 292                {
 0293                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(name));
 294                }
 295
 0296                _serializer = serializer;
 0297                _objectToSerialize = objectToSerialize;
 0298                _name = name;
 0299                _ns = ns;
 0300            }
 301
 302            public override string Name
 303            {
 0304                get { return _name; }
 305            }
 306
 307            public override string Namespace
 308            {
 0309                get { return _ns; }
 310            }
 311
 312            private object ThisLock
 313            {
 0314                get { return this; }
 315            }
 316
 317            protected override void OnWriteAddressHeaderContents(XmlDictionaryWriter writer)
 318            {
 0319                lock (ThisLock)
 320                {
 0321                    _serializer.WriteObjectContent(writer, _objectToSerialize);
 0322                }
 0323            }
 324        }
 325
 326        // astern, This will be kept internal for now.  If the optimization needs to be public, we'll re-evaluate it.
 327        private class DictionaryAddressHeader : XmlObjectSerializerAddressHeader
 328        {
 329            private readonly XmlDictionaryString _name;
 330            private readonly XmlDictionaryString _ns;
 331
 332            public DictionaryAddressHeader(XmlDictionaryString name, XmlDictionaryString ns, object value)
 0333                : base(name.Value, ns.Value, value, DataContractSerializerDefaults.CreateSerializer(GetObjectType(value)
 334            {
 0335                _name = name;
 0336                _ns = ns;
 0337            }
 338
 339            protected override void OnWriteStartAddressHeader(XmlDictionaryWriter writer)
 340            {
 0341                writer.WriteStartElement(_name, _ns);
 0342            }
 343        }
 344    }
 345
 346    internal class BufferedAddressHeader : AddressHeader
 347    {
 348        private readonly string _name;
 349        private readonly string _ns;
 350        private readonly XmlBuffer _buffer;
 351
 352        public BufferedAddressHeader(XmlDictionaryReader reader)
 353        {
 354            _buffer = new XmlBuffer(int.MaxValue);
 355            XmlDictionaryWriter writer = _buffer.OpenSection(reader.Quotas);
 356            Fx.Assert(reader.NodeType == XmlNodeType.Element, "");
 357            _name = reader.LocalName;
 358            _ns = reader.NamespaceURI;
 359            Fx.Assert(_name != null, "");
 360            Fx.Assert(_ns != null, "");
 361            writer.WriteNode(reader, false);
 362            _buffer.CloseSection();
 363            _buffer.Close();
 364            IsReferencePropertyHeader = false;
 365        }
 366
 367        public BufferedAddressHeader(XmlDictionaryReader reader, bool isReferenceProperty)
 368            : this(reader)
 369        {
 370            IsReferencePropertyHeader = isReferenceProperty;
 371        }
 372
 373        public bool IsReferencePropertyHeader { get; }
 374
 375        public override string Name
 376        {
 377            get { return _name; }
 378        }
 379
 380        public override string Namespace
 381        {
 382            get { return _ns; }
 383        }
 384
 385        public override XmlDictionaryReader GetAddressHeaderReader()
 386        {
 387            return _buffer.GetReader(0);
 388        }
 389
 390        protected override void OnWriteStartAddressHeader(XmlDictionaryWriter writer)
 391        {
 392            XmlDictionaryReader reader = GetAddressHeaderReader();
 393            writer.WriteStartElement(reader.Prefix, reader.LocalName, reader.NamespaceURI);
 394            writer.WriteAttributes(reader, false);
 395            reader.Dispose();
 396        }
 397
 398        protected override void OnWriteAddressHeaderContents(XmlDictionaryWriter writer)
 399        {
 400            XmlDictionaryReader reader = GetAddressHeaderReader();
 401            reader.ReadStartElement();
 402            while (reader.NodeType != XmlNodeType.EndElement)
 403            {
 404                writer.WriteNode(reader, false);
 405            }
 406
 407            reader.ReadEndElement();
 408            reader.Dispose();
 409        }
 410    }
 411}

Methods/Properties

.ctor()
IsReferenceProperty()
CreateAddressHeader(System.String,System.String,System.Object)
CreateAddressHeader(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.Object)
CreateAddressHeader(System.String,System.String,System.Object,System.Runtime.Serialization.XmlObjectSerializer)
GetObjectType(System.Object)
Equals(System.Object)
GetComparableForm()
GetComparableForm(System.Text.StringBuilder)
GetHashCode()
GetValue()
GetValue(System.Runtime.Serialization.XmlObjectSerializer)
GetAddressHeaderReader()
GetComparableReader()
OnWriteStartAddressHeader(System.Xml.XmlDictionaryWriter)
ToMessageHeader()
WriteAddressHeader(System.Xml.XmlWriter)
WriteAddressHeader(System.Xml.XmlDictionaryWriter)
WriteStartAddressHeader(System.Xml.XmlDictionaryWriter)
WriteAddressHeaderContents(System.Xml.XmlDictionaryWriter)
IsReferenceParameter()
Name()
Namespace()
.ctor(CoreWCF.Channels.AddressHeader)
OnWriteStartHeader(System.Xml.XmlDictionaryWriter,CoreWCF.Channels.MessageVersion)
OnWriteHeaderContents(System.Xml.XmlDictionaryWriter,CoreWCF.Channels.MessageVersion)
WriteStartHeader(System.Xml.XmlDictionaryWriter,CoreWCF.Channels.AddressHeader,CoreWCF.Channels.AddressingVersion)
WriteHeaderContents(System.Xml.XmlDictionaryWriter,CoreWCF.Channels.AddressHeader)
.ctor(System.Object,System.Runtime.Serialization.XmlObjectSerializer)
.ctor(System.String,System.String,System.Object,System.Runtime.Serialization.XmlObjectSerializer)
Name()
Namespace()
ThisLock()
OnWriteAddressHeaderContents(System.Xml.XmlDictionaryWriter)
.ctor(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.Object)
OnWriteStartAddressHeader(System.Xml.XmlDictionaryWriter)