aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/eu/siacs/conversations/utils/SocksSocketFactory.java
blob: 04cfa2eb6f75ede5e3b832a5180a0f070ece417e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package eu.siacs.conversations.utils;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.ByteBuffer;

import eu.siacs.conversations.Config;

public class SocksSocketFactory {

	public static void createSocksConnection(Socket socket, String destination, int port) throws IOException {
		InputStream proxyIs = socket.getInputStream();
		OutputStream proxyOs = socket.getOutputStream();
		proxyOs.write(new byte[]{0x05, 0x01, 0x00});
		byte[] response = new byte[2];
		proxyIs.read(response);
		byte[] dest = destination.getBytes();
		ByteBuffer request = ByteBuffer.allocate(7 + dest.length);
		request.put(new byte[]{0x05, 0x01, 0x00, 0x03});
		request.put((byte) dest.length);
		request.put(dest);
		request.putShort((short) port);
		proxyOs.write(request.array());
		response = new byte[7 + dest.length];
		proxyIs.read(response);
		if (response[1] != 0x00) {
			throw new SocksConnectionException();
		}
	}

	public static Socket createSocket(InetSocketAddress address, String destination, int port) throws IOException {
		Socket socket = new Socket();
		try {
			socket.connect(address, Config.CONNECT_TIMEOUT * 1000);
		} catch (IOException e) {
			throw new SocksProxyNotFoundException();
		}
		createSocksConnection(socket, destination, port);
		return socket;
	}

	static class SocksConnectionException extends IOException {

	}

	public static class SocksProxyNotFoundException extends IOException {

	}
}