[tor-commits] [orbot/master] more work to get bridge VPN mode to work

n8fr8 at torproject.org n8fr8 at torproject.org
Fri Apr 3 17:04:06 UTC 2015


commit b2ec768d8d454bc9fcc170a13cf847d6b6c26025
Author: Nathan Freitas <nathan at freitas.net>
Date:   Mon Feb 23 12:29:21 2015 -0500

    more work to get bridge VPN mode to work
---
 src/org/torproject/android/vpn/HttpProxy.java      |   84 +++++++++++++-------
 .../torproject/android/vpn/OrbotVpnService.java    |    4 -
 2 files changed, 57 insertions(+), 31 deletions(-)

diff --git a/src/org/torproject/android/vpn/HttpProxy.java b/src/org/torproject/android/vpn/HttpProxy.java
index d211342..ac62786 100644
--- a/src/org/torproject/android/vpn/HttpProxy.java
+++ b/src/org/torproject/android/vpn/HttpProxy.java
@@ -218,7 +218,6 @@ public class HttpProxy extends Thread
 			while (true)
 			{
 				Socket client = server.accept();
-				HttpProxy.vpnService.protect(client);
 				ProxyThread t = new ProxyThread(client, fwdServer, fwdPort);
 				t.setDebug(debugLevel, debugOut);
 				t.setTimeout(ptTimeout);
@@ -331,6 +330,7 @@ class ProxyThread extends Thread
 			try
 			{
 				server = SocketChannel.open().socket();
+				InetSocketAddress remoteHost = new InetSocketAddress(hostName, hostPort);
 				
 				if ((null != server) && (null != HttpProxy.vpnService)) {
 					HttpProxy.vpnService.protect(server);
@@ -338,18 +338,13 @@ class ProxyThread extends Thread
 				
 				if ((fwdServer.length() > 0) && (fwdPort > 0))
 				{
-					//server = new Socket(fwdServer, fwdPort);
 					server.connect(new InetSocketAddress(fwdServer, fwdPort));
 					
 				}  else  {
-					//server = new Socket(hostName, hostPort);
-					server.connect(new InetSocketAddress(hostName, hostPort));
+					server.connect(remoteHost);
 					
 				}
 				
-				
-				HttpProxy.vpnService.protect(server);
-				
 			}  catch (Exception e)  {
 				// tell the client there was an error
 				String errMsg = "HTTP/1.0 500\nContent Type: text/plain\n\n" + 
@@ -360,31 +355,56 @@ class ProxyThread extends Thread
 			if (server != null)
 			{
 				server.setSoTimeout(socketTimeout);
+				
+
 				BufferedInputStream serverIn = new BufferedInputStream(server.getInputStream());
 				BufferedOutputStream serverOut = new BufferedOutputStream(server.getOutputStream());
 				
-				// send the request out
-				serverOut.write(request, 0, requestLength);
-				serverOut.flush();
-				
-				// and get the response; if we're not at a debug level that
-				// requires us to return the data in the response, just stream
-				// it back to the client to save ourselves from having to
-				// create and destroy an unnecessary byte array. Also, we
-				// should set the waitForDisconnect parameter to 'true',
-				// because some servers (like Google) don't always set the
-				// Content-Length header field, so we have to listen until
-				// they decide to disconnect (or the connection times out).
-				if (debugLevel > 1)
+				if (requestLength > 0)
 				{
-					response = getHTTPData(serverIn, true);
-					responseLength = Array.getLength(response);
-				}  else  {
-					responseLength = streamHTTPData(serverIn, clientOut, true);
+					// send the request out
+					serverOut.write(request, 0, requestLength);
+					serverOut.flush();
+					
+					// and get the response; if we're not at a debug level that
+					// requires us to return the data in the response, just stream
+					// it back to the client to save ourselves from having to
+					// create and destroy an unnecessary byte array. Also, we
+					// should set the waitForDisconnect parameter to 'true',
+					// because some servers (like Google) don't always set the
+					// Content-Length header field, so we have to listen until
+					// they decide to disconnect (or the connection times out).
+					if (debugLevel > 1)
+					{
+						response = getHTTPData(serverIn, true);
+						responseLength = Array.getLength(response);
+					}  else  {
+						responseLength = streamHTTPData(serverIn, clientOut, true);
+					}
+					
+					serverIn.close();
+					serverOut.close();
+				}
+				else 
+				{
+					int i = 0;
+					byte[] buffer = new byte[4096];
+					
+					int avail = clientIn.available();
+					while (avail > 0 && (i = clientIn.read(buffer,0,avail))!=-1)
+					{
+						serverOut.write(buffer,0,i);
+						avail = clientIn.available();
+					}
+					
+					while ((i = serverIn.read(buffer))!=-1)
+						clientOut.write(buffer,0,i);
+					
+					clientOut.close();
+					clientIn.close();
+					pSocket.close();
+					return;
 				}
-				
-				serverIn.close();
-				serverOut.close();
 			}
 			
 			// send the response back to the client, if we haven't already
@@ -488,6 +508,16 @@ class ProxyThread extends Thread
 							debugOut.println("Error parsing response code " + rcString);
 					}
 				}
+				//CONNECT www.comodo.com:443 HTTP/1.1
+
+				else if (data.toLowerCase().startsWith("connect "))
+				{
+					
+					String connectHost = data.substring(pos+1, data.indexOf(" ", pos+1));
+					host.append(connectHost);
+					return 0;
+					
+				}
 			}
 			
 			// get the rest of the header info
diff --git a/src/org/torproject/android/vpn/OrbotVpnService.java b/src/org/torproject/android/vpn/OrbotVpnService.java
index 365edab..f78f720 100644
--- a/src/org/torproject/android/vpn/OrbotVpnService.java
+++ b/src/org/torproject/android/vpn/OrbotVpnService.java
@@ -16,16 +16,12 @@
 
 package org.torproject.android.vpn;
 
-import java.io.IOException;
 import java.net.InetAddress;
-import java.net.UnknownHostException;
 import java.util.Locale;
 
 import org.torproject.android.service.TorServiceConstants;
 
 import android.annotation.TargetApi;
-import android.app.Notification;
-import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.content.Intent;
 import android.net.VpnService;





More information about the tor-commits mailing list