Skip to content

Commit 3857028

Browse files
committed
Merge pull request #101 from aoberoi/feat.proxy-server
[WIP] proxy support, fixes #53
2 parents 618edf2 + 0365f72 commit 3857028

File tree

3 files changed

+138
-19
lines changed

3 files changed

+138
-19
lines changed

src/main/java/com/opentok/OpenTok.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.io.IOException;
1111
import java.io.StringReader;
1212
import java.io.UnsupportedEncodingException;
13+
import java.net.Proxy;
1314
import java.util.Collection;
1415
import java.util.List;
1516
import java.util.Map;
@@ -50,6 +51,7 @@ public class OpenTok {
5051
.reader(Archive.class);
5152
static protected ObjectReader archiveListReader = new ObjectMapper()
5253
.reader(ArchiveList.class);
54+
static final String defaultApiUrl = "https://api.opentok.com";
5355

5456
/**
5557
* Creates an OpenTok object.
@@ -60,15 +62,25 @@ public class OpenTok {
6062
* page.)
6163
*/
6264
public OpenTok(int apiKey, String apiSecret) {
63-
this(apiKey, apiSecret, "https://api.opentok.com");
65+
this(apiKey, apiSecret, defaultApiUrl);
6466
}
6567

6668
public OpenTok(int apiKey, String apiSecret, String apiUrl) {
69+
this(apiKey, apiSecret, apiUrl, null);
70+
}
71+
72+
public OpenTok(int apiKey, String apiSecret, String apiUrl, Proxy proxy) {
6773
this.apiKey = apiKey;
6874
this.apiSecret = apiSecret.trim();
69-
this.client = new HttpClient.Builder(apiKey, apiSecret)
70-
.apiUrl(apiUrl)
71-
.build();
75+
if (apiUrl == null) {
76+
apiUrl = defaultApiUrl;
77+
}
78+
HttpClient.Builder clientBuilder = new HttpClient.Builder(apiKey, apiSecret)
79+
.apiUrl(apiUrl);
80+
if (proxy != null) {
81+
clientBuilder.proxy(proxy);
82+
}
83+
this.client = clientBuilder.build();
7284
}
7385

7486
/**

src/main/java/com/opentok/util/HttpClient.java

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
package com.opentok.util;
99

1010
import java.io.IOException;
11+
import java.net.InetSocketAddress;
12+
import java.net.Proxy;
13+
import java.net.SocketAddress;
1114
import java.util.Collection;
1215
import java.util.Map;
1316
import java.util.concurrent.ExecutionException;
@@ -285,6 +288,7 @@ public String deleteArchive(String archiveId) throws RequestException {
285288
public static class Builder {
286289
private final int apiKey;
287290
private final String apiSecret;
291+
private Proxy proxy;
288292
private String apiUrl;
289293
private AsyncHttpClientConfig config;
290294

@@ -298,15 +302,48 @@ public Builder apiUrl(String apiUrl) {
298302
return this;
299303
}
300304

305+
public Builder proxy(Proxy proxy) {
306+
this.proxy = proxy;
307+
return this;
308+
}
309+
301310
public HttpClient build() {
302-
this.config = new AsyncHttpClientConfig.Builder()
311+
AsyncHttpClientConfig.Builder configBuilder = new AsyncHttpClientConfig.Builder()
303312
.setUserAgent("Opentok-Java-SDK/" + Version.VERSION + " JRE/" + System.getProperty("java.version"))
304-
.addRequestFilter(new PartnerAuthRequestFilter(this.apiKey, this.apiSecret))
305-
.build();
313+
.addRequestFilter(new PartnerAuthRequestFilter(this.apiKey, this.apiSecret));
314+
if (this.proxy != null) {
315+
configBuilder.setProxyServer(createProxyServer(this.proxy));
316+
}
317+
this.config = configBuilder.build();
306318
// NOTE: not thread-safe, config could be modified by another thread here?
307319
HttpClient client = new HttpClient(this);
308320
return client;
309321
}
322+
323+
// credit: https://github.com/AsyncHttpClient/async-http-client/blob/b52a8de5d6a862b5d1652d62f87ce774cbcff156/src/main/java/com/ning/http/client/ProxyServer.java#L99-L127
324+
static ProxyServer createProxyServer(final Proxy proxy) {
325+
if (proxy.type().equals(Proxy.Type.DIRECT)) {
326+
return null;
327+
}
328+
329+
if (!proxy.type().equals(Proxy.Type.HTTP)) {
330+
throw new IllegalArgumentException("Only DIRECT and HTTP Proxies are supported!");
331+
}
332+
333+
final SocketAddress sa = proxy.address();
334+
335+
if (!(sa instanceof InetSocketAddress)) {
336+
throw new IllegalArgumentException("Only Internet Address sockets are supported!");
337+
}
338+
339+
InetSocketAddress isa = (InetSocketAddress) sa;
340+
341+
if (isa.isUnresolved()) {
342+
return new ProxyServer(isa.getHostName(), isa.getPort());
343+
} else {
344+
return new ProxyServer(isa.getAddress().getHostAddress(), isa.getPort());
345+
}
346+
}
310347
}
311348

312349
static class PartnerAuthRequestFilter implements RequestFilter {

src/test/java/com/opentok/test/OpenTokTest.java

Lines changed: 82 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,62 @@
77
*/
88
package com.opentok.test;
99

10+
import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
11+
import static com.github.tomakehurst.wiremock.client.WireMock.any;
12+
import static com.github.tomakehurst.wiremock.client.WireMock.delete;
13+
import static com.github.tomakehurst.wiremock.client.WireMock.deleteRequestedFor;
14+
import static com.github.tomakehurst.wiremock.client.WireMock.get;
15+
import static com.github.tomakehurst.wiremock.client.WireMock.getRequestedFor;
16+
import static com.github.tomakehurst.wiremock.client.WireMock.matching;
17+
import static com.github.tomakehurst.wiremock.client.WireMock.post;
18+
import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor;
19+
import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
20+
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
21+
import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching;
22+
import static com.github.tomakehurst.wiremock.client.WireMock.verify;
23+
import static org.hamcrest.CoreMatchers.instanceOf;
24+
import static org.junit.Assert.assertEquals;
25+
import static org.junit.Assert.assertNotNull;
26+
import static org.junit.Assert.assertNull;
27+
import static org.junit.Assert.assertThat;
28+
import static org.junit.Assert.assertTrue;
29+
1030
import java.io.UnsupportedEncodingException;
31+
import java.net.InetAddress;
32+
import java.net.InetSocketAddress;
33+
import java.net.Proxy;
34+
import java.net.UnknownHostException;
1135
import java.security.InvalidKeyException;
1236
import java.security.NoSuchAlgorithmException;
1337
import java.security.SignatureException;
1438
import java.util.ArrayList;
1539
import java.util.Map;
1640

17-
import com.opentok.*;
18-
import com.opentok.Archive.OutputMode;
19-
2041
import org.apache.commons.lang.StringUtils;
21-
22-
import com.opentok.constants.Version;
23-
import com.opentok.exception.OpenTokException;
24-
import com.opentok.exception.InvalidArgumentException;
25-
2642
import org.junit.Before;
2743
import org.junit.Rule;
2844
import org.junit.Test;
2945

30-
import static org.junit.Assert.*;
31-
import static org.hamcrest.CoreMatchers.*;
32-
import static com.github.tomakehurst.wiremock.client.WireMock.*;
33-
46+
import com.github.tomakehurst.wiremock.WireMockServer;
47+
import com.github.tomakehurst.wiremock.client.RequestPatternBuilder;
48+
import com.github.tomakehurst.wiremock.client.WireMock;
49+
import com.github.tomakehurst.wiremock.common.ProxySettings;
50+
import com.github.tomakehurst.wiremock.core.WireMockConfiguration;
3451
import com.github.tomakehurst.wiremock.junit.WireMockRule;
52+
import com.opentok.Archive;
53+
import com.opentok.Archive.OutputMode;
54+
import com.opentok.constants.Version;
55+
import com.opentok.ArchiveList;
56+
import com.opentok.ArchiveMode;
57+
import com.opentok.ArchiveProperties;
58+
import com.opentok.MediaMode;
59+
import com.opentok.OpenTok;
60+
import com.opentok.Role;
61+
import com.opentok.Session;
62+
import com.opentok.SessionProperties;
63+
import com.opentok.TokenOptions;
64+
import com.opentok.exception.InvalidArgumentException;
65+
import com.opentok.exception.OpenTokException;
3566

3667
public class OpenTokTest {
3768

@@ -820,5 +851,44 @@ public void testDeleteArchive() throws OpenTokException {
820851

821852
assertNotNull(archive);
822853
}
854+
855+
@Test
856+
public void testCreateSessionWithProxy() throws OpenTokException, UnknownHostException {
857+
WireMockConfiguration proxyConfig = WireMockConfiguration.wireMockConfig();
858+
proxyConfig.dynamicPort();
859+
WireMockServer proxyingService = new WireMockServer(proxyConfig);
860+
proxyingService.start();
861+
WireMock proxyingServiceAdmin = new WireMock(proxyingService.port());
862+
863+
String targetServiceBaseUrl = "http://localhost:" + wireMockRule.port();
864+
proxyingServiceAdmin.register(any(urlMatching(".*")).atPriority(10)
865+
.willReturn(aResponse()
866+
.proxiedFrom(targetServiceBaseUrl)));
867+
868+
String sessionId = "SESSIONID";
869+
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(InetAddress.getLocalHost(), proxyingService.port()));
870+
871+
sdk = new OpenTok(apiKey, apiSecret, apiUrl, proxy);
872+
stubFor(post(urlEqualTo("/session/create"))
873+
.willReturn(aResponse()
874+
.withStatus(200)
875+
.withHeader("Content-Type", "text/xml")
876+
.withBody("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><sessions><Session><" +
877+
"session_id>" + sessionId + "</session_id><partner_id>123456</partner_id><create_dt>" +
878+
"Mon Mar 17 00:41:31 PDT 2014</create_dt></Session></sessions>")
879+
));
880+
881+
Session session = sdk.createSession();
882+
883+
assertNotNull(session);
884+
assertEquals(this.apiKey, session.getApiKey());
885+
assertEquals(sessionId, session.getSessionId());
886+
887+
verify(postRequestedFor(urlMatching("/session/create")));
888+
889+
Helpers.verifyPartnerAuth(this.apiKey, this.apiSecret);
890+
Helpers.verifyUserAgent();
891+
892+
}
823893

824894
}

0 commit comments

Comments
 (0)