Added SOCKS 4 tests.
This commit is contained in:
parent
f02194d405
commit
1878b344c7
|
@ -0,0 +1,119 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// All rights reserved. This program and the accompanying materials
|
||||||
|
// are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
// and Apache License v2.0 which accompanies this distribution.
|
||||||
|
//
|
||||||
|
// The Eclipse Public License is available at
|
||||||
|
// http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
//
|
||||||
|
// The Apache License v2.0 is available at
|
||||||
|
// http://www.opensource.org/licenses/apache2.0.php
|
||||||
|
//
|
||||||
|
// You may elect to redistribute this code under either of these licenses.
|
||||||
|
// ========================================================================
|
||||||
|
//
|
||||||
|
|
||||||
|
package org.eclipse.jetty.client;
|
||||||
|
|
||||||
|
import java.net.InetSocketAddress;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.channels.ServerSocketChannel;
|
||||||
|
import java.nio.channels.SocketChannel;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.concurrent.CountDownLatch;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.client.api.Response;
|
||||||
|
import org.eclipse.jetty.client.api.Result;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class Socks4ProxyTest
|
||||||
|
{
|
||||||
|
private ServerSocketChannel server;
|
||||||
|
private HttpClient client;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void prepare() throws Exception
|
||||||
|
{
|
||||||
|
server = ServerSocketChannel.open();
|
||||||
|
server.bind(new InetSocketAddress("localhost", 0));
|
||||||
|
|
||||||
|
client = new HttpClient();
|
||||||
|
client.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void dispose() throws Exception
|
||||||
|
{
|
||||||
|
server.close();
|
||||||
|
client.stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSocks4Proxy() throws Exception
|
||||||
|
{
|
||||||
|
int proxyPort = server.socket().getLocalPort();
|
||||||
|
client.getProxyConfiguration().getProxies().add(new Socks4Proxy("localhost", proxyPort));
|
||||||
|
|
||||||
|
final CountDownLatch latch = new CountDownLatch(1);
|
||||||
|
|
||||||
|
byte ip1 = 127;
|
||||||
|
byte ip2 = 0;
|
||||||
|
byte ip3 = 0;
|
||||||
|
byte ip4 = 13;
|
||||||
|
String serverHost = ip1 + "." + ip2 + "." + ip3 + "." + ip4;
|
||||||
|
int serverPort = proxyPort + 1; // Any port will do
|
||||||
|
client.newRequest(serverHost, serverPort)
|
||||||
|
.path("/path")
|
||||||
|
.timeout(5, TimeUnit.SECONDS)
|
||||||
|
.send(new Response.CompleteListener()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void onComplete(Result result)
|
||||||
|
{
|
||||||
|
if (result.isSucceeded())
|
||||||
|
latch.countDown();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
SocketChannel channel = server.accept();
|
||||||
|
|
||||||
|
int socks4MessageLength = 9;
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocate(socks4MessageLength);
|
||||||
|
int read = channel.read(buffer);
|
||||||
|
Assert.assertEquals(socks4MessageLength, read);
|
||||||
|
Assert.assertEquals(4, buffer.get(0) & 0xFF);
|
||||||
|
Assert.assertEquals(1, buffer.get(1) & 0xFF);
|
||||||
|
Assert.assertEquals(serverPort, buffer.getShort(2) & 0xFFFF);
|
||||||
|
Assert.assertEquals(ip1, buffer.get(4) & 0xFF);
|
||||||
|
Assert.assertEquals(ip2, buffer.get(5) & 0xFF);
|
||||||
|
Assert.assertEquals(ip3, buffer.get(6) & 0xFF);
|
||||||
|
Assert.assertEquals(ip4, buffer.get(7) & 0xFF);
|
||||||
|
Assert.assertEquals(0, buffer.get(8) & 0xFF);
|
||||||
|
|
||||||
|
// Socks4 response.
|
||||||
|
channel.write(ByteBuffer.wrap(new byte[]{0, 0x5A, 0, 0, 0, 0, 0, 0}));
|
||||||
|
|
||||||
|
buffer = ByteBuffer.allocate(3);
|
||||||
|
read = channel.read(buffer);
|
||||||
|
Assert.assertEquals(3, read);
|
||||||
|
buffer.flip();
|
||||||
|
Assert.assertEquals("GET", StandardCharsets.UTF_8.decode(buffer).toString());
|
||||||
|
|
||||||
|
// Response
|
||||||
|
String response = "" +
|
||||||
|
"HTTP/1.1 200 OK\r\n" +
|
||||||
|
"Content-Length: 0\r\n" +
|
||||||
|
"Connection: close\r\n" +
|
||||||
|
"\r\n";
|
||||||
|
channel.write(ByteBuffer.wrap(response.getBytes("UTF-8")));
|
||||||
|
|
||||||
|
Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue