OnCreateQueryRequestAsync(HttpContext context)
        {
#if ASPNETCLASSIC
            IReadableStringCollection requestQuery = context.Request.Query;
#else
            IQueryCollection requestQuery = context.Request.Query;
#endif

            IQueryRequestBuilder builder =
                QueryRequestBuilder.New()
                .SetQuery(requestQuery[_queryIdentifier])
                .SetQueryName(requestQuery[_namedQueryIdentifier])
                .SetOperation(requestQuery[_operationNameIdentifier]);

            string variables = requestQuery[_variablesIdentifier];
            if (variables != null &&
                variables.Any() &&
                Utf8GraphQLRequestParser.ParseJson(variables)
                is IReadOnlyDictionary <string, object> v)
            {
                builder.SetVariableValues(v);
            }

            return(Task.FromResult(builder));
        }
Exemple #2
0
        protected override async Task ExecuteRequestAsync(HttpHelper httpHelper)
        {
            var builder = QueryRequestBuilder.New();
            IQueryCollection requestQuery = httpHelper.Context.Request.Query;

            builder
            .SetQuery(requestQuery[_queryIdentifier])
            .SetQueryName(requestQuery[_namedQueryIdentifier])
            .SetOperation(requestQuery[_operationNameIdentifier]);

            string variables = requestQuery[_variablesIdentifier];

            if (variables != null &&
                variables.Length > 0 &&
                Utf8GraphQLRequestParser.ParseJson(variables)
                is IReadOnlyDictionary <string, object> v)
            {
                builder.SetVariableValues(v);
            }

            IReadOnlyQueryRequest request =
                await BuildRequestAsync(
                    httpHelper.Context,
                    httpHelper.Services,
                    builder)
                .ConfigureAwait(false);

            httpHelper.StatusCode = OK;
            httpHelper.Result     = await _queryExecutor
                                    .ExecuteAsync(request, httpHelper.Context.RequestAborted)
                                    .ConfigureAwait(false);
        }
        public async Task DeserializeQueryResultWithErrors()
        {
            // arrange
            var qux = new OrderedDictionary {
                { "quux", 123 }
            };
            var baz = new OrderedDictionary {
                { "qux", qux }
            };
            var objectList = new List <object> {
                baz
            };
            var scalarList = new List <object> {
                123
            };

            var result = QueryResultBuilder.New();

            var data = new OrderedDictionary();

            data["foo"] = objectList;
            data["bar"] = scalarList;
            data["baz"] = baz;
            result.SetData(data);

            result.AddError(ErrorBuilder.New()
                            .SetMessage("foo")
                            .SetPath(Path.New("root").Append("child"))
                            .AddLocation(new Location(15, 16))
                            .SetExtension("bar", "baz")
                            .Build());

            result.AddError(ErrorBuilder.New()
                            .SetMessage("qux")
                            .SetExtension("bar", "baz")
                            .Build());

            result.AddError(ErrorBuilder.New()
                            .SetMessage("quux")
                            .Build());

            var stream     = new MemoryStream();
            var serializer = new JsonQueryResultSerializer();
            await serializer.SerializeAsync(result.Create(), stream);

            byte[] buffer = stream.ToArray();

            var serializedResult = Utf8GraphQLRequestParser.ParseJson(buffer);

            // act
            IReadOnlyQueryResult deserializedResult =
                HttpResponseDeserializer.Deserialize(
                    (IReadOnlyDictionary <string, object>)serializedResult);

            // assert
            Snapshot.Match(deserializedResult);
        }
        protected override async Task ExecuteRequestAsync(
            HttpContext context,
            IServiceProvider services)
        {
            var builder = QueryRequestBuilder.New();

#if ASPNETCLASSIC
            IReadableStringCollection requestQuery = context.Request.Query;
#else
            IQueryCollection requestQuery = context.Request.Query;
#endif

            builder
            .SetQuery(requestQuery[_queryIdentifier])
            .SetQueryName(requestQuery[_namedQueryIdentifier])
            .SetOperation(requestQuery[_operationNameIdentifier]);

            string variables = requestQuery[_variablesIdentifier];
            if (variables != null &&
                variables.Length > 0 &&
                Utf8GraphQLRequestParser.ParseJson(variables)
                is IReadOnlyDictionary <string, object> v)
            {
                builder.SetVariableValues(v);
            }

            IReadOnlyQueryRequest request =
                await BuildRequestAsync(
                    context,
                    services,
                    builder)
                .ConfigureAwait(false);

            var schemaName = await _schemaNameProvider(context).ConfigureAwait(false);

            var _queryExecutor = _queryExecutorProvider.GetQueryExecutor(schemaName);

            IExecutionResult result = await _queryExecutor
                                      .ExecuteAsync(request, context.GetCancellationToken())
                                      .ConfigureAwait(false);

            SetResponseHeaders(
                context.Response,
                _resultSerializer.ContentType);

            await _resultSerializer.SerializeAsync(
                result,
                context.Response.Body,
                context.GetCancellationToken())
            .ConfigureAwait(false);
        }
        public async Task DeserializeQueryResultWithExtensions()
        {
            // arrange
            var qux = new OrderedDictionary {
                { "quux", 123 }
            };
            var baz = new OrderedDictionary {
                { "qux", qux }
            };
            var objectList = new List <object> {
                baz
            };
            var scalarList = new List <object> {
                123
            };

            var result = QueryResultBuilder.New();

            var data = new OrderedDictionary();

            data["foo"] = objectList;
            data["bar"] = scalarList;
            data["baz"] = baz;
            result.SetData(data);

            var extensionData = new ExtensionData();

            extensionData["foo"] = objectList;
            extensionData["bar"] = scalarList;
            extensionData["baz"] = baz;
            result.SetExtensions(extensionData);

            var stream     = new MemoryStream();
            var serializer = new JsonQueryResultSerializer();
            await serializer.SerializeAsync(result.Create(), stream);

            byte[] buffer = stream.ToArray();

            var serializedResult = Utf8GraphQLRequestParser.ParseJson(buffer);

            // act
            IReadOnlyQueryResult deserializedResult =
                HttpResponseDeserializer.Deserialize(
                    (IReadOnlyDictionary <string, object>)serializedResult);

            // assert
            deserializedResult.MatchSnapshot(m => m.Ignore(c => c.Field <JObject>("Extensions")));
            deserializedResult.Extensions.OrderBy(t => t.Key)
            .MatchSnapshot(new SnapshotNameExtension("extensions"));
        }
        private IReadOnlyList <GraphQLRequest> ParseRequest(
            byte[] buffer, int bytesBuffered)
        {
            var graphQLData = new ReadOnlySpan <byte>(buffer);

            graphQLData = graphQLData.Slice(0, bytesBuffered);

            var requestParser = new Utf8GraphQLRequestParser(
                graphQLData,
                _parserOptions,
                _documentCache,
                _documentHashProvider);

            return(requestParser.Parse());
        }
        private static InitializeConnectionMessage DeserializeInitConnMessage(
            GraphQLSocketMessage parsedMessage)
        {
            if (parsedMessage.HasPayload)
            {
                object parsed = Utf8GraphQLRequestParser.ParseJson(
                    parsedMessage.Payload);

                if (parsed is IReadOnlyDictionary <string, object> payload)
                {
                    return(new InitializeConnectionMessage(payload));
                }
            }
            return(new InitializeConnectionMessage(null));
        }
        private static bool TryDeserializeDataStartMessage(
            GraphQLSocketMessage parsedMessage,
            out OperationMessage message)
        {
            if (!parsedMessage.HasPayload)
            {
                message = null;
                return(false);
            }

            IReadOnlyList <GraphQLRequest> batch =
                Utf8GraphQLRequestParser.Parse(parsedMessage.Payload);

            message = new DataStartMessage(parsedMessage.Id, batch[0]);
            return(true);
        }
