Note that there are some explanatory texts on larger screens.

plurals
  1. POAuthorization fails in HttpURLConnection in File Download Android
    text
    copied!<p>I want to download a zip file from the server in Android and for that I am using the below code. It also requires authorization so for that I am passing the username and password in the request of the URL connection. But I am always getting <strong>401-Response code(UNAUTHORIZED)</strong>.</p> <p>Code :-</p> <pre><code>protected String doInBackground(final String... params) { int count; try { if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { /*Authenticator.setDefault(new Authenticator(){ protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(Constants.USERNAME,Constants.PASSWORD.toCharArray()); }});*/ Log.i(TAG, "URL == " + params[0]); final URL url = new URL(params[0]); final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); final String auth = new String(Constants.USERNAME + ":" + Constants.PASSWORD); connection.setRequestProperty("Authorization", "Basic " + Base64.encodeToString(auth.getBytes(), Base64.URL_SAFE)); //connection.addRequestProperty("Authorization", "Basic " + Base64.encodeToString(auth.getBytes(), Base64.DEFAULT)); connection.setUseCaches(false); connection.setConnectTimeout(5000); connection.setDoOutput(true); connection.connect(); Log.i(TAG, "Response == " + connection.getResponseMessage()); Log.i(TAG, "Response Code == " + connection.getResponseCode()); // download the file final InputStream input = new BufferedInputStream(connection.getInputStream()); // Path to the just created empty db // this will be useful so that you can show a tipical 0-100% progress bar lenghtOfFile = connection.getContentLength(); lengthOfFileInMB = lenghtOfFile / 1048576; Log.i(TAG, "File Size in MB = " + lengthOfFileInMB); outFileName = Environment.getExternalStorageDirectory() + File.separator + ZIP_NAME; final File file = new File(outFileName); if (!file.exists()) { file.createNewFile(); } // Output stream final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file)); final byte data[] = new byte[lenghtOfFile]; long total = 0; while ((count = input.read(data)) != -1) { total += count; publishProgress("" + total); bufferedOutputStream.write(data, 0, count); } bufferedOutputStream.flush(); bufferedOutputStream.close(); input.close(); } else { Toast.makeText(DashboardActivity.this, "MEDIA IS NOT MOUNTED.", Toast.LENGTH_LONG).show(); } } catch (final MalformedURLException e) { flag = false; Log.e(TAG, e.getMessage(), e); } catch (final FileNotFoundException e) { flag = false; Log.e(TAG, e.getMessage(), e); } catch (final IOException e) { flag = false; Log.e(TAG, e.getMessage(), e); } catch (final Exception e) { Log.e(TAG, e.getMessage(), e); } return null; } </code></pre> <p><strong>I am having the web service in the same server and for getting JSON/XML response I used the DefaultHttpClient. That is working perfectly fine and I am getting the response code OK as well. I don't know why it is not authorizing at the time of URLConnection.</strong></p> <p>Here is the code of it.</p> <pre><code>String line = null; try { final URL urlObj = new URL(url); final HttpHost host = new HttpHost(urlObj.getHost(), urlObj.getPort(), urlObj.getProtocol()); final HttpParams httpParameters = new BasicHttpParams(); // Set the timeout in milliseconds until a connection is established. HttpConnectionParams.setConnectionTimeout(httpParameters, Constants.CONNECTION_TIME_OUT); // Set the default socket timeout (SO_TIMEOUT) // in milliseconds which is the timeout for waiting for data. HttpConnectionParams.setSoTimeout(httpParameters, Constants.CONNECTION_TIME_OUT); final DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters); final AuthScope scope = new AuthScope(urlObj.getHost(), urlObj.getPort()); final UsernamePasswordCredentials creds = new UsernamePasswordCredentials(Constants.USERNAME, Constants.PASSWORD); final CredentialsProvider credentialProvider = new BasicCredentialsProvider(); credentialProvider.setCredentials(scope, creds); final HttpContext credContext = new BasicHttpContext(); credContext.setAttribute(ClientContext.CREDS_PROVIDER, credentialProvider); final HttpGet job = new HttpGet(url); job.addHeader("USER-AGENT", userAgentString); final HttpResponse httpResponse = httpClient.execute(host,job,credContext); final HttpEntity httpEntity = httpResponse.getEntity(); try { line = EntityUtils.toString(httpEntity); } catch (final ParseException e) { line = "Error"; Log.e("Parse Error", e.getMessage().toString()); } catch (final IOException e) { line = "Error"; Log.e("IOException Error", e.getMessage().toString()); } final StatusLine status = httpResponse.getStatusLine(); Log.d("Authentication Status = ", status.toString()); } catch (final ClientProtocolException e1) { line = "Error"; Log.e("ClientPrtocol Error", e1.getMessage().toString()); } catch (final ConnectTimeoutException e1) { line = "ConnectionTimeOut"; Log.e("Connection Error", e1.getMessage().toString()); } catch (final IOException e1) { Log.e("IO Error", e1.getMessage().toString()); line = "Error"; } </code></pre> <p>I also tried to add the following code in URLConnection for authentication but that also not worked for me.</p> <pre><code>Authenticator.setDefault(new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(loginNameString, passwordString.toCharArray()); } }); </code></pre> <p><strong>Questions:-</strong></p> <p><strong>1) Is it problem at server side or at android side?</strong></p> <p><strong>2) Can I download the file using the defaulthttpclient code that I have? If yes any clue how to download it, because I think i can only get content from that way not the whole file.</strong></p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload