Android: HttpURLConnection not working properly

11,217

I've figured out what was the problem. It seems that using Java Desktop, the flag FollowRedirects is false by default (I suppose) and in Android it is true. getInstanceFollowRedirects is TRUE in both cases, so I don't really know why it works in a different way, but nevermind, the solution is perfect.

So it wasn't capturing the response of the POST request, it was following some redirection and trying to get the response from another GET auto request.

The solution was to do: connection.setInstanceFollowRedirects(false);


The way I could know this was looking into the network traffic using a network monitor:

From the Desktop application it was monitored this traffic:

23  10:08:50 03/10/2012 1.3944670   javaw.exe   192.168.1.36    www.XXXXXXXXX.com   HTTP    HTTP:Request, POST /es/login.php    {HTTP:8, TCP:7, IPv4:6}
24  10:08:50 03/10/2012 1.3954741   javaw.exe   192.168.1.36    www.XXXXXXXXX.com   HTTP    HTTP:HTTP Payload, URL: /es/login.php   {HTTP:8, TCP:7, IPv4:6}
32  10:08:50 03/10/2012 1.9811257   javaw.exe   www.XXXXXXXXX.com   192.168.1.36    HTTP    HTTP:Response, HTTP/1.1, Status: Moved temporarily, URL: /es/login.php  {HTTP:8, TCP:7, IPv4:6}

To monitor the traffic in Android application I had to run it in the emulator instead the phone.The result was:

60  9:59:34 03/10/2012  4.0285909   emulator-arm.exe    192.168.1.36    XX.XX.XXX.XXX   HTTP    HTTP:Request, POST /es/login.php    {HTTP:13, TCP:12, IPv4:11}
65  9:59:34 03/10/2012  4.1524735   emulator-arm.exe    192.168.1.36    XX.XX.XXX.XXX   HTTP    HTTP:HTTP Payload, URL: /es/login.php   {HTTP:13, TCP:12, IPv4:11}
75  9:59:35 03/10/2012  4.6276286   emulator-arm.exe    XX.XX.XXX.XXX   192.168.1.36    HTTP    HTTP:Response, HTTP/1.1, Status: Moved temporarily, URL: /es/login.php  {HTTP:13, TCP:12, IPv4:11}
77  9:59:35 03/10/2012  4.7095994   emulator-arm.exe    192.168.1.36    XX.XX.XXX.XXX   HTTP    HTTP:Request, GET /es/login.php, Query:FASID=a5e39f35325499e060f43d35bc956a45   {HTTP:13, TCP:12, IPv4:11}
311 9:59:55 03/10/2012  24.8355823  emulator-arm.exe    XX.XX.XXX.XXX   192.168.1.36    HTTP    HTTP:Response, HTTP/1.1, Status: Moved temporarily, URL: /es/login.php  {HTTP:13, TCP:12, IPv4:11}
313 9:59:55 03/10/2012  24.9384843  emulator-arm.exe    192.168.1.36    XX.XX.XXX.XXX   HTTP    HTTP:Request, GET /es/main.html, Query:FASID=a5e39f35325499e060f43d35bc956a45   {HTTP:13, TCP:12, IPv4:11}
317 9:59:55 03/10/2012  25.0535818  emulator-arm.exe    XX.XX.XXX.XXX   192.168.1.36    HTTP    HTTP:HTTP Payload, URL: /es/main.html   {HTTP:13, TCP:12, IPv4:11}

So, after applying the **connection.setInstanceFollowRedirects(false);** the result was the expected:

61  10:30:43 03/10/2012 4.9211205   emulator-arm.exe    192.168.1.36    XX.XX.XXX.XXX   HTTP    HTTP:Request, POST /es/login.php    {HTTP:14, TCP:13, IPv4:12}
64  10:30:43 03/10/2012 5.0362501   emulator-arm.exe    192.168.1.36    XX.XX.XXX.XXX   HTTP    HTTP:HTTP Payload, URL: /es/login.php   {HTTP:14, TCP:13, IPv4:12}
70  10:30:43 03/10/2012 5.5103384   emulator-arm.exe    XX.XX.XXX.XXX   192.168.1.36    HTTP    HTTP:Response, HTTP/1.1, Status: Moved temporarily, URL: /es/login.php  {HTTP:14, TCP:13, IPv4:12}

Thank you for all your answers and interest.

Share:
11,217
giorgiline
Author by

giorgiline

Updated on June 15, 2022

