Skip to content

Commit

Permalink
Allow HTTP GET and WebSocket to use the same path
Browse files Browse the repository at this point in the history
  • Loading branch information
rstoyanchev committed Feb 5, 2021
1 parent 2ebbd46 commit 4e735f1
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.util.stream.Collectors;

import graphql.GraphQL;
import reactor.core.publisher.Mono;

import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
Expand All @@ -41,6 +42,7 @@
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
import org.springframework.web.reactive.handler.SimpleUrlHandlerMapping;
import org.springframework.web.server.ServerWebExchange;

import static org.springframework.web.reactive.function.server.RequestPredicates.accept;
import static org.springframework.web.reactive.function.server.RequestPredicates.contentType;
Expand Down Expand Up @@ -90,14 +92,21 @@ public GraphQLWebSocketHandler graphQLWebSocketHandler(
public HandlerMapping graphQLWebSocketEndpoint(
GraphQLWebSocketHandler handler, GraphQLProperties properties) {

String path = properties.getWebsocket().getPath();
SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
mapping.setUrlMap(Collections.singletonMap(path, handler));
mapping.setOrder(-1); // Ahead of annotated controllers
return mapping;
WebSocketHandlerMapping handlerMapping = new WebSocketHandlerMapping();
handlerMapping.setUrlMap(Collections.singletonMap(properties.getWebsocket().getPath(), handler));
handlerMapping.setOrder(-2); // Ahead of HTTP endpoint ("routerFunctionMapping" bean)
return handlerMapping;
}

}


private static class WebSocketHandlerMapping extends SimpleUrlHandlerMapping {

@Override
public Mono<Object> getHandlerInternal(ServerWebExchange exchange) {
return ("WebSocket".equalsIgnoreCase(exchange.getRequest().getHeaders().getUpgrade()) ?
super.getHandlerInternal(exchange) : Mono.empty());
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.util.Map;
import java.util.stream.Collectors;

import javax.servlet.http.HttpServletRequest;
import javax.websocket.server.ServerContainer;

import graphql.GraphQL;
Expand All @@ -38,6 +39,7 @@
import org.springframework.graphql.WebInterceptor;
import org.springframework.graphql.webmvc.GraphQLHttpHandler;
import org.springframework.graphql.webmvc.GraphQLWebSocketHandler;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.HandlerMapping;
Expand Down Expand Up @@ -103,16 +105,24 @@ public GraphQLWebSocketHandler graphQLWebSocketHandler(

@Bean
public HandlerMapping graphQLWebSocketEndpoint(GraphQLWebSocketHandler handler, GraphQLProperties properties) {
WebSocketHttpRequestHandler httpRequestHandler =
new WebSocketHttpRequestHandler(handler, new DefaultHandshakeHandler());

String path = properties.getWebsocket().getPath();
SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
mapping.setUrlMap(Collections.singletonMap(path, httpRequestHandler));
mapping.setOrder(-1); // Ahead of annotated controllers
return mapping;
WebSocketHandlerMapping handlerMapping = new WebSocketHandlerMapping();
handlerMapping.setUrlMap(Collections.singletonMap(
properties.getWebsocket().getPath(),
new WebSocketHttpRequestHandler(handler, new DefaultHandshakeHandler())));
handlerMapping.setOrder(2); // Ahead of HTTP endpoint ("routerFunctionMapping" bean)
return handlerMapping;
}

}


private static class WebSocketHandlerMapping extends SimpleUrlHandlerMapping {

@Override
protected Object getHandlerInternal(HttpServletRequest request) throws Exception {
return ("WebSocket".equalsIgnoreCase(request.getHeader(HttpHeaders.UPGRADE)) ?
super.getHandlerInternal(request) : null);
}
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
spring.graphql.websocket.path=/graphql/websocket
spring.graphql.websocket.path=/graphql
management.endpoints.web.exposure.include=health,metrics,info
logging.level.org.springframework.web=debug
logging.level.org.springframework.http=debug
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<body>
<script type="text/javascript">
const client = graphqlWs.createClient({
url: 'ws://localhost:8080/graphql/websocket',
url: 'ws://localhost:8080/graphql',
});

// query
Expand Down

0 comments on commit 4e735f1

Please sign in to comment.