1
我正在編寫自己的代理服務器。我有最簡單的實現。第一代碼段是設置服務器監聽端口8080(其上的請求將通過WiFi設置重定向):適用於Android的SSL代理服務器SSL
public class MyProxyServer {
private ServerSocket proxyServer;
public void init() throws Exception {
proxyServer = new ServerSocket(8080);
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Socket proxySocket = proxyServer.accept();
ProxyConnectionHandler proxyConnectionHandler = new ProxyConnectionHandler(proxySocket);
new Thread(proxyConnectionHandler).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
二是通過插座傳遞請求和響應數據:
public class ProxyConnectionHandler implements Runnable {
private static final int BUFFER_SIZE = 8192;
Socket mProxySocket;
Socket mOutsideSocket;
public ProxyConnectionHandler(Socket proxySocket) {
mProxySocket = proxySocket;
}
@Override
public void run() {
try {
long startTimestamp = System.currentTimeMillis();
InputStream proxyInputStream = mProxySocket.getInputStream();
byte[] bytes = new byte[BUFFER_SIZE];
int bytesRead = proxyInputStream.read(bytes, 0, BUFFER_SIZE);
String request = new String(bytes);
Log.d("ACHTUNG", "Request: " + request);
String host = extractHost(request);
int port = request.startsWith("CONNECT") ? 443 : 80;
mOutsideSocket = new Socket(host, port);
OutputStream outsideOutputStream = mOutsideSocket.getOutputStream();
outsideOutputStream.write(bytes, 0, bytesRead);
outsideOutputStream.flush();
InputStream outsideSocketInputStream = mOutsideSocket.getInputStream();
OutputStream proxyOutputStream = mProxySocket.getOutputStream();
byte[] responseArray = new byte[BUFFER_SIZE];
do
{
bytesRead = outsideSocketInputStream.read(responseArray, 0, BUFFER_SIZE);
if (bytesRead > 0)
{
proxyOutputStream.write(responseArray, 0, bytesRead);
String response = new String(bytes, 0, bytesRead);
Log.d("ACHTUNG", "Response: " + response);
}
} while (bytesRead > 0);
proxyOutputStream.flush();
mOutsideSocket.close();
mProxySocket.close();
Log.d("ACHTUNG", "Cycle: " + (System.currentTimeMillis() - startTimestamp));
} catch (Exception e) {
e.printStackTrace();
}
}
private String extractHost(String request) {
int hStart = request.indexOf("Host: ") + 6;
int hEnd = request.indexOf('\n', hStart);
return request.substring(hStart, hEnd - 1);
}
}
當我進入瀏覽器時,它對HTTP頁面起作用,但對HTTPS不起作用。還有更多東西需要處理SSL。我不想讀取SSL軟件包,我只是想通過它們。怎麼做 ?
在瀏覽器中,我得到: ERR_TUNNEL_CONNECTION_FAILED –