public DiscoveryDocument DiscoverAny(string url)
        {
            Type[]             discoveryReferenceTypes = WebServicesSection.Current.DiscoveryReferenceTypes;
            DiscoveryReference reference   = null;
            string             contentType = null;
            Stream             stream      = this.Download(ref url, ref contentType);

            this.Errors.Clear();
            bool      flag           = true;
            Exception innerException = null;
            ArrayList list           = new ArrayList();

            foreach (Type type in discoveryReferenceTypes)
            {
                if (typeof(DiscoveryReference).IsAssignableFrom(type))
                {
                    reference                = (DiscoveryReference)Activator.CreateInstance(type);
                    reference.Url            = url;
                    reference.ClientProtocol = this;
                    stream.Position          = 0L;
                    Exception exception2 = reference.AttemptResolve(contentType, stream);
                    if (exception2 == null)
                    {
                        break;
                    }
                    this.Errors[type.FullName] = exception2;
                    reference = null;
                    InvalidContentTypeException exception3 = exception2 as InvalidContentTypeException;
                    if ((exception3 == null) || !ContentType.MatchesBase(exception3.ContentType, "text/html"))
                    {
                        flag = false;
                    }
                    if (exception2 is InvalidDocumentContentsException)
                    {
                        innerException = exception2;
                        break;
                    }
                    if ((exception2.InnerException != null) && (exception2.InnerException.InnerException == null))
                    {
                        list.Add(exception2.InnerException.Message);
                    }
                }
            }
            if (reference == null)
            {
                if (innerException != null)
                {
                    StringBuilder builder = new StringBuilder(Res.GetString("TheDocumentWasUnderstoodButContainsErrors"));
                    while (innerException != null)
                    {
                        builder.Append("\n  - ").Append(innerException.Message);
                        innerException = innerException.InnerException;
                    }
                    throw new InvalidOperationException(builder.ToString());
                }
                if (flag)
                {
                    throw new InvalidOperationException(Res.GetString("TheHTMLDocumentDoesNotContainDiscoveryInformation"));
                }
                bool flag2 = (list.Count == this.Errors.Count) && (this.Errors.Count > 0);
                for (int i = 1; flag2 && (i < list.Count); i++)
                {
                    if (((string)list[i - 1]) != ((string)list[i]))
                    {
                        flag2 = false;
                    }
                }
                if (flag2)
                {
                    throw new InvalidOperationException(Res.GetString("TheDocumentWasNotRecognizedAsAKnownDocumentType", new object[] { list[0] }));
                }
                StringBuilder builder2 = new StringBuilder(Res.GetString("WebMissingResource", new object[] { url }));
                foreach (DictionaryEntry entry in this.Errors)
                {
                    Exception exception5 = (Exception)entry.Value;
                    string    key        = (string)entry.Key;
                    if (string.Compare(key, typeof(ContractReference).FullName, StringComparison.Ordinal) == 0)
                    {
                        key = Res.GetString("WebContractReferenceName");
                    }
                    else if (string.Compare(key, typeof(SchemaReference).FullName, StringComparison.Ordinal) == 0)
                    {
                        key = Res.GetString("WebShemaReferenceName");
                    }
                    else if (string.Compare(key, typeof(DiscoveryDocumentReference).FullName, StringComparison.Ordinal) == 0)
                    {
                        key = Res.GetString("WebDiscoveryDocumentReferenceName");
                    }
                    builder2.Append("\n- ").Append(Res.GetString("WebDiscoRefReport", new object[] { key, exception5.Message }));
                    while (exception5.InnerException != null)
                    {
                        builder2.Append("\n  - ").Append(exception5.InnerException.Message);
                        exception5 = exception5.InnerException;
                    }
                }
                throw new InvalidOperationException(builder2.ToString());
            }
            if (reference is DiscoveryDocumentReference)
            {
                return(((DiscoveryDocumentReference)reference).Document);
            }
            this.References[reference.Url] = reference;
            DiscoveryDocument document = new DiscoveryDocument();

            document.References.Add(reference);
            return(document);
        }
        /// <include file='doc\DiscoveryDocumentReference.uex' path='docs/doc[@for="DiscoveryDocumentReference.Resolve"]/*' />
        /// <devdoc>
        ///    <para>[To be supplied.]</para>
        /// </devdoc>
        protected internal override void Resolve(string contentType, Stream stream) {
            DiscoveryDocument document = null;

            if (ContentType.IsHtml(contentType)) {
                string newRef = LinkGrep.SearchForLink(stream);
                if (newRef != null) {
                    string newUrl = UriToString(Url, newRef);
                    document = GetDocumentNoParse(ref newUrl, ClientProtocol);
                    Url = newUrl;
                }
                else
                    throw new InvalidContentTypeException(Res.GetString(Res.WebInvalidContentType, contentType), contentType);
            }

            if (document == null) { // probably xml...
                XmlTextReader reader = new XmlTextReader(new StreamReader(stream, RequestResponseUtils.GetEncoding(contentType)));
                reader.XmlResolver = null;
                reader.WhitespaceHandling = WhitespaceHandling.Significant;
                reader.DtdProcessing = DtdProcessing.Prohibit;
                if (DiscoveryDocument.CanRead(reader)) {
                    // it's a discovery document, so just read it.
                    document = DiscoveryDocument.Read(reader);
                }
                else {
                    // check out the processing instructions before the first tag.  if any of them
                    // match the form specified in the DISCO spec, save the href.
                    stream.Position = 0;
                    XmlTextReader newReader = new XmlTextReader(new StreamReader(stream, RequestResponseUtils.GetEncoding(contentType)));
                    newReader.XmlResolver = null;
                    newReader.DtdProcessing = DtdProcessing.Prohibit;
                    while (newReader.NodeType != XmlNodeType.Element) {
                        if (newReader.NodeType == XmlNodeType.ProcessingInstruction) {
                            // manually parse the PI contents since XmlTextReader won't automatically do it
                            StringBuilder sb = new StringBuilder("<pi ");
                            sb.Append(newReader.Value);
                            sb.Append("/>");
                            XmlTextReader piReader = new XmlTextReader(new StringReader(sb.ToString()));
                            piReader.XmlResolver = null;
                            piReader.DtdProcessing = DtdProcessing.Prohibit;
                            piReader.Read();
                            string type = piReader["type"];
                            string alternate = piReader["alternate"];
                            string href = piReader["href"];
                            if (type != null && ContentType.MatchesBase(type, ContentType.TextXml)
                                && alternate != null && string.Compare(alternate, "yes", StringComparison.OrdinalIgnoreCase) == 0
                                && href != null) {
                                // we got a PI with the right attributes

                                // there is a link to a discovery document. follow it after fully qualifying it.
                                string newUrl = UriToString(Url, href);
                                document = GetDocumentNoParse(ref newUrl, ClientProtocol);
                                Url = newUrl;
                                break;
                            }
                        }
                        newReader.Read();
                    }
                }
            }

            if (document == null) {
                // there is no discovery document at this location
                Exception exception;
                if (ContentType.IsXml(contentType)) {
                    exception = new ArgumentException(Res.GetString(Res.WebInvalidFormat));
                }
                else {
                    exception = new InvalidContentTypeException(Res.GetString(Res.WebInvalidContentType, contentType), contentType);
                }
                throw new InvalidOperationException(Res.GetString(Res.WebMissingDocument, Url), exception);
            }

            ClientProtocol.References[Url] = this;
            ClientProtocol.Documents[Url] = document;

            foreach (object o in document.References) {
                if (o is DiscoveryReference) {
                    DiscoveryReference r = (DiscoveryReference) o;
                    if (r.Url.Length == 0) {
                        throw new InvalidOperationException(Res.GetString(Res.WebEmptyRef, r.GetType().FullName, Url));
                    }
                    r.Url = UriToString(Url, r.Url);
                    //All inheritors of DiscoveryReference that got URIs relative
                    //to Ref property should adjust them like ContractReference does here.
                    ContractReference cr = r as ContractReference;
                    if ( (cr != null) && (cr.DocRef != null) ) {
                        cr.DocRef = UriToString(Url, cr.DocRef);
                    }
                    r.ClientProtocol = ClientProtocol;
                    ClientProtocol.References[r.Url] = r;
                }
                else
                    ClientProtocol.AdditionalInformation.Add(o);
            }

            return;
        }
        /// <include file='doc\DiscoveryDocumentReference.uex' path='docs/doc[@for="DiscoveryDocumentReference.Resolve"]/*' />
        /// <devdoc>
        ///    <para>[To be supplied.]</para>
        /// </devdoc>
        protected internal override void Resolve(string contentType, Stream stream)
        {
            DiscoveryDocument document = null;

            if (ContentType.IsHtml(contentType))
            {
                string newRef = LinkGrep.SearchForLink(stream);
                if (newRef != null)
                {
                    string newUrl = UriToString(Url, newRef);
                    document = GetDocumentNoParse(ref newUrl, ClientProtocol);
                    Url      = newUrl;
                }
                else
                {
                    throw new InvalidContentTypeException(Res.GetString(Res.WebInvalidContentType, contentType), contentType);
                }
            }

            if (document == null)   // probably xml...
            {
                XmlTextReader reader = new XmlTextReader(new StreamReader(stream, RequestResponseUtils.GetEncoding(contentType)));
                reader.XmlResolver        = null;
                reader.WhitespaceHandling = WhitespaceHandling.Significant;
                reader.DtdProcessing      = DtdProcessing.Prohibit;
                if (DiscoveryDocument.CanRead(reader))
                {
                    // it's a discovery document, so just read it.
                    document = DiscoveryDocument.Read(reader);
                }
                else
                {
                    // check out the processing instructions before the first tag.  if any of them
                    // match the form specified in the DISCO spec, save the href.
                    stream.Position = 0;
                    XmlTextReader newReader = new XmlTextReader(new StreamReader(stream, RequestResponseUtils.GetEncoding(contentType)));
                    newReader.XmlResolver   = null;
                    newReader.DtdProcessing = DtdProcessing.Prohibit;
                    while (newReader.NodeType != XmlNodeType.Element)
                    {
                        if (newReader.NodeType == XmlNodeType.ProcessingInstruction)
                        {
                            // manually parse the PI contents since XmlTextReader won't automatically do it
                            StringBuilder sb = new StringBuilder("<pi ");
                            sb.Append(newReader.Value);
                            sb.Append("/>");
                            XmlTextReader piReader = new XmlTextReader(new StringReader(sb.ToString()));
                            piReader.XmlResolver   = null;
                            piReader.DtdProcessing = DtdProcessing.Prohibit;
                            piReader.Read();
                            string type      = piReader["type"];
                            string alternate = piReader["alternate"];
                            string href      = piReader["href"];
                            if (type != null && ContentType.MatchesBase(type, ContentType.TextXml) &&
                                alternate != null && string.Compare(alternate, "yes", StringComparison.OrdinalIgnoreCase) == 0 &&
                                href != null)
                            {
                                // we got a PI with the right attributes

                                // there is a link to a discovery document. follow it after fully qualifying it.
                                string newUrl = UriToString(Url, href);
                                document = GetDocumentNoParse(ref newUrl, ClientProtocol);
                                Url      = newUrl;
                                break;
                            }
                        }
                        newReader.Read();
                    }
                }
            }

            if (document == null)
            {
                // there is no discovery document at this location
                Exception exception;
                if (ContentType.IsXml(contentType))
                {
                    exception = new ArgumentException(Res.GetString(Res.WebInvalidFormat));
                }
                else
                {
                    exception = new InvalidContentTypeException(Res.GetString(Res.WebInvalidContentType, contentType), contentType);
                }
                throw new InvalidOperationException(Res.GetString(Res.WebMissingDocument, Url), exception);
            }

            ClientProtocol.References[Url] = this;
            ClientProtocol.Documents[Url]  = document;

            foreach (object o in document.References)
            {
                if (o is DiscoveryReference)
                {
                    DiscoveryReference r = (DiscoveryReference)o;
                    if (r.Url.Length == 0)
                    {
                        throw new InvalidOperationException(Res.GetString(Res.WebEmptyRef, r.GetType().FullName, Url));
                    }
                    r.Url = UriToString(Url, r.Url);
                    //All inheritors of DiscoveryReference that got URIs relative
                    //to Ref property should adjust them like ContractReference does here.
                    ContractReference cr = r as ContractReference;
                    if ((cr != null) && (cr.DocRef != null))
                    {
                        cr.DocRef = UriToString(Url, cr.DocRef);
                    }
                    r.ClientProtocol = ClientProtocol;
                    ClientProtocol.References[r.Url] = r;
                }
                else
                {
                    ClientProtocol.AdditionalInformation.Add(o);
                }
            }

            return;
        }
