2

I setup tor on a specific port and want to access the website through that port. The below code works perfectly in Android 7.0 but it gives below error in android 6.0. What may be the issue? The tor service successfully running at a specific port I am sending a request to. Running sample code of this library (https://github.com/jehy/Tor-Onion-Proxy-Library)

Error

java.net.UnknownHostException: Host is unresolved: google.com W/System.err: at java.net.Socket.connect(Socket.java:893) W/System.err: at cz.msebera.android.httpclient.conn.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:74) W/System.err: at com.example.nandan.sampletorproxyapp.MyConnectionSocketFactory.connectSocket(MyConnectionSocketFactory.java:33) W/System.err: at cz.msebera.android.httpclient.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:134) W/System.err: at cz.msebera.android.httpclient.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353) W/System.err: at cz.msebera.android.httpclient.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380) W/System.err: at cz.msebera.android.httpclient.impl.execchain.MainClientExec.execute(MainClientExec.java:236) W/System.err: at cz.msebera.android.httpclient.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184) W/System.err: at cz.msebera.android.httpclient.impl.execchain.RetryExec.execute(RetryExec.java:88) W/System.err: at cz.msebera.android.httpclient.impl.execchain.RedirectExec.execute(RedirectExec.java:110) W/System.err: at cz.msebera.android.httpclient.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) W/System.err: at cz.msebera.android.httpclient.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) W/System.err: at cz.msebera.android.httpclient.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55) W/System.err: at com.example.nandan.sampletorproxyapp.MainActivity$TorTask.doInBackground(MainActivity.java:85) W/System.err: at com.example.nandan.sampletorproxyapp.MainActivity$TorTask.doInBackground(MainActivity.java:60) W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:295) W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237) W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) W/System.err: at java.lang.Thread.run(Thread.java:818)

Main Activity

HttpClient httpClient = getNewHttpClient();
int port = onionProxyManager.getIPv4LocalHostSocksPort();
InetSocketAddress socksaddr = new InetSocketAddress("127.0.0.1", port);
HttpClientContext context = HttpClientContext.create();
context.setAttribute("socks.address", socksaddr);
HttpGet httpGet = new HttpGet("http://google.co.in");     
HttpResponse httpResponse = httpClient.execute(httpGet, context); // GETTING ERROR HERE



static class FakeDnsResolver implements DnsResolver {
    @Override
    public InetAddress[] resolve(String host) throws UnknownHostException {
        return new InetAddress[] { InetAddress.getByAddress(new byte[] { 1, 1, 1, 1 }) };
    }
}


public HttpClient getNewHttpClient() {

    Registry<ConnectionSocketFactory> reg = RegistryBuilder.<ConnectionSocketFactory>create()
            .register("http", new MyConnectionSocketFactory())
            .build();
    PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(reg,new FakeDnsResolver());
    return HttpClients.custom()
            .setConnectionManager(cm)
            .build();
}

MyConnectionSocketFactory.java

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.Socket;

import cz.msebera.android.httpclient.HttpHost;
import cz.msebera.android.httpclient.conn.socket.PlainConnectionSocketFactory;
import cz.msebera.android.httpclient.protocol.HttpContext;

public class MyConnectionSocketFactory extends PlainConnectionSocketFactory {

    @Override
    public Socket createSocket(final HttpContext context) {
        InetSocketAddress socksaddr = (InetSocketAddress) context.getAttribute("socks.address");
        Proxy proxy = new Proxy(Proxy.Type.SOCKS, socksaddr);
        return new Socket(proxy);
    }

    @Override
    public Socket connectSocket(
            int connectTimeout,
            Socket socket,
            final HttpHost host,
            final InetSocketAddress remoteAddress,
            final InetSocketAddress localAddress,
            final HttpContext context) throws IOException{

        InetSocketAddress unresolvedRemote = InetSocketAddress
                .createUnresolved(host.getHostName(), remoteAddress.getPort());
        return super.connectSocket(connectTimeout, socket, host, unresolvedRemote, localAddress, context);
    }
}
tarun14110
  • 940
  • 5
  • 26
  • 57

1 Answers1

-1

Try changing

HttpGet httpGet = new HttpGet("http:google.co.in"); 

to

HttpGet httpGet = new HttpGet("http://google.co.in");  

or

URI uri = new URIBuilder()
            .setScheme("http")
            .setHost("google.co.in")
            .build();
HttpGet httpGet = new HttpGet(uri);

updated - try this

HttpHost target = new HttpHost("google.co.in", 80, "http");
HttpGet httpGet = new HttpGet("/");
HttpResponse httpResponse = httpClient.execute(target, httpGet, context);

If it don't work im not too sure. Maybe try this link hopefully this helps How to use HttpClientBuilder with Http proxy?

Vlad
  • 7,997
  • 3
  • 56
  • 43
Mohammad C
  • 1,321
  • 1
  • 8
  • 12