Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to debug http calls on Android devices?

I'm writing a Lovefilm client for Android, and it's not going too badly except I keep having problems with the remote calls to retrieve data from the API.

Does anyone have any tips for debugging remote calls like this? Can I tcpdump on Android or is there a native way of doing it?

For example, I'm using the Scribe-java library for OAuth to access the Lovefilm API, I can authenticate find and retrieve a list of films on the users account fine when the device is running Gingerbread, but trying to retrieve the accessToken on Froyo causes a blank response & and apparent response code of -1, I'd like to be able to see what's going on under the cvers their.

Another example I'd like to be able to the raw http for is trying to run a search, I get and IOError that says "Received authentication challenge is null"

like image 853
Stuart Grimshaw Avatar asked Mar 06 '11 22:03

Stuart Grimshaw


2 Answers

I've used Fiddler (http-proxy for debugging http calls) with the android emulator in these cases. Just start the proxy, and start the emulator with the correct proxy address (-http-proxy ).

like image 198
Zsombor Erdődy-Nagy Avatar answered Sep 29 '22 12:09

Zsombor Erdődy-Nagy


Fiddler is the most useful option. On the emulator @Scythe answer will work, but on a real device you will need to set the proxy in the Apache Http Client. The following code will do that:

HttpHost proxy = new HttpHost("youripaddr", 8888); 
params.setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); 

If you are using https, fiddler is not so useful. In that case can enable the build in logging support in Apache Http Client. The following code does that:

Headers only:

java.util.logging.Logger apacheHeaderLog = java.util.logging.Logger.getLogger("org.apache.http.headers");       
apacheHeaderLog.setLevel(java.util.logging.Level.FINEST);

Headers & Wire:

java.util.logging.Logger apacheWireLog = java.util.logging.Logger.getLogger("org.apache.http.wire");
apacheWireLog.setLevel(java.util.logging.Level.FINEST);

Note that this will have to have a java.util.logging Handler configured at finest level and the default handler is configured to log to logcat, which will filter DEBUG (finest) entries by default.

like image 45
Nic Strong Avatar answered Sep 29 '22 13:09

Nic Strong