public static SocksProxySocket connectViaSocks4Proxy(String remoteHost,
int remotePort,
String proxyHost,
int proxyPort,
String userId) throws UnknownHostException, IOException {
SocksProxySocket proxySocket = new SocksProxySocket(remoteHost,
remotePort, proxyHost, proxyPort);
try {
InputStream proxyIn = proxySocket.getInputStream();
OutputStream proxyOut = proxySocket.getOutputStream();
InetAddress hostAddr = InetAddress.getByName(remoteHost);
proxyOut.write(SOCKS4);
proxyOut.write(CONNECT);
proxyOut.write((remotePort > > > 8) & 0xff);
proxyOut.write(remotePort & 0xff);
proxyOut.write(hostAddr.getAddress());
proxyOut.write(userId.getBytes());
proxyOut.write(NULL_TERMINATION);
proxyOut.flush();
int res = proxyIn.read();
if (res == -1) {
throw new IOException("SOCKS4 server " + proxyHost + ":" +
proxyPort + " disconnected");
}
if (res != 0x00) {
throw new IOException("Invalid response from SOCKS4 server (" +
res + ") " + proxyHost + ":" + proxyPort);
}
int code = proxyIn.read();
if (code != 90) {
if ((code > 90) && (code < 93)) {
throw new IOException(
"SOCKS4 server unable to connect, reason: " +
SOCKSV4_ERROR[code - 91]);
} else {
throw new IOException(
"SOCKS4 server unable to connect, reason: " + code);
}
}
byte[] data = new byte[6];
if (proxyIn.read(data, 0, 6) != 6) {
throw new IOException(
"SOCKS4 error reading destination address/port");
}
proxySocket.providerDetail = data[2] + "." + data[3] + "." +
data[4] + "." + data[5] + ":" + ((data[0] < < 8) | data[1]);
} catch (SocketException e) {
throw new SocketException("Error communicating with SOCKS4 server " +
proxyHost + ":" + proxyPort + ", " + e.getMessage());
}
return proxySocket;
}
|
public static SocksProxySocket connectViaSocks5Proxy(String remoteHost,
int remotePort,
String proxyHost,
int proxyPort,
String username,
String password) throws UnknownHostException, IOException {
return connectViaSocks5Proxy(remoteHost, remotePort, proxyHost,
proxyPort, false, username, password);
}
|
public static SocksProxySocket connectViaSocks5Proxy(String remoteHost,
int remotePort,
String proxyHost,
int proxyPort,
boolean localLookup,
String username,
String password) throws UnknownHostException, IOException {
SocksProxySocket proxySocket = new SocksProxySocket(remoteHost,
remotePort, proxyHost, proxyPort);
try {
InputStream proxyIn = proxySocket.getInputStream();
OutputStream proxyOut = proxySocket.getOutputStream();
byte[] request = {
(byte) SOCKS5, (byte) 0x02, (byte) 0x00, (byte) 0x02
};
byte[] reply = new byte[2];
proxyOut.write(request);
proxyOut.flush();
int res = proxyIn.read();
if (res == -1) {
throw new IOException("SOCKS5 server " + proxyHost + ":" +
proxyPort + " disconnected");
}
if (res != 0x05) {
throw new IOException("Invalid response from SOCKS5 server (" +
res + ") " + proxyHost + ":" + proxyPort);
}
int method = proxyIn.read();
switch (method) {
case 0x00:
break;
case 0x02:
performAuthentication(proxyIn, proxyOut, username, password,
proxyHost, proxyPort);
break;
default:
throw new IOException(
"SOCKS5 server does not support our authentication methods");
}
if (localLookup) {
InetAddress hostAddr;
try {
hostAddr = InetAddress.getByName(remoteHost);
} catch (UnknownHostException e) {
throw new IOException("Can't do local lookup on: " +
remoteHost + ", try socks5 without local lookup");
}
request = new byte[] {
(byte) SOCKS5, (byte) 0x01, (byte) 0x00, (byte) 0x01
};
proxyOut.write(request);
proxyOut.write(hostAddr.getAddress());
} else {
request = new byte[] {
(byte) SOCKS5, (byte) 0x01, (byte) 0x00, (byte) 0x03
};
proxyOut.write(request);
proxyOut.write(remoteHost.length());
proxyOut.write(remoteHost.getBytes());
}
proxyOut.write((remotePort > > > 8) & 0xff);
proxyOut.write(remotePort & 0xff);
proxyOut.flush();
res = proxyIn.read();
if (res != 0x05) {
throw new IOException("Invalid response from SOCKS5 server (" +
res + ") " + proxyHost + ":" + proxyPort);
}
int status = proxyIn.read();
if (status != 0x00) {
if ((status > 0) && (status < 9)) {
throw new IOException(
"SOCKS5 server unable to connect, reason: " +
SOCKSV5_ERROR[status]);
} else {
throw new IOException(
"SOCKS5 server unable to connect, reason: " + status);
}
}
proxyIn.read();
int aType = proxyIn.read();
byte[] data = new byte[255];
switch (aType) {
case 0x01:
if (proxyIn.read(data, 0, 4) != 4) {
throw new IOException("SOCKS5 error reading address");
}
proxySocket.providerDetail = data[0] + "." + data[1] + "." +
data[2] + "." + data[3];
break;
case 0x03:
int n = proxyIn.read();
if (proxyIn.read(data, 0, n) != n) {
throw new IOException("SOCKS5 error reading address");
}
proxySocket.providerDetail = new String(data);
break;
default:
throw new IOException("SOCKS5 gave unsupported address type: " +
aType);
}
if (proxyIn.read(data, 0, 2) != 2) {
throw new IOException("SOCKS5 error reading port");
}
proxySocket.providerDetail += (":" + ((data[0] < < 8) | data[1]));
} catch (SocketException e) {
throw new SocketException("Error communicating with SOCKS5 server " +
proxyHost + ":" + proxyPort + ", " + e.getMessage());
}
return proxySocket;
}
|