Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Howto add request header to Tyrus annotation based client

I'm trying to access a websocket server endpoint using a tyrus standalone client (tyrus-standalone-client-1.9) with an annotation based client endpoint. I was mainly following this example.

That is, my client endpoint currently looks like

@ClientEndpoint
public class MyClientEndpoint {

    private static CountDownLatch latch;

    private Logger logger = Logger.getLogger(this.getClass().getName());

    @OnOpen
    public void onOpen(Session session) throws Exception {
        session.getBasicRemote().sendText("initialRequest")
    }

    @OnMessage
    public void onMessage(String message, Session session) throws Exception {
        // do something
    }

    @OnClose
    public void onClose(Session session, CloseReason closeReason) {
        logger.info(String.format("Session %s close because of %s", session.getId(), closeReason));
        latch.countDown();
    }

    public static void main(String[] args) {
        latch = new CountDownLatch(1);

        ClientManager client = ClientManager.createClient();
        try {
            URI serverEndpointUri = new URI("ws://localhost/websockets/server/endpoint");
            client.connectToServer(MyClientEndpoint.class, serverEndpointUri);
            latch.await();

        } catch (DeploymentException | URISyntaxException | InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

However I need to pass some session ID along with the request and I need to modify the origin header of the request to get my connection accepted by the server endpoint.

In a programmatic client endpoint I could do something like

final Builder configBuilder = ClientEndpointConfig.Builder.create();
configBuilder.configurator(new Configurator() {
    @Override
    public void beforeRequest(final Map<String, List<String>> headers) {
        headers.put("Cookie", Arrays.asList("X-Session=0f822c8c-bf63-4ae7-9d2f-af263f86baad"));
        headers.put("Origin", Arrays.asList("http://localhost"));
    }
});
ClientEndpointConfig clientConfig = configBuilder.build();
ClientManager client = ClientManager.createClient();
URI serverEndpointUri = new URI("ws://localhost/websockets/server/endpoint");
client.connectToServer(new MyClientEndpoint(), clientConfig, serverEndpointUri);

But there doesn't seem to be any option to pass the configuration to an annotation based client.

Is there some other way to add/modify the request headers that I'm currently missing? I'd really like to stay with the annotation based approach as it seems to be much cleaner to me...

like image 261
dpr Avatar asked Dec 04 '14 12:12

dpr


1 Answers

See ModifyRequestResponseHeadersTest.java:183

@ClientEndpoint(configurator = MyClientConfigurator.class)
public static class MyClientEndpoint {
    public static final CountDownLatch messageLatch = new CountDownLatch(1);
    public static volatile String receivedMessage;

    @OnOpen
    public void onOpen(Session session) throws IOException {
        session.getBasicRemote().sendText(SENT_MESSAGE);
    }

    @OnMessage
    public void onMessage(String message) {
        receivedMessage = message;
        messageLatch.countDown();
    }
}

And MyClientConfigurator:

public static class MyClientConfigurator extends ClientEndpointConfig.Configurator {
    static volatile boolean called = false;

    @Override
    public void beforeRequest(Map<String, List<String>> headers) {
        called = true;
        headers.put(HEADER_NAME, Arrays.asList(HEADER_VALUE));
        headers.put("Origin", Arrays.asList("myOrigin"));
    }

    @Override
    public void afterResponse(HandshakeResponse handshakeResponse) {
        final Map<String, List<String>> headers = handshakeResponse.getHeaders();

        assertEquals(HEADER_VALUE[0], headers.get(HEADER_NAME).get(0));
        assertEquals(HEADER_VALUE[1], headers.get(HEADER_NAME).get(1));
        assertEquals(HEADER_VALUE[2], headers.get(HEADER_NAME).get(2));
        assertEquals("myOrigin", headers.get("origin").get(0));
    }
}
like image 116
Pavel Bucek Avatar answered Oct 19 '22 15:10

Pavel Bucek