Exemplo n.º 4
0
        public DiscoveryDocument DiscoverAny(string url)
        {
            Type[]             refTypes    = WebServicesSection.Current.DiscoveryReferenceTypes;
            DiscoveryReference discoRef    = null;
            string             contentType = null;
            Stream             stream      = Download(ref url, ref contentType);

            Errors.Clear();
            bool      allErrorsAreHtmlContentType = true;
            Exception errorInValidDocument        = null;
            ArrayList specialErrorMessages        = new ArrayList();

            foreach (Type type in refTypes)
            {
                if (!typeof(DiscoveryReference).IsAssignableFrom(type))
                {
                    continue;
                }
                discoRef                = (DiscoveryReference)Activator.CreateInstance(type);
                discoRef.Url            = url;
                discoRef.ClientProtocol = this;
                stream.Position         = 0;
                Exception e = discoRef.AttemptResolve(contentType, stream);
                if (e == null)
                {
                    break;
                }

                Errors[type.FullName] = e;
                discoRef = null;

                InvalidContentTypeException e2 = e as InvalidContentTypeException;
                if (e2 == null || !ContentType.MatchesBase(e2.ContentType, "text/html"))
                {
                    allErrorsAreHtmlContentType = false;
                }

                InvalidDocumentContentsException e3 = e as InvalidDocumentContentsException;
                if (e3 != null)
                {
                    errorInValidDocument = e;
                    break;
                }

                if (e.InnerException != null && e.InnerException.InnerException == null)
                {
                    specialErrorMessages.Add(e.InnerException.Message);
                }
            }

            if (discoRef == null)
            {
                if (errorInValidDocument != null)
                {
                    StringBuilder errorMessage = new StringBuilder(Res.GetString(Res.TheDocumentWasUnderstoodButContainsErrors));
                    while (errorInValidDocument != null)
                    {
                        errorMessage.Append("\n  - ").Append(errorInValidDocument.Message);
                        errorInValidDocument = errorInValidDocument.InnerException;
                    }
                    throw new InvalidOperationException(errorMessage.ToString());
                }
                else if (allErrorsAreHtmlContentType)
                {
                    throw new InvalidOperationException(Res.GetString(Res.TheHTMLDocumentDoesNotContainDiscoveryInformation));
                }
                else
                {
                    bool same = specialErrorMessages.Count == Errors.Count && Errors.Count > 0;
                    for (int i = 1; same && i < specialErrorMessages.Count; i++)
                    {
                        if ((string)specialErrorMessages[i - 1] != (string)specialErrorMessages[i])
                        {
                            same = false;
                        }
                    }
                    if (same)
                    {
                        throw new InvalidOperationException(Res.GetString(Res.TheDocumentWasNotRecognizedAsAKnownDocumentType, specialErrorMessages[0]));
                    }
                    else
                    {
                        Exception     e;
                        StringBuilder errorMessage = new StringBuilder(Res.GetString(Res.WebMissingResource, url));
                        foreach (DictionaryEntry entry in Errors)
                        {
                            e = (Exception)(entry.Value);
                            string refType = (string)(entry.Key);
                            if (0 == string.Compare(refType, typeof(ContractReference).FullName, StringComparison.Ordinal))
                            {
                                refType = Res.GetString(Res.WebContractReferenceName);
                            }
                            else if (0 == string.Compare(refType, typeof(SchemaReference).FullName, StringComparison.Ordinal))
                            {
                                refType = Res.GetString(Res.WebShemaReferenceName);
                            }
                            else if (0 == string.Compare(refType, typeof(DiscoveryDocumentReference).FullName, StringComparison.Ordinal))
                            {
                                refType = Res.GetString(Res.WebDiscoveryDocumentReferenceName);
                            }
                            errorMessage.Append("\n- ").Append(Res.GetString(Res.WebDiscoRefReport,
                                                                             refType,
                                                                             e.Message));
                            while (e.InnerException != null)
                            {
                                errorMessage.Append("\n  - ").Append(e.InnerException.Message);
                                e = e.InnerException;
                            }
                        }
                        throw new InvalidOperationException(errorMessage.ToString());
                    }
                }
            }

            if (discoRef is DiscoveryDocumentReference)
            {
                return(((DiscoveryDocumentReference)discoRef).Document);
            }

            References[discoRef.Url] = discoRef;
            DiscoveryDocument doc = new DiscoveryDocument();

            doc.References.Add(discoRef);
            return(doc);
        }
 protected internal override void Resolve(string contentType, Stream stream)
 {
     DiscoveryDocument documentNoParse = null;
     if (ContentType.IsHtml(contentType))
     {
         string relUrl = LinkGrep.SearchForLink(stream);
         if (relUrl == null)
         {
             throw new InvalidContentTypeException(System.Web.Services.Res.GetString("WebInvalidContentType", new object[] { contentType }), contentType);
         }
         string url = DiscoveryReference.UriToString(this.Url, relUrl);
         documentNoParse = GetDocumentNoParse(ref url, base.ClientProtocol);
         this.Url = url;
     }
     if (documentNoParse == null)
     {
         XmlTextReader xmlReader = new XmlTextReader(new StreamReader(stream, RequestResponseUtils.GetEncoding(contentType))) {
             XmlResolver = null,
             WhitespaceHandling = WhitespaceHandling.Significant,
             DtdProcessing = DtdProcessing.Prohibit
         };
         if (DiscoveryDocument.CanRead(xmlReader))
         {
             documentNoParse = DiscoveryDocument.Read(xmlReader);
         }
         else
         {
             stream.Position = 0L;
             XmlTextReader reader2 = new XmlTextReader(new StreamReader(stream, RequestResponseUtils.GetEncoding(contentType))) {
                 XmlResolver = null,
                 DtdProcessing = DtdProcessing.Prohibit
             };
             while (reader2.NodeType != XmlNodeType.Element)
             {
                 if (reader2.NodeType == XmlNodeType.ProcessingInstruction)
                 {
                     StringBuilder builder = new StringBuilder("<pi ");
                     builder.Append(reader2.Value);
                     builder.Append("/>");
                     XmlTextReader reader3 = new XmlTextReader(new StringReader(builder.ToString())) {
                         XmlResolver = null,
                         DtdProcessing = DtdProcessing.Prohibit
                     };
                     reader3.Read();
                     string str3 = reader3["type"];
                     string strA = reader3["alternate"];
                     string str5 = reader3["href"];
                     if ((((str3 != null) && ContentType.MatchesBase(str3, "text/xml")) && ((strA != null) && (string.Compare(strA, "yes", StringComparison.OrdinalIgnoreCase) == 0))) && (str5 != null))
                     {
                         string str6 = DiscoveryReference.UriToString(this.Url, str5);
                         documentNoParse = GetDocumentNoParse(ref str6, base.ClientProtocol);
                         this.Url = str6;
                         break;
                     }
                 }
                 reader2.Read();
             }
         }
     }
     if (documentNoParse == null)
     {
         Exception exception;
         if (ContentType.IsXml(contentType))
         {
             exception = new ArgumentException(System.Web.Services.Res.GetString("WebInvalidFormat"));
         }
         else
         {
             exception = new InvalidContentTypeException(System.Web.Services.Res.GetString("WebInvalidContentType", new object[] { contentType }), contentType);
         }
         throw new InvalidOperationException(System.Web.Services.Res.GetString("WebMissingDocument", new object[] { this.Url }), exception);
     }
     base.ClientProtocol.References[this.Url] = this;
     base.ClientProtocol.Documents[this.Url] = documentNoParse;
     foreach (object obj2 in documentNoParse.References)
     {
         if (obj2 is DiscoveryReference)
         {
             DiscoveryReference reference = (DiscoveryReference) obj2;
             if (reference.Url.Length == 0)
             {
                 throw new InvalidOperationException(System.Web.Services.Res.GetString("WebEmptyRef", new object[] { reference.GetType().FullName, this.Url }));
             }
             reference.Url = DiscoveryReference.UriToString(this.Url, reference.Url);
             ContractReference reference2 = reference as ContractReference;
             if ((reference2 != null) && (reference2.DocRef != null))
             {
                 reference2.DocRef = DiscoveryReference.UriToString(this.Url, reference2.DocRef);
             }
             reference.ClientProtocol = base.ClientProtocol;
             base.ClientProtocol.References[reference.Url] = reference;
         }
         else
         {
             base.ClientProtocol.AdditionalInformation.Add(obj2);
         }
     }
 }
        protected internal override void Resolve(string contentType, Stream stream)
        {
            DiscoveryDocument documentNoParse = null;

            if (ContentType.IsHtml(contentType))
            {
                string relUrl = LinkGrep.SearchForLink(stream);
                if (relUrl == null)
                {
                    throw new InvalidContentTypeException(System.Web.Services.Res.GetString("WebInvalidContentType", new object[] { contentType }), contentType);
                }
                string url = DiscoveryReference.UriToString(this.Url, relUrl);
                documentNoParse = GetDocumentNoParse(ref url, base.ClientProtocol);
                this.Url        = url;
            }
            if (documentNoParse == null)
            {
                XmlTextReader xmlReader = new XmlTextReader(new StreamReader(stream, RequestResponseUtils.GetEncoding(contentType)))
                {
                    XmlResolver        = null,
                    WhitespaceHandling = WhitespaceHandling.Significant,
                    DtdProcessing      = DtdProcessing.Prohibit
                };
                if (DiscoveryDocument.CanRead(xmlReader))
                {
                    documentNoParse = DiscoveryDocument.Read(xmlReader);
                }
                else
                {
                    stream.Position = 0L;
                    XmlTextReader reader2 = new XmlTextReader(new StreamReader(stream, RequestResponseUtils.GetEncoding(contentType)))
                    {
                        XmlResolver   = null,
                        DtdProcessing = DtdProcessing.Prohibit
                    };
                    while (reader2.NodeType != XmlNodeType.Element)
                    {
                        if (reader2.NodeType == XmlNodeType.ProcessingInstruction)
                        {
                            StringBuilder builder = new StringBuilder("<pi ");
                            builder.Append(reader2.Value);
                            builder.Append("/>");
                            XmlTextReader reader3 = new XmlTextReader(new StringReader(builder.ToString()))
                            {
                                XmlResolver   = null,
                                DtdProcessing = DtdProcessing.Prohibit
                            };
                            reader3.Read();
                            string str3 = reader3["type"];
                            string strA = reader3["alternate"];
                            string str5 = reader3["href"];
                            if ((((str3 != null) && ContentType.MatchesBase(str3, "text/xml")) && ((strA != null) && (string.Compare(strA, "yes", StringComparison.OrdinalIgnoreCase) == 0))) && (str5 != null))
                            {
                                string str6 = DiscoveryReference.UriToString(this.Url, str5);
                                documentNoParse = GetDocumentNoParse(ref str6, base.ClientProtocol);
                                this.Url        = str6;
                                break;
                            }
                        }
                        reader2.Read();
                    }
                }
            }
            if (documentNoParse == null)
            {
                Exception exception;
                if (ContentType.IsXml(contentType))
                {
                    exception = new ArgumentException(System.Web.Services.Res.GetString("WebInvalidFormat"));
                }
                else
                {
                    exception = new InvalidContentTypeException(System.Web.Services.Res.GetString("WebInvalidContentType", new object[] { contentType }), contentType);
                }
                throw new InvalidOperationException(System.Web.Services.Res.GetString("WebMissingDocument", new object[] { this.Url }), exception);
            }
            base.ClientProtocol.References[this.Url] = this;
            base.ClientProtocol.Documents[this.Url]  = documentNoParse;
            foreach (object obj2 in documentNoParse.References)
            {
                if (obj2 is DiscoveryReference)
                {
                    DiscoveryReference reference = (DiscoveryReference)obj2;
                    if (reference.Url.Length == 0)
                    {
                        throw new InvalidOperationException(System.Web.Services.Res.GetString("WebEmptyRef", new object[] { reference.GetType().FullName, this.Url }));
                    }
                    reference.Url = DiscoveryReference.UriToString(this.Url, reference.Url);
                    ContractReference reference2 = reference as ContractReference;
                    if ((reference2 != null) && (reference2.DocRef != null))
                    {
                        reference2.DocRef = DiscoveryReference.UriToString(this.Url, reference2.DocRef);
                    }
                    reference.ClientProtocol = base.ClientProtocol;
                    base.ClientProtocol.References[reference.Url] = reference;
                }
                else
                {
                    base.ClientProtocol.AdditionalInformation.Add(obj2);
                }
            }
        }