Skip to content

Commit

Permalink
Update default SockJS CDN location
Browse files Browse the repository at this point in the history
This commit updates the default location of the SockJS' client library.
The previous location is being retired by the project maintainers.

The new default location is backed by several CDN providers:
* https://cdn.jsdelivr.net/sockjs/0.3.4/sockjs.min.js

See sockjs/sockjs-client#198

Issue: SPR-12254
(cherry picked from commit a6e1c53)
  • Loading branch information
bclozel authored and jhoeller committed Sep 26, 2014
1 parent 251970a commit 3267e5a
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 35 deletions.
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2013 the original author or authors.
* Copyright 2002-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -73,16 +73,20 @@ public SockJsServiceRegistration setTaskScheduler(TaskScheduler taskScheduler) {
}

/**
* Transports which don't support cross-domain communication natively (e.g.
* "eventsource", "htmlfile") rely on serving a simple page (using the
* "foreign" domain) from an invisible iframe. Code run from this iframe
* doesn't need to worry about cross-domain issues since it is running from
* a domain local to the SockJS server. The iframe does need to load the
* SockJS javascript client library and this option allows configuring its url.
* See the reference documentation for more details on this.
*
* Transports with no native cross-domain communication (e.g. "eventsource",
* "htmlfile") must get a simple page from the "foreign" domain in an invisible
* iframe so that code in the iframe can run from a domain local to the SockJS
* server. Since the iframe needs to load the SockJS javascript client library,
* this property allows specifying where to load it from.
* <p>By default this is set to point to
* "https://d1fxtkz8shb9d2.cloudfront.net/sockjs-0.3.4.min.js".
* "https://cdn.jsdelivr.net/sockjs/0.3.4/sockjs.min.js". However it can
* also be set to point to a URL served by the application.
* <p>Note that it's possible to specify a relative URL in which case the URL
* must be relative to the iframe URL. For example assuming a SockJS endpoint
* mapped to "/sockjs", and resulting iframe URL "/sockjs/iframe.html", then the
* the relative URL must start with "../../" to traverse up to the location
* above the SockJS mapping. In case of a prefix-based Servlet mapping one more
* traversal may be needed.
*/
public SockJsServiceRegistration setClientLibraryUrl(String clientLibraryUrl) {
this.clientLibraryUrl = clientLibraryUrl;
Expand Down
Expand Up @@ -68,7 +68,7 @@ public abstract class AbstractSockJsService implements SockJsService {

private String name = "SockJSService@" + ObjectUtils.getIdentityHexString(this);

private String clientLibraryUrl = "https://d1fxtkz8shb9d2.cloudfront.net/sockjs-0.3.4.min.js";
private String clientLibraryUrl = "https://cdn.jsdelivr.net/sockjs/0.3.4/sockjs.min.js";

private int streamBytesLimit = 128 * 1024;

Expand Down
Expand Up @@ -17,9 +17,12 @@
package org.springframework.web.socket.sockjs.support;

import java.io.IOException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.junit.Before;
import org.junit.Test;

import org.springframework.http.HttpStatus;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
Expand All @@ -33,9 +36,6 @@
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

/**
* Test fixture for {@link AbstractSockJsService}.
*
Expand All @@ -55,9 +55,9 @@ public void setUp() {
this.service = new TestSockJsService(new ThreadPoolTaskScheduler());
}


@Test
public void validateRequest() throws Exception {

this.service.setWebSocketEnabled(false);
resetResponseAndHandleRequest("GET", "/echo/server/session/websocket", HttpStatus.NOT_FOUND);

Expand All @@ -76,7 +76,6 @@ public void validateRequest() throws Exception {

@Test
public void handleInfoGet() throws Exception {

resetResponseAndHandleRequest("GET", "/echo/info", HttpStatus.OK);

assertEquals("application/json;charset=UTF-8", this.servletResponse.getContentType());
Expand All @@ -98,9 +97,7 @@ public void handleInfoGet() throws Exception {
body.substring(body.indexOf(',')));
}

// SPR-11443

@Test
@Test // SPR-11443
public void handleInfoGetCorsFilter() throws Exception {

// Simulate scenario where Filter would have already set CORS headers
Expand All @@ -111,9 +108,7 @@ public void handleInfoGetCorsFilter() throws Exception {
assertEquals("foobar:123", this.servletResponse.getHeader("Access-Control-Allow-Origin"));
}

// SPR-11919

@Test
@Test // SPR-11919
public void handleInfoGetWildflyNPE() throws Exception {
HttpServletResponse mockResponse = mock(HttpServletResponse.class);
ServletOutputStream ous = mock(ServletOutputStream.class);
Expand All @@ -128,9 +123,7 @@ public void handleInfoGetWildflyNPE() throws Exception {

@Test
public void handleInfoOptions() throws Exception {

this.servletRequest.addHeader("Access-Control-Request-Headers", "Last-Modified");

resetResponseAndHandleRequest("OPTIONS", "/echo/info", HttpStatus.NO_CONTENT);
this.response.flush();

Expand All @@ -143,27 +136,23 @@ public void handleInfoOptions() throws Exception {

@Test
public void handleIframeRequest() throws Exception {

resetResponseAndHandleRequest("GET", "/echo/iframe.html", HttpStatus.OK);

assertEquals("text/html;charset=UTF-8", this.servletResponse.getContentType());
assertTrue(this.servletResponse.getContentAsString().startsWith("<!DOCTYPE html>\n"));
assertEquals(496, this.servletResponse.getContentLength());
assertEquals(490, this.servletResponse.getContentLength());
assertEquals("public, max-age=31536000", this.response.getHeaders().getCacheControl());
assertEquals("\"0da1ed070012f304e47b83c81c48ad620\"", this.response.getHeaders().getETag());
assertEquals("\"06b486b3208b085d9e3220f456a6caca4\"", this.response.getHeaders().getETag());
}

@Test
public void handleIframeRequestNotModified() throws Exception {

this.servletRequest.addHeader("If-None-Match", "\"0da1ed070012f304e47b83c81c48ad620\"");

this.servletRequest.addHeader("If-None-Match", "\"06b486b3208b085d9e3220f456a6caca4\"");
resetResponseAndHandleRequest("GET", "/echo/iframe.html", HttpStatus.NOT_MODIFIED);
}

@Test
public void handleRawWebSocketRequest() throws Exception {

resetResponseAndHandleRequest("GET", "/echo", HttpStatus.OK);
assertEquals("Welcome to SockJS!\n", this.servletResponse.getContentAsString());

Expand All @@ -174,13 +163,13 @@ public void handleRawWebSocketRequest() throws Exception {

@Test
public void handleEmptyContentType() throws Exception {

servletRequest.setContentType("");
this.servletRequest.setContentType("");
resetResponseAndHandleRequest("GET", "/echo/info", HttpStatus.OK);

assertEquals("Invalid/empty content should have been ignored", 200, this.servletResponse.getStatus());
}


private void resetResponseAndHandleRequest(String httpMethod, String uri, HttpStatus httpStatus) throws IOException {
resetResponse();
handleRequest(httpMethod, uri, httpStatus);
Expand Down Expand Up @@ -211,14 +200,12 @@ public TestSockJsService(TaskScheduler scheduler) {
@Override
protected void handleRawWebSocketRequest(ServerHttpRequest req, ServerHttpResponse res,
WebSocketHandler handler) throws IOException {

this.handler = handler;
}

@Override
protected void handleTransportRequest(ServerHttpRequest req, ServerHttpResponse res, WebSocketHandler handler,
String sessionId, String transport) throws SockJsException {

this.sessionId = sessionId;
this.transport = transport;
this.handler = handler;
Expand Down

0 comments on commit 3267e5a

Please sign in to comment.