Add request attributes to WebGraphQlRequest
Closes gh-633
This commit is contained in:
@@ -18,7 +18,7 @@ package org.springframework.graphql.test.tester;
|
||||
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Map;
|
||||
import java.util.Collections;
|
||||
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
@@ -77,10 +77,12 @@ final class WebGraphQlHandlerGraphQlTransport extends AbstractDirectGraphQlTrans
|
||||
|
||||
@Override
|
||||
protected Mono<ExecutionGraphQlResponse> executeInternal(ExecutionGraphQlRequest executionRequest) {
|
||||
String id = idGenerator.generateId().toString();
|
||||
Map<String, Object> body = executionRequest.toMap();
|
||||
WebGraphQlRequest webRequest = new WebGraphQlRequest(this.url, this.headers, null, body, id, null);
|
||||
return this.graphQlHandler.handleRequest(webRequest).cast(ExecutionGraphQlResponse.class);
|
||||
|
||||
WebGraphQlRequest request = new WebGraphQlRequest(
|
||||
this.url, this.headers, null, Collections.emptyMap(), executionRequest.toMap(),
|
||||
idGenerator.generateId().toString(), null);
|
||||
|
||||
return this.graphQlHandler.handleRequest(request).cast(ExecutionGraphQlResponse.class);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package org.springframework.graphql.server;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Collections;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -56,6 +57,8 @@ public class WebGraphQlRequest extends DefaultExecutionGraphQlRequest implements
|
||||
|
||||
private final MultiValueMap<String, HttpCookie> cookies;
|
||||
|
||||
private final Map<String, Object> attributes;
|
||||
|
||||
|
||||
/**
|
||||
* Create an instance.
|
||||
@@ -63,14 +66,15 @@ public class WebGraphQlRequest extends DefaultExecutionGraphQlRequest implements
|
||||
*/
|
||||
@Deprecated
|
||||
public WebGraphQlRequest(URI uri, HttpHeaders headers, Map<String, Object> body, String id, @Nullable Locale locale) {
|
||||
this(uri, headers, null, body, id, locale);
|
||||
this(uri, headers, null, Collections.emptyMap(), body, id, locale);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an instance.
|
||||
* @param uri the URL for the HTTP request or WebSocket handshake
|
||||
* @param headers the HTTP request headers
|
||||
* @param cookies the request cookies
|
||||
* @param cookies the HTTP request cookies
|
||||
* @param attributes request attributes
|
||||
* @param body the deserialized content of the GraphQL request
|
||||
* @param id an identifier for the GraphQL request
|
||||
* @param locale the locale from the HTTP request, if any
|
||||
@@ -78,7 +82,7 @@ public class WebGraphQlRequest extends DefaultExecutionGraphQlRequest implements
|
||||
*/
|
||||
public WebGraphQlRequest(
|
||||
URI uri, HttpHeaders headers, @Nullable MultiValueMap<String, HttpCookie> cookies,
|
||||
Map<String, Object> body, String id, @Nullable Locale locale) {
|
||||
Map<String, Object> attributes, Map<String, Object> body, String id, @Nullable Locale locale) {
|
||||
|
||||
super(getKey("query", body), getKey("operationName", body), getKey("variables", body),
|
||||
getKey("extensions", body), id, locale);
|
||||
@@ -88,7 +92,8 @@ public class WebGraphQlRequest extends DefaultExecutionGraphQlRequest implements
|
||||
|
||||
this.uri = UriComponentsBuilder.fromUri(uri).build(true);
|
||||
this.headers = headers;
|
||||
this.cookies = (cookies != null ? cookies : EMPTY_COOKIES);
|
||||
this.cookies = (cookies != null ? CollectionUtils.unmodifiableMultiValueMap(cookies) : EMPTY_COOKIES);
|
||||
this.attributes = Collections.unmodifiableMap(attributes);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@@ -114,4 +119,20 @@ public class WebGraphQlRequest extends DefaultExecutionGraphQlRequest implements
|
||||
return this.headers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the cookies of the request of WebSocket handshake.
|
||||
* @since 1.1.3
|
||||
*/
|
||||
public MultiValueMap<String, HttpCookie> getCookies() {
|
||||
return this.cookies;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the request or WebSocket session attributes.
|
||||
* @since 1.1.3
|
||||
*/
|
||||
public Map<String, Object> getAttributes() {
|
||||
return this.attributes;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ package org.springframework.graphql.server;
|
||||
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Collections;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -49,14 +50,15 @@ public class WebSocketGraphQlRequest extends WebGraphQlRequest {
|
||||
URI uri, HttpHeaders headers, Map<String, Object> body, String id, @Nullable Locale locale,
|
||||
WebSocketSessionInfo sessionInfo) {
|
||||
|
||||
this(uri, headers, null, body, id, locale, sessionInfo);
|
||||
this(uri, headers, null, Collections.emptyMap(), body, id, locale, sessionInfo);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an instance.
|
||||
* @param uri the URL for the HTTP request or WebSocket handshake
|
||||
* @param headers the HTTP request headers
|
||||
* @param cookies the request cookies
|
||||
* @param cookies the HTTP request cookies
|
||||
* @param attributes session attributes
|
||||
* @param body the deserialized content of the GraphQL request
|
||||
* @param id the id from the GraphQL over WebSocket {@code "subscribe"} message
|
||||
* @param locale the locale from the HTTP request, if any
|
||||
@@ -65,9 +67,10 @@ public class WebSocketGraphQlRequest extends WebGraphQlRequest {
|
||||
*/
|
||||
public WebSocketGraphQlRequest(
|
||||
URI uri, HttpHeaders headers, @Nullable MultiValueMap<String, HttpCookie> cookies,
|
||||
Map<String, Object> body, String id, @Nullable Locale locale, WebSocketSessionInfo sessionInfo) {
|
||||
Map<String, Object> attributes, Map<String, Object> body, String id, @Nullable Locale locale,
|
||||
WebSocketSessionInfo sessionInfo) {
|
||||
|
||||
super(uri, headers, cookies, body, id, locale);
|
||||
super(uri, headers, cookies, attributes, body, id, locale);
|
||||
Assert.notNull(sessionInfo, "WebSocketSessionInfo is required");
|
||||
this.sessionInfo = sessionInfo;
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ public class GraphQlHttpHandler {
|
||||
.flatMap(body -> {
|
||||
WebGraphQlRequest graphQlRequest = new WebGraphQlRequest(
|
||||
serverRequest.uri(), serverRequest.headers().asHttpHeaders(),
|
||||
serverRequest.cookies(), body,
|
||||
serverRequest.cookies(), serverRequest.attributes(), body,
|
||||
serverRequest.exchange().getRequest().getId(),
|
||||
serverRequest.exchange().getLocaleContext().getLocale());
|
||||
if (logger.isDebugEnabled()) {
|
||||
|
||||
@@ -149,7 +149,7 @@ public class GraphQlWebSocketHandler implements WebSocketHandler {
|
||||
}
|
||||
WebSocketGraphQlRequest request = new WebSocketGraphQlRequest(
|
||||
handshakeInfo.getUri(), handshakeInfo.getHeaders(), handshakeInfo.getCookies(),
|
||||
payload, id, null, sessionInfo);
|
||||
handshakeInfo.getAttributes(), payload, id, null, sessionInfo);
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Executing: " + request);
|
||||
}
|
||||
|
||||
@@ -90,7 +90,7 @@ public class GraphQlHttpHandler {
|
||||
|
||||
WebGraphQlRequest graphQlRequest = new WebGraphQlRequest(
|
||||
serverRequest.uri(), serverRequest.headers().asHttpHeaders(), initCookies(serverRequest),
|
||||
readBody(serverRequest), this.idGenerator.generateId().toString(),
|
||||
serverRequest.attributes(), readBody(serverRequest), this.idGenerator.generateId().toString(),
|
||||
LocaleContextHolder.getLocale());
|
||||
|
||||
if (logger.isDebugEnabled()) {
|
||||
|
||||
@@ -203,8 +203,8 @@ public class GraphQlWebSocketHandler extends TextWebSocketHandler implements Sub
|
||||
URI uri = session.getUri();
|
||||
Assert.notNull(uri, "Expected handshake url");
|
||||
HttpHeaders headers = session.getHandshakeHeaders();
|
||||
WebSocketGraphQlRequest request =
|
||||
new WebSocketGraphQlRequest(uri, headers, null, payload, id, null, state.getSessionInfo());
|
||||
WebSocketGraphQlRequest request = new WebSocketGraphQlRequest(
|
||||
uri, headers, null, session.getAttributes(), payload, id, null, state.getSessionInfo());
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Executing: " + request);
|
||||
}
|
||||
|
||||
@@ -302,7 +302,7 @@ class QuerydslDataFetcherTests {
|
||||
|
||||
private WebGraphQlRequest request(String query) {
|
||||
return new WebGraphQlRequest(
|
||||
URI.create("/"), new HttpHeaders(), null,
|
||||
URI.create("/"), new HttpHeaders(), null, Collections.emptyMap(),
|
||||
Collections.singletonMap("query", query), "1", Locale.ENGLISH);
|
||||
}
|
||||
|
||||
|
||||
@@ -188,7 +188,7 @@ class QueryByExampleDataFetcherJpaTests {
|
||||
|
||||
private WebGraphQlRequest request(String query) {
|
||||
return new WebGraphQlRequest(
|
||||
URI.create("/"), new HttpHeaders(), null,
|
||||
URI.create("/"), new HttpHeaders(), null, Collections.emptyMap(),
|
||||
Collections.singletonMap("query", query), "1", null);
|
||||
}
|
||||
|
||||
|
||||
@@ -185,7 +185,7 @@ class QueryByExampleDataFetcherMongoDbTests {
|
||||
|
||||
private WebGraphQlRequest request(String query) {
|
||||
return new WebGraphQlRequest(
|
||||
URI.create("/"), new HttpHeaders(), null,
|
||||
URI.create("/"), new HttpHeaders(), null, Collections.emptyMap(),
|
||||
Collections.singletonMap("query", query), "1", null);
|
||||
}
|
||||
|
||||
|
||||
@@ -157,7 +157,7 @@ class QueryByExampleDataFetcherReactiveMongoDbTests {
|
||||
|
||||
private WebGraphQlRequest request(String query) {
|
||||
return new WebGraphQlRequest(
|
||||
URI.create("/"), new HttpHeaders(), null,
|
||||
URI.create("/"), new HttpHeaders(), null, Collections.emptyMap(),
|
||||
Collections.singletonMap("query", query), "1", null);
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ package org.springframework.graphql.observation;
|
||||
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -83,7 +84,7 @@ class PropagationWebGraphQlInterceptorTests {
|
||||
HttpHeaders httpHeaders = new HttpHeaders();
|
||||
headers.forEach(httpHeaders::set);
|
||||
return new WebGraphQlRequest(
|
||||
URI.create("https://example.org/graphql"), httpHeaders, null,
|
||||
URI.create("https://example.org/graphql"), httpHeaders, null, Collections.emptyMap(),
|
||||
Map.of("query", "{ notUsed }"), "1", null);
|
||||
}
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||
public class WebGraphQlHandlerTests {
|
||||
|
||||
private static final WebGraphQlRequest webInput = new WebGraphQlRequest(
|
||||
URI.create("https://abc.org"), new HttpHeaders(), null,
|
||||
URI.create("https://abc.org"), new HttpHeaders(), null, Collections.emptyMap(),
|
||||
Collections.singletonMap("query", "{ greeting }"), "1", null);
|
||||
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||
public class WebGraphQlInterceptorTests {
|
||||
|
||||
private static final WebGraphQlRequest webRequest = new WebGraphQlRequest(
|
||||
URI.create("http://abc.org"), new HttpHeaders(), null,
|
||||
URI.create("http://abc.org"), new HttpHeaders(), null, Collections.emptyMap(),
|
||||
Collections.singletonMap("query", "{ notUsed }"), "1", null);
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user