From a7ae98d1beed863a5280252d2244ef38317223e1 Mon Sep 17 00:00:00 2001
From: oliemansm <oliemans@scopisto.com>
Date: Sat, 22 Jan 2022 21:23:26 +0100
Subject: [PATCH 1/5] fix: support new graphql context

fixes #393
---
 build.gradle                                  |  6 +--
 gradle.properties                             |  2 +-
 .../execution/GraphQLInvokerSubjectProxy.java | 32 ----------------
 .../execution/context/ContextSetting.java     |  2 +-
 .../context/DefaultGraphQLContext.java        | 23 ++++++------
 .../context/DefaultGraphQLContextBuilder.java |  2 +-
 .../context/GraphQLContextBuilder.java        |  2 +-
 ...text.java => GraphQLKickstartContext.java} | 10 ++---
 .../input/GraphQLSingleInvocationInput.java   | 20 ++--------
 .../input/PerQueryBatchedInvocationInput.java |  4 +-
 .../PerRequestBatchedInvocationInput.java     |  6 +--
 .../context/DefaultGraphQLServletContext.java | 30 ++++++++-------
 .../DefaultGraphQLServletContextBuilder.java  |  6 +--
 .../DefaultGraphQLWebSocketContext.java       | 37 +++++++++----------
 .../context/GraphQLServletContext.java        |  4 +-
 .../context/GraphQLServletContextBuilder.java |  6 +--
 .../context/GraphQLWebSocketContext.java      |  4 +-
 .../servlet/DataLoaderDispatchingSpec.groovy  | 17 +++++----
 .../servlet/OsgiGraphQLHttpServletSpec.groovy |  7 +---
 19 files changed, 86 insertions(+), 134 deletions(-)
 delete mode 100644 graphql-java-kickstart/src/main/java/graphql/kickstart/execution/GraphQLInvokerSubjectProxy.java
 rename graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/{GraphQLContext.java => GraphQLKickstartContext.java} (65%)

