HTTPURLConnection - 400 Bad Request

Kevin Rave picture Kevin Rave · Sep 13, 2012 · Viewed 15.9k times · Source

I check this Post. But I don't still understand what the logical error could be. I am still getting this error. I tried to dump the emulator traffic. But I still don't get my head around what the problem could be.

From the traffic dump, this is what Android is sending as request to the server. You can see the response too:

 GET /Authenticate/ HTTP/1.1
 Authorization: Basic asdfasdfasdfas

 Accept-Charset: UTF-8
 Host: www.domain.com
 User-Agent: Dalvik/1.4.0 (Linux; U; Android 2.3.3; sdk Build/GRI34)
 Connection: Keep-Alive
 Accept-Encoding: gzip

 neQPˆ? 6   6   RT 4VRT 5 E (
 »  @ÍCl¦'
 PÙ[    ˜ároP"8"  neQPI "  "  RT 4VRT 5 E
 ¼  @ËVl¦'
 PÙ[    ˜ároP"8«‹  HTTP/1.1 400 Bad Request
 Date: Thu, 13 Sep 2012 04:47:42 GMT
 Server: Apache/2.2.15 (CentOS)
 Content-Length: 310
 Connection: close
 Content-Type: text/html; charset=iso-8859-1

 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
 <html><head>
 <title>400 Bad Request</title>
 </head><body>
 <h1>Bad Request</h1>
 <p>Your browser sent a request that this server could not understand.<br />
 </p>
 <hr>
 <address>Apache/2.2.15 (CentOS) Server at www.domain.com Port 80</address>
 </body></html>
 neQPé¬ 6   6   RT 4VRT 5 E (
 ½  @ÍAl¦'
 PÙ[    ™îároP"8 ,  neQPéË @   @   RT 5RT 4V E  (çØ@ @³-
 l¦'Ù[ Páro ™îP )E            neQPéË @   @   RT 5RT 4V E  (çÙ@ @³,
 l¦'Ù[ Páro ™ïP )D            neQPö“
  ©   ©   RT 5RT 4V E  ›k‹@ @¶Á

  ³ër,9Jr ‘Pÿÿ6B  WRTE   w  [   *  ¨­«º[ 09-13 04:47:41.822   446:0x1c7 D/400      ]
  text/html; charset=iso-8859-1Bad Request

I don't know what those extra characters mean. But I was trying to identify the problem from it.

This is the basic code:

String credentials = username + ":" + password;
byte[] toencode = null;
try {
    toencode = credentials.getBytes("UTF-8");
} catch (UnsupportedEncodingException e1) {
    e1.printStackTrace();
}
HttpURLConnection conn = null;
try {
    //Utilities.isNetworkAvailable(context);
    URL url = new URL(params[0]);   
    Log.d(params[0],"UR");  
    conn = (HttpURLConnection) url.openConnection();
    conn.setRequestProperty("Authorization", "Basic " + Base64.encodeToString(toencode, Base64.DEFAULT));
    conn.setRequestProperty("Accept-Charset", "UTF-8");
    conn.setRequestProperty("Host", "www.domain.com");
    conn.setRequestMethod("GET");
    conn.setDoOutput(true);

    String data = conn.getInputStream().toString();
    return data;
}

Any ideas?

Update

I checked Webserver Logs to see if the requests are hitting the server and if there was any problem with the request. This is what I see from error logs:

 [Thu Sep 13 10:05:24 2012] [error] [client 91.222.195.132] client sent HTTP/1.1 request without  hostname (see RFC2616 section 14.23): /Authenticate/
 [Thu Sep 13 23:11:57 2012] [error] [client 91.222.195.132] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /Authenticate/
 [Thu Sep 13 23:12:03 2012] [error] [client 91.222.195.132] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /Authenticate/

However I am setting the header property for the request.

Any ideas?

Answer

Kevin Rave picture Kevin Rave · Sep 21, 2012

I figured out this myself. Its an issue with the order of setting headers.

Edit: Order I used.

URL url = new URL(strUrl);  
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Host", "myhost.com");
conn.setRequestProperty("Authorization", "Basic " + Base64.encodeToString(toencode, Base64.DEFAULT));
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; PPC; en-US; rv:1.3.1)");
conn.setRequestProperty("Accept-Charset", "UTF-8");

conn.setConnectTimeout (5000) ; 
conn.setDoOutput(true); 
conn.setDoInput(true);