Posts tagged URL

Lengthening short Urls in C#

If you deal with Twitter APIs, sooner or later, you’ll probably want to lengthen those short URLs back to long URLs. There’s a couple of services you can use to do this but it’s really quite easy so you might as well do it yourself. The code below follows each redirect until it reaches a real page (or an error), it then returns the last URL it finds.

        private string UrlLengthen(string url)
        {
            string newurl = url;

            bool redirecting = true;

            while (redirecting)
            {

                try
                {
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(newurl);
                    request.AllowAutoRedirect = false;
                    request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 4.0.20506)";
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                    if ((int)response.StatusCode == 301 || (int)response.StatusCode == 302)
                    {
                        string uriString = response.Headers["Location"];
                        Log.Debug("Redirecting " + newurl + " to " + uriString + " because " + response.StatusCode);
                        newurl = uriString;
                        // and keep going
                    }
                    else
                    {
                        Log.Debug("Not redirecting " + url + " because " + response.StatusCode);
                        redirecting = false;
                    }
                }
                catch (Exception ex)
                {
                    ex.Data.Add("url", newurl);
                    Exceptions.ExceptionRecord.ReportCritical(ex);
                    redirecting = false;
                }
            }
            return newurl;
        }






Shortened URLs should be treated like a Codec …

Codecs are used to compress data to send over the wire, but when it gets to the other end it is decoded back to its original form for display.

Shortened URLs are used to compress long URLs to send over Twitter.

So why aren’t they expanded again on the other side? Why do Twitter clients show short urls instead of expanding them back out to a long URL, or at least a display that tells you what the real web site is.

This has implications for reducing attacks hidden in short URLs and for allowing you to see at a glance that “Check out http://bit.ly/a567as” is actually the same site you’ve already read once today from another Tweet.

So for my own Twitter client I decided to expand all shortened URLs as far as I could go. Here’s a code snippet to do that:-

        /// <summary>

        /// Follow any redirects to get back to the original URL

        /// </summary>

        private string UrlLengthen(string url)

        {

            string newurl = url;

 

            bool redirecting = true;

 

            while (redirecting)

            {

 

                try

                {

                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(newurl);

                    request.AllowAutoRedirect = false;

                    request.UserAgent = “Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 4.0.20506)”;

                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                    if ((int)response.StatusCode == 301 || (int)response.StatusCode == 302)

                    {

                        string uriString = response.Headers["Location"];

                        Log.Debug(“Redirecting “ + newurl + ” to “ + uriString + ” because “ + response.StatusCode);

                        newurl = uriString;

                        // and keep going

                    }

                    else

                    {

                        Log.Debug(“Not redirecting “ + url + ” because “ + response.StatusCode);

                        redirecting = false;

                    }

                }

                catch (Exception ex)

                {

                    ex.Data.Add(“url”, newurl);

                    Exceptions.ExceptionRecord.ReportCritical(ex);

                    redirecting = false;

                }

            }

            return newurl;

        }