diff --git a/build.gradle b/build.gradle
index c73054a3..d88a0285 100644
--- a/build.gradle
+++ b/build.gradle
@@ -92,9 +92,9 @@ subprojects {
 
     jacocoTestReport {
         reports {
-            xml.enabled = true
-            html.enabled = false
-            csv.enabled = false
+            xml.required = true
+            html.required = false
+            csv.required = false
         }
     }
 
diff --git a/gradle.properties b/gradle.properties
index 0b1660ce..d65b7e84 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,4 +1,4 @@
-version=12.0.1-SNAPSHOT
+version=13.0.0-SNAPSHOT
 group=com.graphql-java-kickstart
 PROJECT_NAME=graphql-java-servlet
 PROJECT_DESC=GraphQL Java Kickstart
diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/GraphQLInvokerSubjectProxy.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/GraphQLInvokerSubjectProxy.java
deleted file mode 100644
index a133bcaf..00000000
--- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/GraphQLInvokerSubjectProxy.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package graphql.kickstart.execution;
-
-import graphql.ExecutionInput;
-import graphql.ExecutionResult;
-import graphql.GraphQL;
-import graphql.kickstart.execution.context.GraphQLContext;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.concurrent.CompletableFuture;
-import javax.security.auth.Subject;
-
-public class GraphQLInvokerSubjectProxy implements GraphQLInvokerProxy {
-
-  @Override
-  public CompletableFuture<ExecutionResult> executeAsync(
-      GraphQL graphQL, ExecutionInput executionInput) {
-    GraphQLContext context = (GraphQLContext) executionInput.getContext();
-    if (Subject.getSubject(AccessController.getContext()) == null
-        && context.getSubject().isPresent()) {
-      return context
-          .getSubject()
-          .map(it -> Subject.doAs(it, doAction(graphQL, executionInput)))
-          .orElseGet(() -> graphQL.executeAsync(executionInput));
-    }
-    return graphQL.executeAsync(executionInput);
-  }
-
-  private PrivilegedAction<CompletableFuture<ExecutionResult>> doAction(
-      GraphQL graphQL, ExecutionInput executionInput) {
-    return () -> graphQL.executeAsync(executionInput);
-  }
-}
diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/ContextSetting.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/ContextSetting.java
index 2ac46c54..c9d1060f 100644
--- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/ContextSetting.java
+++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/ContextSetting.java
@@ -47,7 +47,7 @@ public enum ContextSetting {
   public GraphQLBatchedInvocationInput getBatch(
       List<GraphQLRequest> requests,
       GraphQLSchema schema,
-      Supplier<GraphQLContext> contextSupplier,
+      Supplier<GraphQLKickstartContext> contextSupplier,
       Object root) {
     switch (this) {
       case PER_QUERY_WITH_INSTRUMENTATION:
diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContext.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContext.java
index f94b32b7..90532f9e 100644
--- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContext.java
+++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContext.java
@@ -1,37 +1,36 @@
 package graphql.kickstart.execution.context;
 
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Objects;
-import java.util.Optional;
-import javax.security.auth.Subject;
 import org.dataloader.DataLoaderRegistry;
 
 /**
  * An object for the DefaultGraphQLContextBuilder to return. Can be extended to include more
  * context.
  */
-public class DefaultGraphQLContext implements GraphQLContext {
-
-  private final Subject subject;
+public class DefaultGraphQLContext implements GraphQLKickstartContext {
 
   private final DataLoaderRegistry dataLoaderRegistry;
 
-  public DefaultGraphQLContext(DataLoaderRegistry dataLoaderRegistry, Subject subject) {
+  public DefaultGraphQLContext(DataLoaderRegistry dataLoaderRegistry) {
     this.dataLoaderRegistry =
         Objects.requireNonNull(dataLoaderRegistry, "dataLoaderRegistry is required");
-    this.subject = subject;
   }
 
   public DefaultGraphQLContext() {
-    this(new DataLoaderRegistry(), null);
+    this(new DataLoaderRegistry());
   }
 
   @Override
-  public Optional<Subject> getSubject() {
-    return Optional.ofNullable(subject);
+  public DataLoaderRegistry getDataLoaderRegistry() {
+    return dataLoaderRegistry;
   }
 
   @Override
-  public DataLoaderRegistry getDataLoaderRegistry() {
-    return dataLoaderRegistry;
+  public Map<Object, Object> getMapOfContext() {
+    Map<Object, Object> map = new HashMap<>();
+    map.put(DataLoaderRegistry.class, dataLoaderRegistry);
+    return map;
   }
 }
diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContextBuilder.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContextBuilder.java
index 653ee8ad..47d5effb 100644
--- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContextBuilder.java
+++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContextBuilder.java
@@ -4,7 +4,7 @@
 public class DefaultGraphQLContextBuilder implements GraphQLContextBuilder {
 
   @Override
-  public GraphQLContext build() {
+  public GraphQLKickstartContext build() {
     return new DefaultGraphQLContext();
   }
 }
diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLContextBuilder.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLContextBuilder.java
index bb76930c..d0a74530 100644
--- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLContextBuilder.java
+++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLContextBuilder.java
@@ -3,5 +3,5 @@
 public interface GraphQLContextBuilder {
 
   /** @return the graphql context */
-  GraphQLContext build();
+  GraphQLKickstartContext build();
 }
diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLContext.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLKickstartContext.java
similarity index 65%
rename from graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLContext.java
rename to graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLKickstartContext.java
index 7efc3615..019ce433 100644
--- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLContext.java
+++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLKickstartContext.java
@@ -1,17 +1,15 @@
 package graphql.kickstart.execution.context;
 
-import java.util.Optional;
-import javax.security.auth.Subject;
+import java.util.Map;
 import lombok.NonNull;
 import org.dataloader.DataLoaderRegistry;
 
 /** Represents the context required by the servlet to execute a GraphQL request. */
-public interface GraphQLContext {
-
-  /** @return the subject to execute the query as. */
-  Optional<Subject> getSubject();
+public interface GraphQLKickstartContext {
 
   /** @return the Dataloader registry to use for the execution. Must not return <code>null</code> */
   @NonNull
   DataLoaderRegistry getDataLoaderRegistry();
+
+  Map<Object, Object> getMapOfContext();
 }
diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/GraphQLSingleInvocationInput.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/GraphQLSingleInvocationInput.java
index f3e2fdb2..75ffd440 100644
--- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/GraphQLSingleInvocationInput.java
+++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/GraphQLSingleInvocationInput.java
@@ -5,12 +5,9 @@
 import graphql.ExecutionInput;
 import graphql.execution.ExecutionId;
 import graphql.kickstart.execution.GraphQLRequest;
-import graphql.kickstart.execution.context.GraphQLContext;
+import graphql.kickstart.execution.context.GraphQLKickstartContext;
 import graphql.schema.GraphQLSchema;
-import java.util.Collections;
 import java.util.List;
-import java.util.Optional;
-import javax.security.auth.Subject;
 
 /** Represents a single GraphQL execution. */
 public class GraphQLSingleInvocationInput implements GraphQLInvocationInput {
@@ -19,13 +16,10 @@ public class GraphQLSingleInvocationInput implements GraphQLInvocationInput {
 
   private final ExecutionInput executionInput;
 
-  private final Subject subject;
-
   public GraphQLSingleInvocationInput(
-      GraphQLRequest request, GraphQLSchema schema, GraphQLContext context, Object root) {
+      GraphQLRequest request, GraphQLSchema schema, GraphQLKickstartContext context, Object root) {
     this.schema = schema;
     this.executionInput = createExecutionInput(request, context, root);
-    subject = context.getSubject().orElse(null);
   }
 
   /** @return the schema to use to execute this query. */
@@ -33,18 +27,13 @@ public GraphQLSchema getSchema() {
     return schema;
   }
 
-  /** @return a subject to execute the query as. */
-  public Optional<Subject> getSubject() {
-    return Optional.ofNullable(subject);
-  }
-
   private ExecutionInput createExecutionInput(
-      GraphQLRequest graphQLRequest, GraphQLContext context, Object root) {
+      GraphQLRequest graphQLRequest, GraphQLKickstartContext context, Object root) {
     return ExecutionInput.newExecutionInput()
         .query(graphQLRequest.getQuery())
         .operationName(graphQLRequest.getOperationName())
         .context(context)
-        .graphQLContext(Collections.singletonMap(context.getClass(), context))
+        .graphQLContext(context.getMapOfContext())
         .root(root)
         .variables(graphQLRequest.getVariables())
         .extensions(graphQLRequest.getExtensions())
@@ -61,5 +50,4 @@ public ExecutionInput getExecutionInput() {
   public List<String> getQueries() {
     return singletonList(executionInput.getQuery());
   }
-
 }
diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/PerQueryBatchedInvocationInput.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/PerQueryBatchedInvocationInput.java
index 99adcf5f..2ccc20d5 100644
--- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/PerQueryBatchedInvocationInput.java
+++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/PerQueryBatchedInvocationInput.java
@@ -4,7 +4,7 @@
 
 import graphql.kickstart.execution.GraphQLRequest;
 import graphql.kickstart.execution.context.ContextSetting;
-import graphql.kickstart.execution.context.GraphQLContext;
+import graphql.kickstart.execution.context.GraphQLKickstartContext;
 import graphql.schema.GraphQLSchema;
 import java.util.List;
 import java.util.function.Supplier;
@@ -21,7 +21,7 @@ public class PerQueryBatchedInvocationInput implements GraphQLBatchedInvocationI
   public PerQueryBatchedInvocationInput(
       List<GraphQLRequest> requests,
       GraphQLSchema schema,
-      Supplier<GraphQLContext> contextSupplier,
+      Supplier<GraphQLKickstartContext> contextSupplier,
       Object root,
       ContextSetting contextSetting) {
     invocationInputs =
diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/PerRequestBatchedInvocationInput.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/PerRequestBatchedInvocationInput.java
index 02bdae4c..e14e933d 100644
--- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/PerRequestBatchedInvocationInput.java
+++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/PerRequestBatchedInvocationInput.java
@@ -4,7 +4,7 @@
 
 import graphql.kickstart.execution.GraphQLRequest;
 import graphql.kickstart.execution.context.ContextSetting;
-import graphql.kickstart.execution.context.GraphQLContext;
+import graphql.kickstart.execution.context.GraphQLKickstartContext;
 import graphql.schema.GraphQLSchema;
 import java.util.List;
 import java.util.function.Supplier;
@@ -20,10 +20,10 @@ public class PerRequestBatchedInvocationInput implements GraphQLBatchedInvocatio
   public PerRequestBatchedInvocationInput(
       List<GraphQLRequest> requests,
       GraphQLSchema schema,
-      Supplier<GraphQLContext> contextSupplier,
+      Supplier<GraphQLKickstartContext> contextSupplier,
       Object root,
       ContextSetting contextSetting) {
-    GraphQLContext context = contextSupplier.get();
+    GraphQLKickstartContext context = contextSupplier.get();
     invocationInputs =
         requests.stream()
             .map(request -> new GraphQLSingleInvocationInput(request, schema, context, root))
diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java
index 4c2d4f66..36332142 100644
--- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java
+++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java
@@ -1,6 +1,7 @@
 package graphql.kickstart.servlet.context;
 
 import graphql.kickstart.execution.context.DefaultGraphQLContext;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -19,20 +20,19 @@ public class DefaultGraphQLServletContext extends DefaultGraphQLContext
 
   protected DefaultGraphQLServletContext(
       DataLoaderRegistry dataLoaderRegistry,
-      Subject subject,
       HttpServletRequest httpServletRequest,
       HttpServletResponse httpServletResponse) {
-    super(dataLoaderRegistry, subject);
+    super(dataLoaderRegistry);
     this.httpServletRequest = httpServletRequest;
     this.httpServletResponse = httpServletResponse;
   }
 
-  public static Builder createServletContext(DataLoaderRegistry registry, Subject subject) {
-    return new Builder(registry, subject);
+  public static Builder createServletContext(DataLoaderRegistry registry) {
+    return new Builder(registry);
   }
 
   public static Builder createServletContext() {
-    return new Builder(new DataLoaderRegistry(), null);
+    return new Builder(new DataLoaderRegistry());
   }
 
   @Override
@@ -59,21 +59,28 @@ public Map<String, List<Part>> getParts() {
     return httpServletRequest.getParts().stream().collect(Collectors.groupingBy(Part::getName));
   }
 
+  @Override
+  public Map<Object, Object> getMapOfContext() {
+    Map<Object, Object> map = new HashMap<>();
+    map.put(DataLoaderRegistry.class, getDataLoaderRegistry());
+    map.put(HttpServletRequest.class, httpServletRequest);
+    map.put(HttpServletResponse.class, httpServletResponse);
+    return map;
+  }
+
   public static class Builder {
 
     private HttpServletRequest httpServletRequest;
     private HttpServletResponse httpServletResponse;
     private DataLoaderRegistry dataLoaderRegistry;
-    private Subject subject;
 
-    private Builder(DataLoaderRegistry dataLoaderRegistry, Subject subject) {
+    private Builder(DataLoaderRegistry dataLoaderRegistry) {
       this.dataLoaderRegistry = dataLoaderRegistry;
-      this.subject = subject;
     }
 
     public DefaultGraphQLServletContext build() {
       return new DefaultGraphQLServletContext(
-          dataLoaderRegistry, subject, httpServletRequest, httpServletResponse);
+          dataLoaderRegistry, httpServletRequest, httpServletResponse);
     }
 
     public Builder with(HttpServletRequest httpServletRequest) {
@@ -86,11 +93,6 @@ public Builder with(DataLoaderRegistry dataLoaderRegistry) {
       return this;
     }
 
-    public Builder with(Subject subject) {
-      this.subject = subject;
-      return this;
-    }
-
     public Builder with(HttpServletResponse httpServletResponse) {
       this.httpServletResponse = httpServletResponse;
       return this;
diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContextBuilder.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContextBuilder.java
index 80cee6cb..126fc139 100644
--- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContextBuilder.java
+++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContextBuilder.java
@@ -1,7 +1,7 @@
 package graphql.kickstart.servlet.context;
 
 import graphql.kickstart.execution.context.DefaultGraphQLContextBuilder;
-import graphql.kickstart.execution.context.GraphQLContext;
+import graphql.kickstart.execution.context.GraphQLKickstartContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.websocket.Session;
@@ -12,12 +12,12 @@ public class DefaultGraphQLServletContextBuilder extends DefaultGraphQLContextBu
     implements GraphQLServletContextBuilder {
 
   @Override
-  public GraphQLContext build(HttpServletRequest request, HttpServletResponse response) {
+  public GraphQLKickstartContext build(HttpServletRequest request, HttpServletResponse response) {
     return DefaultGraphQLServletContext.createServletContext().with(request).with(response).build();
   }
 
   @Override
-  public GraphQLContext build(Session session, HandshakeRequest handshakeRequest) {
+  public GraphQLKickstartContext build(Session session, HandshakeRequest handshakeRequest) {
     return DefaultGraphQLWebSocketContext.createWebSocketContext()
         .with(session)
         .with(handshakeRequest)
diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java
index e33fb6e8..e5b5353b 100644
--- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java
+++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java
@@ -1,7 +1,8 @@
 package graphql.kickstart.servlet.context;
 
 import graphql.kickstart.execution.context.DefaultGraphQLContext;
-import javax.security.auth.Subject;
+import java.util.HashMap;
+import java.util.Map;
 import javax.websocket.Session;
 import javax.websocket.server.HandshakeRequest;
 import org.dataloader.DataLoaderRegistry;
@@ -13,21 +14,18 @@ public class DefaultGraphQLWebSocketContext extends DefaultGraphQLContext
   private final HandshakeRequest handshakeRequest;
 
   private DefaultGraphQLWebSocketContext(
-      DataLoaderRegistry dataLoaderRegistry,
-      Subject subject,
-      Session session,
-      HandshakeRequest handshakeRequest) {
-    super(dataLoaderRegistry, subject);
+      DataLoaderRegistry dataLoaderRegistry, Session session, HandshakeRequest handshakeRequest) {
+    super(dataLoaderRegistry);
     this.session = session;
     this.handshakeRequest = handshakeRequest;
   }
 
-  public static Builder createWebSocketContext(DataLoaderRegistry registry, Subject subject) {
-    return new Builder(registry, subject);
+  public static Builder createWebSocketContext(DataLoaderRegistry registry) {
+    return new Builder(registry);
   }
 
   public static Builder createWebSocketContext() {
-    return new Builder(new DataLoaderRegistry(), null);
+    return new Builder(new DataLoaderRegistry());
   }
 
   @Override
@@ -40,21 +38,27 @@ public HandshakeRequest getHandshakeRequest() {
     return handshakeRequest;
   }
 
+  @Override
+  public Map<Object, Object> getMapOfContext() {
+    Map<Object, Object> map = new HashMap<>();
+    map.put(DataLoaderRegistry.class, getDataLoaderRegistry());
+    map.put(Session.class, session);
+    map.put(HandshakeRequest.class, handshakeRequest);
+    return map;
+  }
+
   public static class Builder {
 
     private Session session;
     private HandshakeRequest handshakeRequest;
     private DataLoaderRegistry dataLoaderRegistry;
-    private Subject subject;
 
-    private Builder(DataLoaderRegistry dataLoaderRegistry, Subject subject) {
+    private Builder(DataLoaderRegistry dataLoaderRegistry) {
       this.dataLoaderRegistry = dataLoaderRegistry;
-      this.subject = subject;
     }
 
     public DefaultGraphQLWebSocketContext build() {
-      return new DefaultGraphQLWebSocketContext(
-          dataLoaderRegistry, subject, session, handshakeRequest);
+      return new DefaultGraphQLWebSocketContext(dataLoaderRegistry, session, handshakeRequest);
     }
 
     public Builder with(Session session) {
@@ -71,10 +75,5 @@ public Builder with(DataLoaderRegistry dataLoaderRegistry) {
       this.dataLoaderRegistry = dataLoaderRegistry;
       return this;
     }
-
-    public Builder with(Subject subject) {
-      this.subject = subject;
-      return this;
-    }
   }
 }
diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContext.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContext.java
index 36e744a2..2ce8ad68 100644
--- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContext.java
+++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContext.java
@@ -1,13 +1,13 @@
 package graphql.kickstart.servlet.context;
 
-import graphql.kickstart.execution.context.GraphQLContext;
+import graphql.kickstart.execution.context.GraphQLKickstartContext;
 import java.util.List;
 import java.util.Map;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.Part;
 
-public interface GraphQLServletContext extends GraphQLContext {
+public interface GraphQLServletContext extends GraphQLKickstartContext {
 
   List<Part> getFileParts();
 
diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContextBuilder.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContextBuilder.java
index fcb10ed7..6c0ee4b2 100644
--- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContextBuilder.java
+++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContextBuilder.java
@@ -1,6 +1,6 @@
 package graphql.kickstart.servlet.context;
 
-import graphql.kickstart.execution.context.GraphQLContext;
+import graphql.kickstart.execution.context.GraphQLKickstartContext;
 import graphql.kickstart.execution.context.GraphQLContextBuilder;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -9,8 +9,8 @@
 
 public interface GraphQLServletContextBuilder extends GraphQLContextBuilder {
 
-  GraphQLContext build(
+  GraphQLKickstartContext build(
       HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse);
 
-  GraphQLContext build(Session session, HandshakeRequest handshakeRequest);
+  GraphQLKickstartContext build(Session session, HandshakeRequest handshakeRequest);
 }
diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLWebSocketContext.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLWebSocketContext.java
index 3c20ba21..d718121f 100644
--- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLWebSocketContext.java
+++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLWebSocketContext.java
@@ -1,10 +1,10 @@
 package graphql.kickstart.servlet.context;
 
-import graphql.kickstart.execution.context.GraphQLContext;
+import graphql.kickstart.execution.context.GraphQLKickstartContext;
 import javax.websocket.Session;
 import javax.websocket.server.HandshakeRequest;
 
-public interface GraphQLWebSocketContext extends GraphQLContext {
+public interface GraphQLWebSocketContext extends GraphQLKickstartContext {
 
   Session getSession();
 
diff --git a/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/DataLoaderDispatchingSpec.groovy b/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/DataLoaderDispatchingSpec.groovy
index 182936d7..6ab5f38c 100644
--- a/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/DataLoaderDispatchingSpec.groovy
+++ b/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/DataLoaderDispatchingSpec.groovy
@@ -8,8 +8,9 @@ import graphql.execution.instrumentation.SimpleInstrumentation
 import graphql.execution.instrumentation.dataloader.DataLoaderDispatcherInstrumentationOptions
 import graphql.kickstart.execution.context.ContextSetting
 import graphql.kickstart.execution.context.DefaultGraphQLContext
-import graphql.kickstart.execution.context.GraphQLContext
+import graphql.kickstart.execution.context.GraphQLKickstartContext
 import graphql.kickstart.execution.instrumentation.ConfigurableDispatchInstrumentation
+import graphql.kickstart.servlet.context.GraphQLServletContextBuilder
 import graphql.schema.DataFetcher
 import graphql.schema.DataFetchingEnvironment
 import org.dataloader.BatchLoader
@@ -83,20 +84,20 @@ class DataLoaderDispatchingSpec extends Specification {
   }
 
   def contextBuilder() {
-    return new graphql.kickstart.servlet.context.GraphQLServletContextBuilder() {
+    return new GraphQLServletContextBuilder() {
       @Override
-      GraphQLContext build(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
-        new DefaultGraphQLContext(registry(), null)
+      GraphQLKickstartContext build(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
+        new DefaultGraphQLContext(registry())
       }
 
       @Override
-      GraphQLContext build(Session session, HandshakeRequest handshakeRequest) {
-        new DefaultGraphQLContext(registry(), null)
+      GraphQLKickstartContext build(Session session, HandshakeRequest handshakeRequest) {
+        new DefaultGraphQLContext(registry())
       }
 
       @Override
-      GraphQLContext build() {
-        new DefaultGraphQLContext(registry(), null)
+      GraphQLKickstartContext build() {
+        new DefaultGraphQLContext(registry())
       }
     }
   }
diff --git a/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/OsgiGraphQLHttpServletSpec.groovy b/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/OsgiGraphQLHttpServletSpec.groovy
index 6de50bba..3f9a233d 100644
--- a/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/OsgiGraphQLHttpServletSpec.groovy
+++ b/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/OsgiGraphQLHttpServletSpec.groovy
@@ -4,7 +4,6 @@ import graphql.AssertException
 import graphql.annotations.annotationTypes.GraphQLField
 import graphql.annotations.annotationTypes.GraphQLName
 import graphql.annotations.processor.GraphQLAnnotations
-import graphql.execution.instrumentation.Instrumentation
 import graphql.execution.instrumentation.InstrumentationState
 import graphql.execution.instrumentation.SimpleInstrumentation
 import graphql.execution.instrumentation.parameters.InstrumentationCreateStateParameters
@@ -12,11 +11,10 @@ import graphql.kickstart.execution.GraphQLRequest
 import graphql.kickstart.execution.config.ExecutionStrategyProvider
 import graphql.kickstart.execution.config.InstrumentationProvider
 import graphql.kickstart.execution.context.DefaultGraphQLContext
-import graphql.kickstart.execution.context.GraphQLContext
+import graphql.kickstart.execution.context.GraphQLKickstartContext
 import graphql.kickstart.servlet.context.GraphQLServletContextBuilder
 import graphql.kickstart.servlet.core.GraphQLServletListener
 import graphql.kickstart.servlet.core.GraphQLServletRootObjectBuilder
-import graphql.kickstart.servlet.input.NoOpBatchInputPreProcessor
 import graphql.kickstart.servlet.osgi.*
 import graphql.schema.*
 import org.dataloader.DataLoaderRegistry
@@ -286,9 +284,8 @@ class OsgiGraphQLHttpServletSpec extends Specification {
   def "context builder is bound and unbound"() {
     setup:
     def servlet = new OsgiGraphQLHttpServlet()
-    def context = Mock(GraphQLContext)
+    def context = Mock(GraphQLKickstartContext)
     context.getDataLoaderRegistry() >> new DataLoaderRegistry()
-    context.getSubject() >> Optional.empty()
     def contextBuilder = Mock(GraphQLServletContextBuilder)
     contextBuilder.build() >> context
     def request = GraphQLRequest.createIntrospectionRequest()

From cc60866c87e40f4f3c1df2b90313544b5b6be54f Mon Sep 17 00:00:00 2001
From: oliemansm <oliemans@scopisto.com>
Date: Sat, 22 Jan 2022 21:33:16 +0100
Subject: [PATCH 2/5] chore: mark methods as deprecated

---
 .../context/DefaultGraphQLServletContext.java | 25 ++++++++++++++++++-
 .../DefaultGraphQLWebSocketContext.java       | 11 ++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java
index 36332142..d19fb76c 100644
--- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java
+++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java
@@ -5,7 +5,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
-import javax.security.auth.Subject;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.Part;
@@ -35,17 +34,35 @@ public static Builder createServletContext() {
     return new Builder(new DataLoaderRegistry());
   }
 
+  /**
+   * @deprecated Use
+   *     <tt>dataFetchingEnvironment.getGraphQlContext().get(HttpServletRequest.class)</tt> instead.
+   *     Since 13.0.0
+   */
   @Override
+  @Deprecated
   public HttpServletRequest getHttpServletRequest() {
     return httpServletRequest;
   }
 
+  /**
+   * @deprecated Use
+   *     <tt>dataFetchingEnvironment.getGraphQlContext().get(HttpServletResponse.class)</tt>
+   *     instead. Since 13.0.0
+   */
   @Override
+  @Deprecated
   public HttpServletResponse getHttpServletResponse() {
     return httpServletResponse;
   }
 
+  /**
+   * @deprecated Use
+   *     <tt>dataFetchingEnvironment.getGraphQlContext().get(HttpServletRequest.class)</tt> instead
+   *     to get the request and retrieve the file parts yourself. Since 13.0.0
+   */
   @Override
+  @Deprecated
   @SneakyThrows
   public List<Part> getFileParts() {
     return httpServletRequest.getParts().stream()
@@ -53,7 +70,13 @@ public List<Part> getFileParts() {
         .collect(Collectors.toList());
   }
 
+  /**
+   * @deprecated Use
+   *     <tt>dataFetchingEnvironment.getGraphQlContext().get(HttpServletRequest.class)</tt> instead
+   *     to get the request and retrieve the parts yourself. Since 13.0.0
+   */
   @Override
+  @Deprecated
   @SneakyThrows
   public Map<String, List<Part>> getParts() {
     return httpServletRequest.getParts().stream().collect(Collectors.groupingBy(Part::getName));
diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java
index e5b5353b..136720c5 100644
--- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java
+++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java
@@ -28,12 +28,23 @@ public static Builder createWebSocketContext() {
     return new Builder(new DataLoaderRegistry());
   }
 
+  /**
+   * @deprecated Use <tt>dataFetchingEnvironment.getGraphQlContext().get(Session.class)</tt>
+   *     instead. Since 13.0.0
+   */
   @Override
+  @Deprecated
   public Session getSession() {
     return session;
   }
 
+  /**
+   * @deprecated Use
+   *     <tt>dataFetchingEnvironment.getGraphQlContext().get(HandshakeRequest.class)</tt> instead.
+   *     Since 13.0.0
+   */
   @Override
+  @Deprecated
   public HandshakeRequest getHandshakeRequest() {
     return handshakeRequest;
   }

From 01cd8efe9eca58c2c2d30a686e7fc25984ec600b Mon Sep 17 00:00:00 2001
From: oliemansm <oliemans@scopisto.com>
Date: Sat, 22 Jan 2022 21:37:52 +0100
Subject: [PATCH 3/5] fix: failing osgi unit test

---
 .../graphql/kickstart/servlet/OsgiGraphQLHttpServletSpec.groovy  | 1 +
 1 file changed, 1 insertion(+)

diff --git a/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/OsgiGraphQLHttpServletSpec.groovy b/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/OsgiGraphQLHttpServletSpec.groovy
index 3f9a233d..7556946a 100644
--- a/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/OsgiGraphQLHttpServletSpec.groovy
+++ b/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/OsgiGraphQLHttpServletSpec.groovy
@@ -286,6 +286,7 @@ class OsgiGraphQLHttpServletSpec extends Specification {
     def servlet = new OsgiGraphQLHttpServlet()
     def context = Mock(GraphQLKickstartContext)
     context.getDataLoaderRegistry() >> new DataLoaderRegistry()
+    context.getMapOfContext() >> new HashMap<Object, Object>()
     def contextBuilder = Mock(GraphQLServletContextBuilder)
     contextBuilder.build() >> context
     def request = GraphQLRequest.createIntrospectionRequest()

From bf7130c86ef89a0e7fcd8ec4f06054f9f1a7bf54 Mon Sep 17 00:00:00 2001
From: oliemansm <oliemans@scopisto.com>
Date: Sun, 23 Jan 2022 11:01:33 +0100
Subject: [PATCH 4/5] chore: refactor context builder

---
 .../context/DefaultGraphQLContext.java        | 18 +++++--
 .../context/GraphQLKickstartContext.java      | 13 +++++
 .../context/DefaultGraphQLServletContext.java | 51 ++++++++-----------
 .../DefaultGraphQLServletContextBuilder.java  | 15 ++++--
 .../DefaultGraphQLWebSocketContext.java       | 33 ++++--------
 .../context/GraphQLServletContext.java        |  1 +
 .../context/GraphQLWebSocketContext.java      |  1 +
 7 files changed, 70 insertions(+), 62 deletions(-)

diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContext.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContext.java
index 90532f9e..dda335d0 100644
--- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContext.java
+++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/DefaultGraphQLContext.java
@@ -12,16 +12,30 @@
 public class DefaultGraphQLContext implements GraphQLKickstartContext {
 
   private final DataLoaderRegistry dataLoaderRegistry;
+  private final Map<Object, Object> map;
 
-  public DefaultGraphQLContext(DataLoaderRegistry dataLoaderRegistry) {
+  public DefaultGraphQLContext(DataLoaderRegistry dataLoaderRegistry, Map<Object, Object> map) {
     this.dataLoaderRegistry =
         Objects.requireNonNull(dataLoaderRegistry, "dataLoaderRegistry is required");
+    this.map = Objects.requireNonNull(map, "map is required");
+  }
+
+  public DefaultGraphQLContext(Map<Object, Object> map) {
+    this(new DataLoaderRegistry(), map);
+  }
+
+  public DefaultGraphQLContext(DataLoaderRegistry dataLoaderRegistry) {
+    this(dataLoaderRegistry, new HashMap<>());
   }
 
   public DefaultGraphQLContext() {
     this(new DataLoaderRegistry());
   }
 
+  public void put(Object key, Object value) {
+    map.put(key, value);
+  }
+
   @Override
   public DataLoaderRegistry getDataLoaderRegistry() {
     return dataLoaderRegistry;
@@ -29,8 +43,6 @@ public DataLoaderRegistry getDataLoaderRegistry() {
 
   @Override
   public Map<Object, Object> getMapOfContext() {
-    Map<Object, Object> map = new HashMap<>();
-    map.put(DataLoaderRegistry.class, dataLoaderRegistry);
     return map;
   }
 }
diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLKickstartContext.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLKickstartContext.java
index 019ce433..f04e7e8f 100644
--- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLKickstartContext.java
+++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/context/GraphQLKickstartContext.java
@@ -7,6 +7,19 @@
 /** Represents the context required by the servlet to execute a GraphQL request. */
 public interface GraphQLKickstartContext {
 
+  static GraphQLKickstartContext of(Map<Object, Object> map) {
+    return new DefaultGraphQLContext(map);
+  }
+
+  static GraphQLKickstartContext of(DataLoaderRegistry dataLoaderRegistry) {
+    return new DefaultGraphQLContext(dataLoaderRegistry);
+  }
+
+  static GraphQLKickstartContext of(
+      DataLoaderRegistry dataLoaderRegistry, Map<Object, Object> map) {
+    return new DefaultGraphQLContext(dataLoaderRegistry, map);
+  }
+
   /** @return the Dataloader registry to use for the execution. Must not return <code>null</code> */
   @NonNull
   DataLoaderRegistry getDataLoaderRegistry();
diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java
index d19fb76c..9c366dd1 100644
--- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java
+++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContext.java
@@ -1,7 +1,6 @@
 package graphql.kickstart.servlet.context;
 
 import graphql.kickstart.execution.context.DefaultGraphQLContext;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -11,19 +10,17 @@
 import lombok.SneakyThrows;
 import org.dataloader.DataLoaderRegistry;
 
+/** @deprecated Use {@link graphql.kickstart.execution.context.GraphQLKickstartContext} instead */
 public class DefaultGraphQLServletContext extends DefaultGraphQLContext
     implements GraphQLServletContext {
 
-  private final HttpServletRequest httpServletRequest;
-  private final HttpServletResponse httpServletResponse;
-
   protected DefaultGraphQLServletContext(
       DataLoaderRegistry dataLoaderRegistry,
       HttpServletRequest httpServletRequest,
       HttpServletResponse httpServletResponse) {
     super(dataLoaderRegistry);
-    this.httpServletRequest = httpServletRequest;
-    this.httpServletResponse = httpServletResponse;
+    put(HttpServletRequest.class, httpServletRequest);
+    put(HttpServletResponse.class, httpServletResponse);
   }
 
   public static Builder createServletContext(DataLoaderRegistry registry) {
@@ -35,60 +32,52 @@ public static Builder createServletContext() {
   }
 
   /**
-   * @deprecated Use
-   *     <tt>dataFetchingEnvironment.getGraphQlContext().get(HttpServletRequest.class)</tt> instead.
-   *     Since 13.0.0
+   * @deprecated Use {@code
+   *     dataFetchingEnvironment.getGraphQlContext().get(HttpServletRequest.class)} instead. Since
+   *     13.0.0
    */
   @Override
   @Deprecated
   public HttpServletRequest getHttpServletRequest() {
-    return httpServletRequest;
+    return (HttpServletRequest) getMapOfContext().get(HttpServletRequest.class);
   }
 
   /**
-   * @deprecated Use
-   *     <tt>dataFetchingEnvironment.getGraphQlContext().get(HttpServletResponse.class)</tt>
-   *     instead. Since 13.0.0
+   * @deprecated Use {@code
+   *     dataFetchingEnvironment.getGraphQlContext().get(HttpServletResponse.class)} instead. Since
+   *     13.0.0
    */
   @Override
   @Deprecated
   public HttpServletResponse getHttpServletResponse() {
-    return httpServletResponse;
+    return (HttpServletResponse) getMapOfContext().get(HttpServletResponse.class);
   }
 
   /**
-   * @deprecated Use
-   *     <tt>dataFetchingEnvironment.getGraphQlContext().get(HttpServletRequest.class)</tt> instead
-   *     to get the request and retrieve the file parts yourself. Since 13.0.0
+   * @deprecated Use {@code
+   *     dataFetchingEnvironment.getGraphQlContext().get(HttpServletRequest.class)} instead to get
+   *     the request and retrieve the file parts yourself. Since 13.0.0
    */
   @Override
   @Deprecated
   @SneakyThrows
   public List<Part> getFileParts() {
-    return httpServletRequest.getParts().stream()
+    return getHttpServletRequest().getParts().stream()
         .filter(part -> part.getContentType() != null)
         .collect(Collectors.toList());
   }
 
   /**
-   * @deprecated Use
-   *     <tt>dataFetchingEnvironment.getGraphQlContext().get(HttpServletRequest.class)</tt> instead
-   *     to get the request and retrieve the parts yourself. Since 13.0.0
+   * @deprecated Use {@code
+   *     dataFetchingEnvironment.getGraphQlContext().get(HttpServletRequest.class)} instead to get
+   *     the request and retrieve the parts yourself. Since 13.0.0
    */
   @Override
   @Deprecated
   @SneakyThrows
   public Map<String, List<Part>> getParts() {
-    return httpServletRequest.getParts().stream().collect(Collectors.groupingBy(Part::getName));
-  }
-
-  @Override
-  public Map<Object, Object> getMapOfContext() {
-    Map<Object, Object> map = new HashMap<>();
-    map.put(DataLoaderRegistry.class, getDataLoaderRegistry());
-    map.put(HttpServletRequest.class, httpServletRequest);
-    map.put(HttpServletResponse.class, httpServletResponse);
-    return map;
+    return getHttpServletRequest().getParts().stream()
+        .collect(Collectors.groupingBy(Part::getName));
   }
 
   public static class Builder {
diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContextBuilder.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContextBuilder.java
index 126fc139..c7a1dad4 100644
--- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContextBuilder.java
+++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLServletContextBuilder.java
@@ -2,6 +2,8 @@
 
 import graphql.kickstart.execution.context.DefaultGraphQLContextBuilder;
 import graphql.kickstart.execution.context.GraphQLKickstartContext;
+import java.util.HashMap;
+import java.util.Map;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.websocket.Session;
@@ -13,14 +15,17 @@ public class DefaultGraphQLServletContextBuilder extends DefaultGraphQLContextBu
 
   @Override
   public GraphQLKickstartContext build(HttpServletRequest request, HttpServletResponse response) {
-    return DefaultGraphQLServletContext.createServletContext().with(request).with(response).build();
+    Map<Object, Object> map = new HashMap<>();
+    map.put(HttpServletRequest.class, request);
+    map.put(HttpServletResponse.class, response);
+    return GraphQLKickstartContext.of(map);
   }
 
   @Override
   public GraphQLKickstartContext build(Session session, HandshakeRequest handshakeRequest) {
-    return DefaultGraphQLWebSocketContext.createWebSocketContext()
-        .with(session)
-        .with(handshakeRequest)
-        .build();
+    Map<Object, Object> map = new HashMap<>();
+    map.put(Session.class, session);
+    map.put(HandshakeRequest.class, handshakeRequest);
+    return GraphQLKickstartContext.of(map);
   }
 }
diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java
index 136720c5..32beb4c2 100644
--- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java
+++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/DefaultGraphQLWebSocketContext.java
@@ -1,23 +1,20 @@
 package graphql.kickstart.servlet.context;
 
 import graphql.kickstart.execution.context.DefaultGraphQLContext;
-import java.util.HashMap;
-import java.util.Map;
 import javax.websocket.Session;
 import javax.websocket.server.HandshakeRequest;
 import org.dataloader.DataLoaderRegistry;
 
+/** @deprecated Use {@link graphql.kickstart.execution.context.GraphQLKickstartContext} instead */
+@Deprecated
 public class DefaultGraphQLWebSocketContext extends DefaultGraphQLContext
     implements GraphQLWebSocketContext {
 
-  private final Session session;
-  private final HandshakeRequest handshakeRequest;
-
   private DefaultGraphQLWebSocketContext(
       DataLoaderRegistry dataLoaderRegistry, Session session, HandshakeRequest handshakeRequest) {
     super(dataLoaderRegistry);
-    this.session = session;
-    this.handshakeRequest = handshakeRequest;
+    put(Session.class, session);
+    put(HandshakeRequest.class, handshakeRequest);
   }
 
   public static Builder createWebSocketContext(DataLoaderRegistry registry) {
@@ -29,33 +26,23 @@ public static Builder createWebSocketContext() {
   }
 
   /**
-   * @deprecated Use <tt>dataFetchingEnvironment.getGraphQlContext().get(Session.class)</tt>
-   *     instead. Since 13.0.0
+   * @deprecated Use {@code dataFetchingEnvironment.getGraphQlContext().get(Session.class)} instead.
+   *     Since 13.0.0
    */
   @Override
   @Deprecated
   public Session getSession() {
-    return session;
+    return (Session) getMapOfContext().get(Session.class);
   }
 
   /**
-   * @deprecated Use
-   *     <tt>dataFetchingEnvironment.getGraphQlContext().get(HandshakeRequest.class)</tt> instead.
-   *     Since 13.0.0
+   * @deprecated Use {@code dataFetchingEnvironment.getGraphQlContext().get(HandshakeRequest.class)}
+   *     instead. Since 13.0.0
    */
   @Override
   @Deprecated
   public HandshakeRequest getHandshakeRequest() {
-    return handshakeRequest;
-  }
-
-  @Override
-  public Map<Object, Object> getMapOfContext() {
-    Map<Object, Object> map = new HashMap<>();
-    map.put(DataLoaderRegistry.class, getDataLoaderRegistry());
-    map.put(Session.class, session);
-    map.put(HandshakeRequest.class, handshakeRequest);
-    return map;
+    return (HandshakeRequest) getMapOfContext().get(HandshakeRequest.class);
   }
 
   public static class Builder {
diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContext.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContext.java
index 2ce8ad68..9fc42d0c 100644
--- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContext.java
+++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLServletContext.java
@@ -7,6 +7,7 @@
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.Part;
 
+/** @deprecated Use {@link graphql.kickstart.execution.context.GraphQLKickstartContext} instead */
 public interface GraphQLServletContext extends GraphQLKickstartContext {
 
   List<Part> getFileParts();
diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLWebSocketContext.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLWebSocketContext.java
index d718121f..d244eb8d 100644
--- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLWebSocketContext.java
+++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/context/GraphQLWebSocketContext.java
@@ -4,6 +4,7 @@
 import javax.websocket.Session;
 import javax.websocket.server.HandshakeRequest;
 
+/** @deprecated Use {@link graphql.kickstart.execution.context.GraphQLKickstartContext} instead */
 public interface GraphQLWebSocketContext extends GraphQLKickstartContext {
 
   Session getSession();

From 03c2fc01e1ff71e2cbf27db46a6cd8ddd9476c94 Mon Sep 17 00:00:00 2001
From: oliemansm <oliemans@scopisto.com>
Date: Sun, 23 Jan 2022 11:23:35 +0100
Subject: [PATCH 5/5] fix: support poorly formatted graphql queries fixes #385

---
 .../GraphQLPostInvocationInputParser.java     |  5 +++--
 .../AbstractGraphQLHttpServletSpec.groovy     | 19 +++++++++++++++++++
 2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLPostInvocationInputParser.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLPostInvocationInputParser.java
index 21ec61ea..5b114c42 100644
--- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLPostInvocationInputParser.java
+++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLPostInvocationInputParser.java
@@ -10,6 +10,7 @@
 import graphql.kickstart.servlet.input.GraphQLInvocationInputFactory;
 import java.io.IOException;
 import java.util.List;
+import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -27,12 +28,12 @@ class GraphQLPostInvocationInputParser extends AbstractGraphQLInvocationInputPar
   public GraphQLInvocationInput getGraphQLInvocationInput(
       HttpServletRequest request, HttpServletResponse response) throws IOException {
     if (APPLICATION_GRAPHQL.equals(request.getContentType())) {
-      String query = request.getReader().lines().collect(joining());
+      String query = request.getReader().lines().collect(joining(" "));
       GraphQLRequest graphqlRequest = GraphQLRequest.createQueryOnlyRequest(query);
       return invocationInputFactory.create(graphqlRequest, request, response);
     }
 
-    String body = request.getReader().lines().collect(joining());
+    String body = request.getReader().lines().collect(joining(" "));
     if (isSingleQuery(body)) {
       GraphQLRequest graphqlRequest = graphQLObjectMapper.readGraphQLRequest(body);
       return invocationInputFactory.create(graphqlRequest, request, response);
diff --git a/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/AbstractGraphQLHttpServletSpec.groovy b/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/AbstractGraphQLHttpServletSpec.groovy
index 0eb86ef9..022621de 100644
--- a/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/AbstractGraphQLHttpServletSpec.groovy
+++ b/graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/AbstractGraphQLHttpServletSpec.groovy
@@ -422,6 +422,25 @@ class AbstractGraphQLHttpServletSpec extends Specification {
     getResponseContent().data.echo == "test"
   }
 
+  def "query over HTTP POST multiline body returns data"() {
+    setup:
+    request.setContent("""
+        query { object {
+a
+b
+        } }""".bytes)
+    request.setMethod("POST")
+    request.contentType = "application/graphql"
+
+    when:
+    servlet.doPost(request, response)
+
+    then:
+    response.getStatus() == STATUS_OK
+    response.getContentType() == CONTENT_TYPE_JSON_UTF8
+    getResponseContent().data.object.b == null
+  }
+
   def "disabling async support on request over HTTP POST does not start async request"() {
     setup:
     servlet = TestUtils.createDefaultServlet({ env -> env.arguments.arg }, { env -> env.arguments.arg }, { env ->