Ejemplo n.º 1
0
        public override async Task <HttpClientEntryItemCollectionResultWrapper> GetEntries(Uri entriesUrl, string feedId)
        {
            HttpClientEntryItemCollectionResultWrapper res = new HttpClientEntryItemCollectionResultWrapper();

            List <EntryItem> list = new List <EntryItem>();

            res.Entries = list;

            if (!(entriesUrl.Scheme.Equals("http") || entriesUrl.Scheme.Equals("https")))
            {
                ToDebugWindow("<< Invalid URI scheme:"
                              + Environment.NewLine
                              + entriesUrl.Scheme
                              + Environment.NewLine);

                InvalidUriScheme(res.Error, entriesUrl.Scheme, "FeedClient: GetEntries");
                res.IsError = true;

                return(res);
            }

            try
            {
                var HTTPResponseMessage = await _HTTPConn.Client.GetAsync(entriesUrl);

                if (HTTPResponseMessage.IsSuccessStatusCode)
                {
                    //string s = await HTTPResponseMessage.Content.ReadAsStringAsync();

                    /*
                     * ToDebugWindow(">> HTTP Request: GET "
                     + entriesUrl.AbsoluteUri
                     + Environment.NewLine
                     + "<< HTTP Response " + HTTPResponseMessage.StatusCode.ToString()
                     +  //+ Environment.NewLine + s + Environment.NewLine);
                     + Environment.NewLine);
                     */

                    var source = await HTTPResponseMessage.Content.ReadAsStreamAsync();

                    // Load XML
                    XmlDocument xdoc = new XmlDocument();
                    try
                    {
                        XmlReader reader = XmlReader.Create(source);
                        xdoc.Load(reader);
                    }
                    catch (Exception e)
                    {
                        ToDebugWindow("<< Invalid XML document returned: " + entriesUrl.AbsoluteUri
                                      + Environment.NewLine
                                      + e.Message
                                      + Environment.NewLine);;

                        InvalidXml(res.Error, e.Message, "FeedClient: GetEntries");
                        res.IsError = true;

                        return(res);
                    }

                    // RSS 2.0
                    if (xdoc.DocumentElement.LocalName.Equals("rss"))
                    {
                        XmlNamespaceManager NsMgr = new XmlNamespaceManager(xdoc.NameTable);
                        NsMgr.AddNamespace("dc", "http://purl.org/dc/elements/1.1/");

                        XmlNodeList entryList;
                        entryList = xdoc.SelectNodes("//rss/channel/item");
                        if (entryList == null)
                        {
                            res.Entries = list;

                            return(res);
                        }

                        foreach (XmlNode l in entryList)
                        {
                            FeedEntryItem ent = new FeedEntryItem("", feedId, this);

                            FillEntryItemFromXmlRss(ent, l, NsMgr);

                            if (!string.IsNullOrEmpty(ent.EntryId))
                            {
                                list.Add(ent);
                            }
                        }

                        //
                        //await GetImages(list);
                    }
                    // RSS 1.0
                    else if (xdoc.DocumentElement.LocalName.Equals("RDF"))
                    {
                        XmlNamespaceManager NsMgr = new XmlNamespaceManager(xdoc.NameTable);
                        NsMgr.AddNamespace("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
                        NsMgr.AddNamespace("rss", "http://purl.org/rss/1.0/");
                        NsMgr.AddNamespace("dc", "http://purl.org/dc/elements/1.1/");

                        XmlNodeList entryList = xdoc.SelectNodes("//rdf:RDF/rss:item", NsMgr);
                        if (entryList == null)
                        {
                            res.Entries = list;

                            return(res);
                        }

                        foreach (XmlNode l in entryList)
                        {
                            FeedEntryItem ent = new FeedEntryItem("", feedId, this);

                            FillEntryItemFromXmlRdf(ent, l, NsMgr);

                            if (!string.IsNullOrEmpty(ent.EntryId))
                            {
                                list.Add(ent);
                            }
                        }

                        //
                        //await GetImages(list);
                    }
                    else if (xdoc.DocumentElement.LocalName.Equals("feed"))
                    {
                        if (xdoc.DocumentElement.NamespaceURI.Equals("http://www.w3.org/2005/Atom"))
                        {
                            XmlNamespaceManager atomNsMgr = new XmlNamespaceManager(xdoc.NameTable);
                            atomNsMgr.AddNamespace("atom", "http://www.w3.org/2005/Atom");
                            atomNsMgr.AddNamespace("app", "http://www.w3.org/2007/app");

                            XmlNodeList entryList;
                            entryList = xdoc.SelectNodes("//atom:feed/atom:entry", atomNsMgr);
                            if (entryList == null)
                            {
                                res.Entries = list;

                                return(res);
                            }

                            foreach (XmlNode l in entryList)
                            {
                                FeedEntryItem ent = new FeedEntryItem("", feedId, this);
                                //ent.Status = EditEntryItem.EditStatus.esNormal;

                                FillEntryItemFromXmlAtom10(ent, l, atomNsMgr, feedId);

                                if (!string.IsNullOrEmpty(ent.EntryId))
                                {
                                    list.Add(ent);
                                }
                            }

                            //
                            //await GetImages(list);
                        }
                        // Old Atom 0.3
                        else if (xdoc.DocumentElement.NamespaceURI.Equals("http://purl.org/atom/ns#"))
                        {
                            XmlNamespaceManager atomNsMgr = new XmlNamespaceManager(xdoc.NameTable);
                            atomNsMgr.AddNamespace("atom", "http://purl.org/atom/ns#");
                            atomNsMgr.AddNamespace("dc", "http://purl.org/dc/elements/1.1/");

                            XmlNodeList entryList;
                            entryList = xdoc.SelectNodes("//atom:feed/atom:entry", atomNsMgr);
                            if (entryList == null)
                            {
                                res.Entries = list;

                                return(res);
                            }

                            foreach (XmlNode l in entryList)
                            {
                                FeedEntryItem ent = new FeedEntryItem("", feedId, this);
                                //ent.Status = EditEntryItem.EditStatus.esNormal;

                                FillEntryItemFromXmlAtom03(ent, l, atomNsMgr);

                                if (!string.IsNullOrEmpty(ent.EntryId))
                                {
                                    list.Add(ent);
                                }
                            }

                            //
                            //await GetImages(list);

                            ToDebugWindow("<< Old version of Atom feed format detected. Update recommended: " + entriesUrl.AbsoluteUri
                                          + Environment.NewLine);
                        }
                        else
                        {
                            ToDebugWindow("<< FormatUndetermined @FeedClient:[email protected]"
                                          + Environment.NewLine);

                            FormatUndetermined(res.Error, "FeedClient:GetEntries");
                            res.IsError = true;

                            return(res);
                        }
                    }
                    else
                    {
                        ToDebugWindow("<< FormatUndetermined @FeedClient:GetEntries:xdoc.DocumentElement.LocalName/NamespaceURI"
                                      + Environment.NewLine);

                        FormatUndetermined(res.Error, "FeedClient:GetEntries");
                        res.IsError = true;

                        return(res);
                    }
                }
                // HTTP non 200 status code.
                else
                {
                    var contents = await HTTPResponseMessage.Content.ReadAsStringAsync();

                    if (contents != null)
                    {
                        ToDebugWindow(">> HTTP Request: GET "
                                      + entriesUrl.AbsoluteUri
                                      + Environment.NewLine
                                      + "<< HTTP Response " + HTTPResponseMessage.StatusCode.ToString()
                                      + Environment.NewLine
                                      + contents + Environment.NewLine);
                    }

                    NonSuccessStatusCode(res.Error, HTTPResponseMessage.StatusCode.ToString(), "_HTTPConn.Client.GetAsync", "FeedClient:GetEntries");
                    res.IsError = true;

                    return(res);
                }
            }
            // Internet connection errors
            catch (System.Net.Http.HttpRequestException e)
            {
                Debug.WriteLine("<< HttpRequestException: " + e.Message);

                ToDebugWindow(" << HttpRequestException: "
                              + Environment.NewLine
                              + e.Message
                              + Environment.NewLine);

                HttpReqException(res.Error, e.Message, "_HTTPConn.Client.GetAsync", "FeedClient:GetEntries");
                res.IsError = true;

                return(res);
            }
            catch (Exception e)
            {
                Debug.WriteLine("HTTP error: " + e.Message);

                ToDebugWindow("<< HTTP error:"
                              + Environment.NewLine
                              + e.Message
                              + Environment.NewLine);

                GenericException(res.Error, "", ErrorObject.ErrTypes.HTTP, "HTTP request error (Exception)", e.Message, "_HTTPConn.Client.GetAsync", "FeedClient:GetEntries");
                res.IsError = true;

                return(res);
            }

            return(res);
        }
Ejemplo n.º 2
0
        public override async Task <HttpClientEntryItemCollectionResultWrapper> GetEntries(Uri entriesUrl, string serviceId)
        {
            HttpClientEntryItemCollectionResultWrapper res = new HttpClientEntryItemCollectionResultWrapper();

            List <EntryItem> list = new List <EntryItem>();

            res.Entries = list;

            //System.Diagnostics.Debug.WriteLine("GetEntries Uri: " + entriesUrl.AbsoluteUri);
            var HTTPResponseMessage = await _HTTPConn.Client.GetAsync(entriesUrl);

            if (HTTPResponseMessage.IsSuccessStatusCode)
            {
                string s = await HTTPResponseMessage.Content.ReadAsStringAsync();

                ToDebugWindow(">> HTTP Request GET "
                              + Environment.NewLine
                              + entriesUrl.AbsoluteUri
                              + Environment.NewLine + Environment.NewLine
                              + "<< HTTP Response " + HTTPResponseMessage.StatusCode.ToString()
                              + Environment.NewLine
                              + s + Environment.NewLine);

                //System.Diagnostics.Debug.WriteLine("GET entries response: " + s);

                /*
                 * <?xml version="1.0" encoding="utf-8"?>
                 * <feed xmlns="http://www.w3.org/2005/Atom">
                 * <title type="text">dive into mark</title>
                 * <subtitle type="html">
                 * A &lt;em&gt;lot&lt;/em&gt; of effort
                 * went into making this effortless
                 * </subtitle>
                 * <updated>2005-07-31T12:29:29Z</updated>
                 * <id>tag:example.org,2003:3</id>
                 * <link rel="alternate" type="text/html"
                 * hreflang="en" href="http://example.org/"/>
                 * <link rel="self" type="application/atom+xml"
                 * href="http://example.org/feed.atom"/>
                 * <rights>Copyright (c) 2003, Mark Pilgrim</rights>
                 * <generator uri="http://www.example.com/" version="1.0">
                 * Example Toolkit
                 * </generator>
                 * <entry>
                 * <title>Atom draft-07 snapshot</title>
                 * <link rel="alternate" type="text/html"
                 * href="http://example.org/2005/04/02/atom"/>
                 * <link rel="enclosure" type="audio/mpeg" length="1337"
                 * href="http://example.org/audio/ph34r_my_podcast.mp3"/>
                 * <id>tag:example.org,2003:3.2397</id>
                 * <updated>2005-07-31T12:29:29Z</updated>
                 * <published>2003-12-13T08:29:29-04:00</published>
                 * <author>
                 * <name>Mark Pilgrim</name>
                 * <uri>http://example.org/</uri>
                 * <email>[email protected]</email>
                 * </author>
                 * <contributor>
                 * <name>Sam Ruby</name>
                 * </contributor>
                 * <contributor>
                 * <name>Joe Gregorio</name>
                 * </contributor>
                 * <content type="xhtml" xml:lang="en"
                 * xml:base="http://diveintomark.org/">
                 * <div xmlns="http://www.w3.org/1999/xhtml">
                 * <p><i>[Update: The Atom draft is finished.]</i></p>
                 * </div>
                 * </content>
                 * </entry>
                 * </feed>
                 */

                string contenTypeString = HTTPResponseMessage.Content.Headers.GetValues("Content-Type").FirstOrDefault();

                if (!contenTypeString.StartsWith("application/atom+xml"))
                {
                    System.Diagnostics.Debug.WriteLine("Content-Type is invalid: " + contenTypeString);

                    ToDebugWindow("<< Content-Type is invalid: " + contenTypeString
                                  + Environment.NewLine
                                  + "expecting " + "application/atom+xml"
                                  + Environment.NewLine);

                    InvalidContentType(res.Error, "Content-Type is invalid", "HttpResponse.Content.Headers.GetValues", "AtomPubClient: GetEntries");
                    res.IsError = true;

                    return(res as HttpClientEntryItemCollectionResultWrapper);
                }

                XmlDocument xdoc = new XmlDocument();
                try
                {
                    xdoc.LoadXml(s);
                }
                catch (Exception e)
                {
                    System.Diagnostics.Debug.WriteLine("LoadXml failed: " + e.Message);

                    ToDebugWindow("<< Invalid XML returned:"
                                  + Environment.NewLine
                                  + e.Message
                                  + Environment.NewLine);

                    InvalidXml(res.Error, e.Message, "AtomPubClient: GetEntries");
                    res.IsError = true;

                    return(res);
                }

                XmlNamespaceManager atomNsMgr = new XmlNamespaceManager(xdoc.NameTable);
                atomNsMgr.AddNamespace("atom", "http://www.w3.org/2005/Atom");
                atomNsMgr.AddNamespace("app", "http://www.w3.org/2007/app");

                XmlNodeList entryList;
                entryList = xdoc.SelectNodes("//atom:feed/atom:entry", atomNsMgr);
                if (entryList == null)
                {
                    if (entryList == null)
                    {
                        res.Entries = list;

                        return(res);
                    }
                }

                foreach (XmlNode l in entryList)
                {
                    AtomEntry ent = new AtomEntry("", serviceId, this);

                    FillEntryItemFromXML(ent, l, atomNsMgr, serviceId);

                    list.Add(ent);
                }
            }
            else
            {
                var contents = await HTTPResponseMessage.Content.ReadAsStringAsync();

                if (contents != null)
                {
                    ToDebugWindow(">> HTTP Request GET (Failed)"
                                  + Environment.NewLine
                                  + entriesUrl.AbsoluteUri
                                  + Environment.NewLine + Environment.NewLine
                                  + "<< HTTP Response " + HTTPResponseMessage.StatusCode.ToString()
                                  + Environment.NewLine
                                  + contents + Environment.NewLine);
                }
            }

            return(res);
        }