Пример #1
0
        public static unsafe void Process(HttpContext context, uint accountId)
        {
            var contentLength = (int)context.Request.ContentLength;
            var pctx          = new ParseContext(Buffer.My, contentLength);

            context.ReadBytes(pctx);

            AccountStub stub = UpdatePool.RentStub();

            stub.id = accountId;

            if (!TryParseAccountUpdate(ref pctx, stub))
            {
                BadRequest(context, stub);
                return;
            }

            if (!stub.email.IsEmpty)
            {
                Account account  = Database.GetAccount(accountId);
                Email   previous = account.Email;
                Database.Replace(previous, stub.email);
            }

            UpdateWorker.Update(stub);

            context.Response.StatusCode    = StatusCodes.Status202Accepted;
            context.Response.ContentLength = 2;
            context.Response.Body.Write(NewHandler.Empty);
        }
Пример #2
0
        public static int TryParseAccount(ref ParseContext ctx, AccountStub stub)
        {
            const byte quote = (byte)'"';

            while (ctx.Length > 0)
            {
                var propStart = ctx.IndexOf(quote) + 1; //+1 to remove quote
                if (propStart < 1)
                {
                    break;
                }

                ctx.Move(propStart);
                var length = ctx.IndexOf(quote); //

                ReadOnlySpan <byte> property = ctx.Span.Slice(0, length);

                if (!JsonParser.ParseProperty(property, out JsonValueParser parse))
                {
                    return(StatusCodes.Status400BadRequest);
                }

                ctx.Move(length);
                var valueStart = ctx.IndexOf((byte)':');

                ctx.Move(valueStart + 1);

                if (!parse(ref ctx, stub))
                {
                    return(StatusCodes.Status400BadRequest);
                }
            }

            if (stub.id == 0 || stub.email.IsEmpty)
            {
                return(StatusCodes.Status400BadRequest);
            }

            return(StatusCodes.Status201Created);
        }
Пример #3
0
        private static bool TryParseAccountUpdate(ref ParseContext pctx, AccountStub stub)
        {
            const byte quote = (byte)'"';

            while (pctx.Length > 0)
            {
                var propStart = pctx.IndexOf(quote) + 1; //+1 to remove quote
                if (propStart < 1)
                {
                    break;
                }

                pctx.Move(propStart);
                var length = pctx.IndexOf(quote); //

                ReadOnlySpan <byte> property = pctx.Span.Slice(0, length);

                if (!JsonParser.ParseProperty(property, out JsonValueParser parse))
                {
                    return(false);
                }

                pctx.Move(length);
                //Parsing values.
                var valueStart = pctx.IndexOf((byte)':');

                pctx.Move(valueStart + 1);

                if (!parse(ref pctx, stub))
                {
                    return(false);
                }
            }

            return(true);
        }
Пример #4
0
 private static void BadRequest(HttpContext context, AccountStub stub)
 {
     context.Response.StatusCode = StatusCodes.Status400BadRequest;
     UpdatePool.Return(stub);
 }
Пример #5
0
 public static void Return(AccountStub stub) => _accountStubPool.Return(stub);