Search code examples
javahttpurlconnectionhttp-authentication

HttpURLConnection authentication mode


I'm using HttpURLConnection class to manage HTTP connections in my Android app. Problem is, on some servers, I have a code 401 using an URL which working on a Internet navigator. I initialize connection with basic authentication, but I think these servers need an other mode. I know it works with libCURL and the following instruction:

curl_easy_setopt(pCurlHandle, CURLOPT_HTTPAUTH, CURLAUTH_ANY);

But is there an way to doing something like that on Android? Currently, I do that:

...
connection.setRequestProperty("Authorization", "Basic " +  Base64.encode("username:password"));
...

I tried with Authenticator too:

Authenticator.setDefault(new Authenticator() {

    @Override
    protected PasswordAuthentication getPasswordAuthentication()
    {
        return new PasswordAuthentication("username", "password".toCharArray());
    }
});

But I still have a 401 in my app. Any idea?


Solution

  • Well, this post really helped me (but I don't use Authenticator class at all) and now my code do the job like that (if authentication is needed):

    • Initialize my HttpURLConnection object with Basic authentication (see the first Java sample in my question's code)

    • Test if I receive a code 401 and if it is, check if server was excepted for a Digest authentication analyzing response headers.

    • Retry with a manually-built Digest request property (see the post I mentioned)

    • And it works!

    I hope this answer'll help someone!