Exemple #9
0
        private static bool TryDeserializeDataStartMessage(
            GraphQLSocketMessage parsedMessage,
            [NotNullWhen(true)] out OperationMessage?message)
        {
            if (parsedMessage.Payload.Length == 0 || parsedMessage.Id is null)
            {
                message = null;
                return(false);
            }

            IReadOnlyList <GraphQLRequest> batch =
                Utf8GraphQLRequestParser.Parse(parsedMessage.Payload);

            message = new DataStartMessage(parsedMessage.Id, batch[0]);
            return(true);
        }
Exemple #10
0
    ReceiveServerMessageAsync(
        this WebSocket webSocket)
    {
        await using var stream = new MemoryStream();
        WebSocketReceiveResult result;
        var buffer = new byte[_maxMessageSize];

        do
        {
            result = await webSocket.ReceiveAsync(
                new ArraySegment <byte>(buffer),
                CancellationToken.None);

            stream.Write(buffer, 0, result.Count);
        }while (!result.EndOfMessage);

        return((IReadOnlyDictionary <string, object>)
               Utf8GraphQLRequestParser.ParseJson(stream.ToArray()));
    }
        public async Task DeserializeQueryResultWithExtensions()
        {
            // arrange
            var qux = new OrderedDictionary {
                { "quux", 123 }
            };
            var baz = new OrderedDictionary {
                { "qux", qux }
            };
            var objectList = new List <object> {
                baz
            };
            var scalarList = new List <object> {
                123
            };

            var result = new QueryResult();

            result.Data["foo"] = objectList;
            result.Data["bar"] = scalarList;
            result.Data["baz"] = baz;

            result.Extensions["foo"] = objectList;
            result.Extensions["bar"] = scalarList;
            result.Extensions["baz"] = baz;

            var stream     = new MemoryStream();
            var serializer = new JsonQueryResultSerializer();
            await serializer.SerializeAsync(result, stream);

            byte[] buffer = stream.ToArray();

            var serializedResult = Utf8GraphQLRequestParser.ParseJson(buffer);

            // act
            IReadOnlyQueryResult deserializedResult =
                HttpResponseDeserializer.Deserialize(
                    (IReadOnlyDictionary <string, object>)serializedResult);

            // assert
            Snapshot.Match(deserializedResult);
        }
        public async Task DeserializeQueryResult(object value, string type)
        {
            // arrange
            var qux = new OrderedDictionary {
                { "quux", value }
            };
            var baz = new OrderedDictionary {
                { "qux", qux }
            };
            var objectList = new List <object> {
                baz
            };
            var scalarList = new List <object> {
                value
            };

            var result = QueryResultBuilder.New();
            var data   = new OrderedDictionary();

            data["foo"] = objectList;
            data["bar"] = scalarList;
            data["baz"] = baz;
            result.SetData(data);

            var stream     = new MemoryStream();
            var serializer = new JsonQueryResultSerializer();
            await serializer.SerializeAsync(result.Create(), stream);

            byte[] buffer = stream.ToArray();

            var serializedResult = Utf8GraphQLRequestParser.ParseJson(buffer);

            // act
            IReadOnlyQueryResult deserializedResult =
                HttpResponseDeserializer.Deserialize(
                    (IReadOnlyDictionary <string, object>)serializedResult);

            // assert
            Snapshot.Match(deserializedResult,
                           "DeserializeQueryResult_" + type);
        }
        public async Task HttpPost_Operation_Batch_Invalid_Argument(string path)
        {
            // arrange
            TestServer server = CreateStarWarsServer();
            var        batch  = new List <ClientQueryRequest>
            {
                new ClientQueryRequest
                {
                    Query =
                        @"
                    query getHero {
                        hero(episode: EMPIRE) {
                            id @export
                        }
                    }

                    query getHuman {
                        human(id: $id) {
                            name
                        }
                    }"
                }
            };

            // act
            HttpResponseMessage message =
                await server.SendPostRequestAsync(
                    batch,
                    path);

            // assert
            Assert.Equal(HttpStatusCode.OK, message.StatusCode);
            byte[] json = await message.Content.ReadAsByteArrayAsync();

            Utf8GraphQLRequestParser.ParseJson(json).MatchSnapshot();
        }
 private static object ParseJson(byte[] buffer, int bytesBuffered)
 {
     return(Utf8GraphQLRequestParser.ParseJson(
                new ReadOnlySpan <byte>(buffer, 0, bytesBuffered)));
 }
        private static bool TryParseMessage(
            ReadOnlySequence <byte> slice,
            out OperationMessage message)
        {
            ReadOnlySpan <byte> messageData;

            byte[] buffer = null;

            if (slice.IsSingleSegment)
            {
                messageData = slice.First.Span;
            }
            else
            {
                buffer = ArrayPool <byte> .Shared.Rent(1024 * 4);

                int buffered = 0;

                SequencePosition      position = slice.Start;
                ReadOnlyMemory <byte> memory;

                while (slice.TryGet(ref position, out memory, true))
                {
                    ReadOnlySpan <byte> span = memory.Span;
                    var bytesRemaining       = buffer.Length - buffered;

                    if (span.Length > bytesRemaining)
                    {
                        var next = ArrayPool <byte> .Shared.Rent(
                            buffer.Length * 2);

                        Buffer.BlockCopy(buffer, 0, next, 0, buffer.Length);
                        ArrayPool <byte> .Shared.Return(buffer);

                        buffer = next;
                    }

                    for (int i = 0; i < span.Length; i++)
                    {
                        buffer[buffered++] = span[i];
                    }
                }

                messageData = buffer;
                messageData = messageData.Slice(0, buffered);
            }

            try
            {
                if (messageData.Length == 0 ||
                    (messageData.Length == 1 && messageData[0] == default))
                {
                    message = null;
                    return(false);
                }

                GraphQLSocketMessage parsedMessage =
                    Utf8GraphQLRequestParser.ParseMessage(messageData);
                return(TryDeserializeMessage(parsedMessage, out message));
            }
            catch (SyntaxException)
            {
                message = null;
                return(false);
            }
            finally
            {
                if (buffer != null)
                {
                    ArrayPool <byte> .Shared.Return(buffer);
                }
            }
        }