Android: org.apache.http.NoHttpResponseException: destination server could not respond

My Android application uses HttpClient / HttpGet to access the REST API. I also installed:

httpGet.addHeader("Authorization", "Basic " + basicAuth); 

... which sends the base coded "username: password" to the server. For testing, I just use HTTP, not HTTPS, to connect to the server.

Whenever I call execute in HttpClient, I get the following exception:

 07-28 10:51:39.610: I/# PA #(12112): org.apache.http.NoHttpResponseException: The target server failed to respond 07-28 10:51:39.610: I/# PA #(12112): at org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:85) 07-28 10:51:39.610: I/# PA #(12112): at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174) 07-28 10:51:39.610: I/# PA #(12112): at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:180) 07-28 10:51:39.610: I/# PA #(12112): at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235) 07-28 10:51:39.610: I/# PA #(12112): at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259) 07-28 10:51:39.610: I/# PA #(12112): at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279) 07-28 10:51:39.610: I/# PA #(12112): at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121) 07-28 10:51:39.610: I/# PA #(12112): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:428) 07-28 10:51:39.610: I/# PA #(12112): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 07-28 10:51:39.610: I/# PA #(12112): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 07-28 10:51:39.610: I/# PA #(12112): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 07-28 10:51:39.610: I/# PA #(12112): at org.thomasamsler.android.app.tasks.HttpGetTask.doInBackground(HttpGetTask.java:87) 07-28 10:51:39.610: I/# PA #(12112): at org.foo.android.app.tasks.HttpGetTask.doInBackground(HttpGetTask.java:1) 07-28 10:51:39.610: I/# PA #(12112): at android.os.AsyncTask$2.call(AsyncTask.java:264) 07-28 10:51:39.610: I/# PA #(12112): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 07-28 10:51:39.610: I/# PA #(12112): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 07-28 10:51:39.610: I/# PA #(12112): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 07-28 10:51:39.610: I/# PA #(12112): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 07-28 10:51:39.610: I/# PA #(12112): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 07-28 10:51:39.610: I/# PA #(12112): at java.lang.Thread.run(Thread.java:856) 

Note:

In fact, I have three development servers with different hosting providers. When connecting to two of them, I get the above error. When connected to a third server, everything works fine. In addition, other GET and POST requests work fine on all three development servers.

So, I am wondering if there is anything specific in the HTTP GET when setting the base auth header.

I can also make a call using "curl" for the REST API in question without any problems.

code:

 import java.io.ByteArrayOutputStream; import java.io.IOException; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import android.os.AsyncTask; import android.util.Log; public class HttpGetTask extends AsyncTask<HttpGetRequestArgs, Void, String> implements AppConstants { private HttpTaskNotifier mNotifier; private HttpResponse mHttpResponse; private int mHttpStatusCodeOk; private int mHttpStatusCode; private int mErrorCode = AppConstants.NO_ERROR; public HttpGetTask(int httpStatusCodeOk, HttpTaskNotifier notifier) { mNotifier = notifier; mHttpStatusCodeOk = httpStatusCodeOk; } @Override protected String doInBackground(HttpGetRequestArgs... args) { HttpGetRequestArgs httpGetRequestArgs = args[0]; HttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = null; try { httpGet = new HttpGet(httpGetRequestArgs.getUrl()); String apiKey = httpGetRequestArgs.getApiKey(); if (null != apiKey && !"".equals(apiKey)) { httpGet.addHeader("Authorization", "ApiKey " + apiKey); } String basicAuth = httpGetRequestArgs.getBasicAuth(); if (null != basicAuth && !"".equals(basicAuth)) { httpGet.addHeader("Authorization", "Basic " + basicAuth); } } catch (IllegalArgumentException e) { Log.e(LOG_TAG, "EXCEPTION", e); return null; } try { mHttpResponse = httpClient.execute(httpGet); } catch (ClientProtocolException e) { mErrorCode = AppConstants.REST_ERROR; return null; } catch (IOException e) { mErrorCode = AppConstants.REST_ERROR; return null; } catch (IllegalArgumentException iae) { mErrorCode = AppConstants.REST_ERROR; return null; } if (null == mHttpResponse) { mErrorCode = AppConstants.REST_ERROR; return null; } mHttpStatusCode = mHttpResponse.getStatusLine().getStatusCode(); if (mHttpStatusCodeOk != mHttpStatusCode) { mErrorCode = AppConstants.REST_ERROR; return null; } ByteArrayOutputStream out = new ByteArrayOutputStream(); HttpEntity httpEntity = mHttpResponse.getEntity(); if (null == httpEntity) { mErrorCode = AppConstants.REST_ERROR; return null; } try { httpEntity.writeTo(out); out.close(); } catch (IOException ioe) { mErrorCode = AppConstants.REST_ERROR; return null; } return out.toString(); } @Override protected void onPostExecute(String content) { if (AppConstants.NO_ERROR != mErrorCode) { mNotifier.onError(mErrorCode); } mNotifier.doProcess(content); } @Override protected void onCancelled() { mNotifier.doCancel(); } } 
+4
source share
2 answers

Finally, I realized what the problems were. When I encode Base64 username and password, I am using the wrong flag for Base64.encodeToString (...). Therefore, I modify falg:

WITH

 basicAuth = Base64.encodeToString(basicAuth.getBytes(), Base64.DEFAULT); 

TO:

 basicAuth = Base64.encodeToString(basicAuth.getBytes(), Base64.NO_WRAP); 

... and everything works fine.

+8
source

All Articles