Forum Discussion

HairyWombat's avatar
HairyWombat
Helpful | Level 6
2 years ago
Solved

Problem downloading file using Dropbox-provided URL

Hi   1. I'm developing an app for iOS and Android. Users can enter the url of a file they would like to download. They might choose a Dropbox url like https://www.dropbox.com/s/fzv989hz5mazhqw/Repl...
  • HairyWombat's avatar
    HairyWombat
    2 years ago

    Hi Greg-DB

     

    Hey I really appreciate the effort you and the team have put in.

     

    What I found was:

     

    1. Yes, curl works with the url - I switched from Mac to Windows and curl worked. Bash both times.

     

    2. Fiddler also works with the URL.

     

    3. My published code fails using automatic redirect. It works for you - the difference may be that I'm using Microsoft Xamarin on Mac.

     

    4. In the second redirect, Dropbox proposes https://uc012d2e25383f12de25c9db8029.dl.dropboxusercontent.com/cd/0/get/B-Dfp2veRgmAiBVuB2GBdOb2SPrjBQh9t0CkeebfBm8SdzO4_8rntEJaHCvdDqpc6-v3DZF5AGyupcRw9SOyfq8l_wlZmj63OWNOQpPgmBUcisawx6C0OptaJHDM9IoDPKvPtxaegRX8av8D36sJb1hcObvW7harZlcWcGjIqXz0aw/file?dl=1#    -- which strictly speaking is not a valid url because of the trailing #.

    5. I solved the problem by handling the redirects myself and url-encoding the #.

     

    So, Xamarin could do better. But also, Dropbox really should not be sending invalid urls.  🙂

     

    Code below fyi.

     

    Cheers

    Bill

     

    ----------------------

    httpClientHandler = new HttpClientHandler
    {
    AllowAutoRedirect = false
    };

    ----------------------

    try
    {
        // Here change ?dl=0 to ?dl=1   *****
        // webUrl = "https://www.howsmyssl.com/a/check";    // Debug - to check TLS version. It is TLS 1.2. (June 2023)
     
        HttpResponseMessage response = await httpClient.GetAsync ( webUrl );
     
        int redirectCount = 0;
        while ( redirectCount < 20 )
        {
            if ( response.StatusCode == HttpStatusCode.Redirect )
            {
                string redirectUrl;
     
                if ( response.Headers != null && response.Headers.Location != null )
                {
                    if ( response.Headers.Location.IsAbsoluteUri )
                        redirectUrl = response.Headers.Location.AbsoluteUri;
                    else
                   {
                        string[] splits = webUrl.Split ('/' );
                        redirectUrl = "https://" + splits [2] + response.Headers.Location.OriginalString;
                   }
     
                   redirectUrl = redirectUrl.Replace ( "#", "#".UrlEncode () );
                   response = await httpClient.GetAsync ( redirectUrl );
                   if ( response.StatusCode != HttpStatusCode.Redirect )
                       break;
                }
                redirectCount++;
            }
        }
     
        using ( MemoryStream memoryStream = new MemoryStream () )
        {
            using ( Stream stream = await response.Content.ReadAsStreamAsync () )
            {
                stream.CopyTo ( memoryStream );
            }
            memoryStream.Seek ( 0, SeekOrigin.Begin );
            bytes = memoryStream.ToArray ();
        }
     
        return bytes;
    }
    catch ( Exception ex )
    {
        // ...
        }
    }

     

    ----------------------