Skip to content

Commit dfe65e3

Browse files
feat: add an extraHeaders option
Similar to the option of the JS client: ```java opts = new Socket.Options(); opts.extraHeaders = singletonMap("authorization", singletonList("bearer abcd")); socket = new Socket(opts); ``` Note: the refactor of the options (similar to [1]) will be done in a future step. [1] socketio/engine.io-client@5f47a50
1 parent 41f89a3 commit dfe65e3

File tree

5 files changed

+85
-1
lines changed

5 files changed

+85
-1
lines changed

src/main/java/io/socket/engineio/client/Socket.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ public String toString() {
130130
private Future pingTimeoutTimer;
131131
private okhttp3.WebSocket.Factory webSocketFactory;
132132
private okhttp3.Call.Factory callFactory;
133+
private final Map<String, List<String>> extraHeaders;
133134

134135
private ReadyState readyState;
135136
private ScheduledExecutorService heartbeatScheduler;
@@ -221,6 +222,7 @@ public Socket(Options opts) {
221222
}
222223
webSocketFactory = defaultOkHttpClient;
223224
}
225+
this.extraHeaders = opts.extraHeaders;
224226
}
225227

226228
public static void setDefaultOkHttpWebSocketFactory(okhttp3.WebSocket.Factory factory) {
@@ -293,6 +295,7 @@ private Transport createTransport(String name) {
293295
opts.policyPort = options != null ? options.policyPort : this.policyPort;
294296
opts.callFactory = options != null ? options.callFactory : this.callFactory;
295297
opts.webSocketFactory = options != null ? options.webSocketFactory : this.webSocketFactory;
298+
opts.extraHeaders = this.extraHeaders;
296299

297300
Transport transport;
298301
if (WebSocket.NAME.equals(name)) {

src/main/java/io/socket/engineio/client/Transport.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.socket.engineio.client;
22

33

4+
import java.util.List;
45
import java.util.Map;
56

67
import io.socket.emitter.Emitter;
@@ -43,6 +44,7 @@ public String toString() {
4344
protected ReadyState readyState;
4445
protected WebSocket.Factory webSocketFactory;
4546
protected Call.Factory callFactory;
47+
protected Map<String, List<String>> extraHeaders;
4648

4749
public Transport(Options opts) {
4850
this.path = opts.path;
@@ -55,6 +57,7 @@ public Transport(Options opts) {
5557
this.socket = opts.socket;
5658
this.webSocketFactory = opts.webSocketFactory;
5759
this.callFactory = opts.callFactory;
60+
this.extraHeaders = opts.extraHeaders;
5861
}
5962

6063
protected Transport onError(String msg, Exception desc) {
@@ -146,5 +149,6 @@ public static class Options {
146149
protected Socket socket;
147150
public WebSocket.Factory webSocketFactory;
148151
public Call.Factory callFactory;
152+
public Map<String, List<String>> extraHeaders;
149153
}
150154
}

src/main/java/io/socket/engineio/client/transports/PollingXHR.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ protected Request request(Request.Options opts) {
4343
}
4444
opts.uri = this.uri();
4545
opts.callFactory = this.callFactory;
46+
opts.extraHeaders = this.extraHeaders;
4647

4748
Request req = new Request(opts);
4849

@@ -72,6 +73,7 @@ protected void doWrite(String data, final Runnable fn) {
7273
Request.Options opts = new Request.Options();
7374
opts.method = "POST";
7475
opts.data = data;
76+
opts.extraHeaders = this.extraHeaders;
7577
Request req = this.request(opts);
7678
final PollingXHR self = this;
7779
req.on(Request.EVENT_SUCCESS, new Emitter.Listener() {
@@ -150,6 +152,7 @@ public static class Request extends Emitter {
150152
private String data;
151153

152154
private Call.Factory callFactory;
155+
private Map<String, List<String>> extraHeaders;
153156
private Response response;
154157
private Call requestCall;
155158

@@ -158,13 +161,16 @@ public Request(Options opts) {
158161
this.uri = opts.uri;
159162
this.data = opts.data;
160163
this.callFactory = opts.callFactory != null ? opts.callFactory : new OkHttpClient();
164+
this.extraHeaders = opts.extraHeaders;
161165
}
162166

163167
public void create() {
164168
final Request self = this;
165169
if (LOGGABLE_FINE) logger.fine(String.format("xhr open %s: %s", this.method, this.uri));
166170
Map<String, List<String>> headers = new TreeMap<String, List<String>>(String.CASE_INSENSITIVE_ORDER);
167-
171+
if (this.extraHeaders != null) {
172+
headers.putAll(this.extraHeaders);
173+
}
168174
if ("POST".equals(this.method)) {
169175
headers.put("Content-type", new LinkedList<String>(Collections.singletonList(TEXT_CONTENT_TYPE)));
170176
}
@@ -255,6 +261,7 @@ public static class Options {
255261
public String method;
256262
public String data;
257263
public Call.Factory callFactory;
264+
public Map<String, List<String>> extraHeaders;
258265
}
259266
}
260267
}

src/main/java/io/socket/engineio/client/transports/WebSocket.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ public WebSocket(Options opts) {
3535

3636
protected void doOpen() {
3737
Map<String, List<String>> headers = new TreeMap<String, List<String>>(String.CASE_INSENSITIVE_ORDER);
38+
if (this.extraHeaders != null) {
39+
headers.putAll(this.extraHeaders);
40+
}
3841
this.emit(EVENT_REQUEST_HEADERS, headers);
3942

4043
final WebSocket self = this;

src/test/java/io/socket/engineio/client/ServerConnectionTest.java

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,14 @@
1010

1111
import java.net.URISyntaxException;
1212
import java.util.Arrays;
13+
import java.util.Collections;
1314
import java.util.List;
1415
import java.util.Map;
1516
import java.util.concurrent.BlockingQueue;
1617
import java.util.concurrent.LinkedBlockingQueue;
1718

19+
import static java.util.Collections.singletonList;
20+
import static java.util.Collections.singletonMap;
1821
import static org.hamcrest.CoreMatchers.is;
1922
import static org.hamcrest.CoreMatchers.not;
2023
import static org.hamcrest.CoreMatchers.notNullValue;
@@ -168,6 +171,38 @@ public void call(Object... args) {
168171
socket.close();
169172
}
170173

174+
@Test(timeout = TIMEOUT)
175+
public void pollingHeaders_withExtraHeadersOption() throws URISyntaxException, InterruptedException {
176+
final BlockingQueue<String> messages = new LinkedBlockingQueue<String>();
177+
178+
Socket.Options opts = createOptions();
179+
opts.transports = new String[] {Polling.NAME};
180+
opts.extraHeaders = singletonMap("X-EngineIO", singletonList("bar"));
181+
182+
socket = new Socket(opts);
183+
socket.on(Socket.EVENT_TRANSPORT, new Emitter.Listener() {
184+
@Override
185+
public void call(Object... args) {
186+
Transport transport = (Transport)args[0];
187+
transport.on(Transport.EVENT_RESPONSE_HEADERS, new Emitter.Listener() {
188+
@Override
189+
public void call(Object... args) {
190+
@SuppressWarnings("unchecked")
191+
Map<String, List<String>> headers = (Map<String, List<String>>)args[0];
192+
List<String> values = headers.get("X-EngineIO");
193+
messages.offer(values.get(0));
194+
messages.offer(values.get(1));
195+
}
196+
});
197+
}
198+
});
199+
socket.open();
200+
201+
assertThat(messages.take(), is("hi"));
202+
assertThat(messages.take(), is("bar"));
203+
socket.close();
204+
}
205+
171206
@Test(timeout = TIMEOUT)
172207
public void websocketHandshakeHeaders() throws URISyntaxException, InterruptedException {
173208
final BlockingQueue<String> messages = new LinkedBlockingQueue<String>();
@@ -206,6 +241,38 @@ public void call(Object... args) {
206241
socket.close();
207242
}
208243

244+
@Test(timeout = TIMEOUT)
245+
public void websocketHandshakeHeaders_withExtraHeadersOption() throws URISyntaxException, InterruptedException {
246+
final BlockingQueue<String> messages = new LinkedBlockingQueue<String>();
247+
248+
Socket.Options opts = createOptions();
249+
opts.transports = new String[] {WebSocket.NAME};
250+
opts.extraHeaders = singletonMap("X-EngineIO", singletonList("bar"));
251+
252+
socket = new Socket(opts);
253+
socket.on(Socket.EVENT_TRANSPORT, new Emitter.Listener() {
254+
@Override
255+
public void call(Object... args) {
256+
Transport transport = (Transport)args[0];
257+
transport.on(Transport.EVENT_RESPONSE_HEADERS, new Emitter.Listener() {
258+
@Override
259+
public void call(Object... args) {
260+
@SuppressWarnings("unchecked")
261+
Map<String, List<String>> headers = (Map<String, List<String>>)args[0];
262+
List<String> values = headers.get("X-EngineIO");
263+
messages.offer(values.get(0));
264+
messages.offer(values.get(1));
265+
}
266+
});
267+
}
268+
});
269+
socket.open();
270+
271+
assertThat(messages.take(), is("hi"));
272+
assertThat(messages.take(), is("bar"));
273+
socket.close();
274+
}
275+
209276
@Test(timeout = TIMEOUT)
210277
public void rememberWebsocket() throws InterruptedException {
211278
final BlockingQueue<Object> values = new LinkedBlockingQueue<Object>();

0 commit comments

Comments
 (0)