Add request attributes to WebGraphQlRequest

Closes gh-633
This commit is contained in:
rstoyanchev
2023-03-14 08:17:02 +00:00
parent 66b3c82280
commit 7fc4df74a6
14 changed files with 52 additions and 25 deletions

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}

View File

@@ -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()) {

View File

@@ -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);
}

View File

@@ -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()) {

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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