服务器发送的事件客户端带有其他Cookie [英] Server Sent Event Client with additional Cookie

查看:90
本文介绍了服务器发送的事件客户端带有其他Cookie的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试对带有附加cookie的服务器已发送事件资源进行单元测试.我已经将Jersey用于EventSource,将JavaX用于客户端.以下代码可以正常工作:

I am trying to unit test a Server Sent Event resource with an additional cookie. I am already using Jersey for the EventSource and JavaX for the client. The following code works fine:

    WebTarget target = ClientBuilder.newBuilder()
        .register(SseFeature.class)
        .build()
        .target("http://localhost:8080/sse");
    EventSource eventSource = EventSource.target(target).build();
    EventListener listener = new EventListener() {
        @Override
        public void onEvent(InboundEvent inboundEvent) {
            LOG.info(inboundEvent.readData(String.class));
        }
    };
    eventSource.register(listener);
    eventSource.open();
    serverEventManager.send("/sse", "foo");
    eventSource.close();

但是,对于附加的单元测试,我需要向请求中添加附加的cookie.我已经尝试了以下方法

Hoewever, for an additional unit test I need to add an additional cookie to the request. I have already tryed the following

target.(...).request.cookie("foo", "bar");

但这会返回一个生成器,我无法从该生成器创建EventSource所需的WebTarget.

But this returns a builder from which I can't create the required WebTarget for the EventSource.

推荐答案

这是在EventSource中为给定WebTarget建立连接的情况:

Here's what's happens within EventSource to establish a conection to the given WebTarget:

       private Invocation.Builder prepareHandshakeRequest() {
            Invocation.Builder request = EventSource.this.target
                    .request(new MediaType[] { SseFeature.SERVER_SENT_EVENTS_TYPE });
            if ((this.lastEventId != null) && (!(this.lastEventId.isEmpty()))) {
                request.header("Last-Event-ID", this.lastEventId);
            }
            if (EventSource.this.disableKeepAlive) {
                request.header("Connection", "close");
            }
            return request;
          }

我们可以看到-没有机会在此处添加cookie.

As we can see - no chance to add a cookie here.

因此WebTarget.request(new MediaType[] { SseFeature.SERVER_SENT_EVENTS_TYPE })需要返回一个生成器,该生成器 已经添加了所需的Cookie.

So WebTarget.request(new MediaType[] { SseFeature.SERVER_SENT_EVENTS_TYPE }) needs to return a Builder that already has that desired cookie added.

考虑这个委托类,将所需的cookie添加到所有request*类型的方法中:

Consider this delegating class adding the desired cookie to all request* type methods:

public class CookieAddedWebTarget implements WebTarget {

    private WebTarget base;

    private Cookie cookie;

    public CookieAddedWebTarget(WebTarget base, Cookie cookie) {
        this.base = base;
        this.cookie = cookie;
    }

    // Inject that cookie whenever someone requests a Builder (like EventSource does):
    public Builder request() {
        return base.request().cookie(cookie);
    }

    public Builder request(String... paramArrayOfString) {
        return base.request(paramArrayOfString).cookie(cookie);
    }

    public Builder request(MediaType... paramArrayOfMediaType) {
        return base.request(paramArrayOfMediaType).cookie(cookie);
    }

    public Configuration getConfiguration() {
        return base.getConfiguration();
    }

    //All other methods from WebTarget are delegated as-is:

    public URI getUri() {
        return base.getUri();
    }

    public UriBuilder getUriBuilder() {
        return base.getUriBuilder();
    }

    public WebTarget path(String paramString) {
        return base.path(paramString);
    }

    public WebTarget matrixParam(String paramString, Object... paramArrayOfObject) {
        return base.matrixParam(paramString, paramArrayOfObject);
    }

    public WebTarget property(String paramString, Object paramObject) {
        return base.property(paramString, paramObject);
    }

    public WebTarget queryParam(String paramString, Object... paramArrayOfObject) {
        return base.queryParam(paramString, paramArrayOfObject);
    }

    public WebTarget register(Class<?> paramClass, Class<?>... paramArrayOfClass) {
        return base.register(paramClass, paramArrayOfClass);
    }

    public WebTarget register(Class<?> paramClass, int paramInt) {
        return base.register(paramClass, paramInt);
    }

    public WebTarget register(Class<?> paramClass, Map<Class<?>, Integer> paramMap) {
        return base.register(paramClass, paramMap);
    }

    public WebTarget register(Class<?> paramClass) {
        return base.register(paramClass);
    }

    public WebTarget register(Object paramObject, Class<?>... paramArrayOfClass) {
        return base.register(paramObject, paramArrayOfClass);
    }

    public WebTarget register(Object paramObject, int paramInt) {
        return base.register(paramObject, paramInt);
    }

    public WebTarget register(Object paramObject, Map<Class<?>, Integer> paramMap) {
        return base.register(paramObject, paramMap);
    }

    public WebTarget register(Object paramObject) {
        return base.register(paramObject);
    }

    public WebTarget resolveTemplate(String paramString, Object paramObject) {
        return base.resolveTemplate(paramString, paramObject);
    }

    public WebTarget resolveTemplate(String paramString, Object paramObject, boolean paramBoolean) {
        return base.resolveTemplate(paramString, paramObject, paramBoolean);
    }

    public WebTarget resolveTemplateFromEncoded(String paramString, Object paramObject) {
        return base.resolveTemplateFromEncoded(paramString, paramObject);
    }

    public WebTarget resolveTemplates(Map<String, Object> paramMap) {
        return base.resolveTemplates(paramMap);
    }

    public WebTarget resolveTemplates(Map<String, Object> paramMap, boolean paramBoolean) {
        return base.resolveTemplates(paramMap, paramBoolean);
    }

    public WebTarget resolveTemplatesFromEncoded(Map<String, Object> paramMap) {
        return base.resolveTemplatesFromEncoded(paramMap);
    }

}

现在,您应该可以重新执行以下测试:

Now you should be able to reerite your test to:

EventSource eventSource = EventSource.target(new CookieAddedWebTarget(target, 
                            new Cookie("name", "value"))).build();

然后应该插入cookie.

And the cookie should be inserted.

注意:我无法对此进行测试.仅基于读取jersey-media-sse-2.22.1的源代码的解决方案.

Caveat: I have no way of testing this. Solution based only on reading source-code of jersey-media-sse-2.22.1.

祝你好运.

这篇关于服务器发送的事件客户端带有其他Cookie的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