Comments

  • giorgiline
    giorgiline almost 2 years

    I'm trying to get the cookies from a website after sending user credentials through a POST Request an it seems that it doesn't work in android this way. ¿Am I doing something bad?. Please help. I've searched here in different posts but there's no useful answer.

    It's curious that this run in a desktop Java implementation it works perfect but it crashes in Android platform. And it is exactly the same code, specifically when calling HttpURLConnection.getHeaderFields(), it also happens with other member methods. It's a simple code and I don't know why the hell isn't working.

    DESKTOP CODE: This goes just in the main()

    HttpURLConnection connection = null;
            OutputStream out = null;
            try {                   
                URL url = new URL("http://www.XXXXXXXX.php");           
                String charset = "UTF-8";       
    
                String postback = "1";
                String user = "XXXXXXXXX";
                String password = "XXXXXXXX";
                String rememberme = "on";
                String query = String.format("postback=%s&user=%s&password=%s&rememberme=%s"
                        , URLEncoder.encode(postback, charset)
                        , URLEncoder.encode(user,charset)
                        , URLEncoder.encode(password, charset)
                        , URLEncoder.encode(rememberme, charset));
    
                connection = (HttpURLConnection)url.openConnection();
                connection.setRequestMethod("POST");
                connection.setRequestProperty("Accept-Charset", charset);
                connection.setDoOutput(true);           
                connection.setFixedLengthStreamingMode(query.length());
    
                out = connection.getOutputStream ();
                out.write(query.getBytes(charset));
    
                if (connection.getHeaderFields() == null){
                    System.out.println("Header null");
                }else{
                    for (String cookie: connection.getHeaderFields().get("Set-Cookie")){
                        System.out.println(cookie.split(";", 2)[0]);
                    }
                }
            } catch (IOException e){
                e.printStackTrace();
            } finally {
                try { out.close();} catch (IOException e) { e.printStackTrace();}
                connection.disconnect();            
            }
    

    So the output is:

        login_key=20ad8177db4eca3f057c14a64bafc2c9
        FASID=cabf20cc471fcacacdc7dc7e83768880
        track=30c8183e4ebbe8b3a57b583166326c77
        client-data=%7B%22ism%22%3Afalse%2C%22showm%22%3Afalse%2C%22ts%22%3A1349189669%7D
    

    ANDROID CODE: This goes inside doInBackground AsyncTask body

    HttpURLConnection connection = null;
                OutputStream out = null;
                try {                   
                    URL url = new URL("http://www.XXXXXXXXXXXXXX.php");         
                    String charset = "UTF-8";       
    
                    String postback = "1";
                    String user = "XXXXXXXXX";
                    String password = "XXXXXXXX";
                    String rememberme = "on";
                    String query = String.format("postback=%s&user=%s&password=%s&rememberme=%s"
                            , URLEncoder.encode(postback, charset)
                            , URLEncoder.encode(user,charset)
                            , URLEncoder.encode(password, charset)
                            , URLEncoder.encode(rememberme, charset));
    
                    connection = (HttpURLConnection)url.openConnection();
                    connection.setRequestMethod("POST");
                    connection.setRequestProperty("Accept-Charset", charset);
                    connection.setDoOutput(true);           
                    connection.setFixedLengthStreamingMode(query.length());
    
                    out = connection.getOutputStream ();
                    out.write(query.getBytes(charset));
    
                    if (connection.getHeaderFields() == null){
                        Log.v(TAG, "Header null");
                    }else{
                        for (String cookie: connection.getHeaderFields().get("Set-Cookie")){
                            Log.v(TAG, cookie.split(";", 2)[0]);
                        }
                    }
                } catch (IOException e){
                    e.printStackTrace();
                } finally {
                    try { out.close();} catch (IOException e) { e.printStackTrace();}
                    connection.disconnect();            
                }
    

    And here there is no output, it seems that connection.getHeaderFields() doesn't return result. It takes al least 30 seconds to show the Log:

    10-02 16:56:25.918: V/class com.giorgi.myproject.activities.HomeActivity(2596): Header null
    

    TESTED ON A GALAXY NEXUS

  • giorgiline
    giorgiline over 11 years
    So what would you recommend me to look into?
  • Emil Davtyan
    Emil Davtyan over 11 years
    Can you open it in the mobile browser?
  • giorgiline
    giorgiline over 11 years
    Checked. Those are the only two permissions added in the manifest.
  • giorgiline
    giorgiline over 11 years
    I've tried several orders of setting properties but it seems that's not the reason.
  • Mr_and_Mrs_D
    Mr_and_Mrs_D over 10 years
    conn.setDoOutput(true) will set the method to POST