示例#1
0
        public HttpResponseMessage ExecuteRequest(HttpRequestMessage request)
        {
            if (Verbose)
            {
                Console.WriteLine("Received {0} - {1}", request.Method, request.RequestUri);
            }

            var routeData = determineRouteData(request);

            if (routeData == null)
            {
                return(write404());
            }
            else
            {
                try
                {
                    var response          = new HttpResponseMessage(HttpStatusCode.OK);
                    var arguments         = new SelfHostServiceArguments(routeData, request, response);
                    var invoker           = routeData.RouteHandler.As <FubuRouteHandler>().Invoker;
                    var requestCompletion = new RequestCompletion();
                    requestCompletion.Start(() => invoker.Invoke(arguments, routeData.Values, requestCompletion));

                    arguments.Writer.AttachContent();

                    return(response);
                }
                catch (Exception ex)
                {
                    return(write500(ex));
                }
            }
        }
示例#2
0
        public Task Invoke(IDictionary <string, object> environment)
        {
            var owinHttpContext = new OwinHttpContext(environment);
            var routeData       = _routes.GetRouteData(owinHttpContext);

            if (routeData == null)
            {
                write404(environment);
                return(Task.Factory.StartNew(() => { }));
            }

            new OwinRequestReader().Read(environment);
            var arguments = new OwinServiceArguments(routeData, environment);
            var invoker   = routeData.RouteHandler.As <FubuRouteHandler>().Invoker;

            var taskCompletionSource = new TaskCompletionSource <object>();
            var requestCompletion    = new RequestCompletion();

            requestCompletion.WhenCompleteDo(ex =>
            {
                if (ex != null)
                {
                    //This seems like OWIN should handle the .SetException(ex) with standard error screen formatting?
                    write500(environment, ex);
                }
                taskCompletionSource.SetResult(null);
            });
            arguments.With <IRequestCompletion>(requestCompletion);
            requestCompletion.SafeStart(() => invoker.Invoke(arguments, routeData.Values, requestCompletion));

            return(taskCompletionSource.Task);
        }
        public void request_is_faulted_when_writer_throws_exception()
        {
            var requestCompletion        = new RequestCompletion();
            AggregateException exception = null;
            var waitHandle = new ManualResetEvent(false);

            requestCompletion.WhenCompleteDo(ex =>
            {
                exception = ex as AggregateException;
                waitHandle.Set();
            });
            var asyncCoordinator = new AsyncCoordinator(requestCompletion, Enumerable.Empty <IExceptionHandler>());

            theWriter.WriterThrows = true;

            var task = theChannelWriter.Write(theTopic);

            theChannel.Write(q => q.Write(e1));

            asyncCoordinator.Push(task);

            waitHandle.WaitOne(TimeSpan.FromSeconds(1));
            var exceptions = exception.Flatten().InnerExceptions;

            exceptions.Count.ShouldBe(1);
            exceptions[0].Message.ShouldBe(RecordingServerEventWriter.ExceptionMessage);
        }
 public CompletionRequestCompleted(
     IEnumerable <CompletionItem> completionList,
     RequestCompletion command,
     LinePositionSpan?range = null) : base(command)
 {
     CompletionList = completionList ?? throw new ArgumentNullException(nameof(completionList));
     _range         = range;
 }
示例#5
0
        public async Task Handle(JupyterRequestContext context)
        {
            var completeRequest = GetJupyterRequest(context);

            var command = new RequestCompletion(completeRequest.Code, completeRequest.CursorPosition);

            await SendTheThingAndWaitForTheStuff(context, command);
        }
示例#6
0
        public async Task Handle(JupyterRequestContext context)
        {
            var completeRequest = GetJupyterRequest(context);

            var command = new RequestCompletion(completeRequest.Code, completeRequest.CursorPosition);

            await SendAsync(context, command);
        }
        public async Task Handle(JupyterRequestContext context)
        {
            var completeRequest = GetJupyterRequest(context);

            var position = SourceUtilities.GetPositionFromCursorOffset(completeRequest.Code, completeRequest.CursorPosition);
            var command  = new RequestCompletion(completeRequest.Code, position);

            await SendAsync(context, command);
        }
示例#8
0
 public void Setup()
 {
     _completedCount    = 0;
     _exception         = null;
     _requestCompletion = new RequestCompletion();
     _requestCompletion.WhenCompleteDo(x =>
     {
         _exception = x;
         _completedCount++;
     });
 }
示例#9
0
        public async Task Handle(JupyterRequestContext context)
        {
            var completeRequest = GetJupyterRequest(context);

            context.RequestHandlerStatus.SetAsBusy();

            var command = new RequestCompletion(completeRequest.Code, completeRequest.CursorPosition);

            var openRequest = new InflightRequest(context, completeRequest, 0);

            InFlightRequests[command] = openRequest;

            await Kernel.SendAsync(command);
        }
示例#10
0
        protected override async Task HandleRequestCompletion(
            RequestCompletion requestCompletion,
            KernelInvocationContext context)
        {
            var completionRequestReceived = new CompletionRequestReceived(requestCompletion);

            context.Publish(completionRequestReceived);

            var completionList =
                await GetCompletionList(
                    requestCompletion.Code,
                    SourceUtilities.GetCursorOffsetFromPosition(requestCompletion.Code, requestCompletion.Position));

            context.Publish(new CompletionRequestCompleted(completionList, requestCompletion));
        }
示例#11
0
        private async Task HandleRequestCompletion(
            RequestCompletion requestCompletion,
            KernelInvocationContext context)
        {
            var completionRequestReceived = new CompletionRequestReceived(requestCompletion);

            context.Publish(completionRequestReceived);

            var completionList =
                await GetCompletionList(
                    requestCompletion.Code,
                    requestCompletion.CursorPosition);

            context.Publish(new CompletionRequestCompleted(completionList, requestCompletion));
        }
示例#12
0
        public async Task Handle(JupyterRequestContext context)
        {
            var completeRequest = GetJupyterRequest(context);

            context.RequestHandlerStatus.SetAsBusy();

            var command = new RequestCompletion(completeRequest.Code, completeRequest.CursorPosition);

            var openRequest = new InflightRequest(context, completeRequest, 0, null);

            InFlightRequests[command] = openRequest;

            var kernelResult = await Kernel.SendAsync(command);

            openRequest.AddDisposable(kernelResult.KernelEvents.Subscribe(OnKernelResultEvent));
        }
        public IAsyncResult BeginProcessRequest(System.Web.HttpContext context, AsyncCallback cb, object extraData)
        {
            var taskCompletionSource = new TaskCompletionSource<object>();
            var requestCompletion = new RequestCompletion();
            requestCompletion.WhenCompleteDo(ex =>
            {
                if (ex != null)
                {
                    taskCompletionSource.SetException(ex);
                }
                taskCompletionSource.SetResult(null);
                cb(taskCompletionSource.Task);
            });
            requestCompletion.Start(() => _invoker.Invoke(_arguments, _routeData, requestCompletion));

            return taskCompletionSource.Task;
        }
        public IAsyncResult BeginProcessRequest(System.Web.HttpContext context, AsyncCallback cb, object extraData)
        {
            var taskCompletionSource = new TaskCompletionSource <object>();
            var requestCompletion    = new RequestCompletion();

            requestCompletion.WhenCompleteDo(ex =>
            {
                if (ex != null)
                {
                    taskCompletionSource.SetException(ex);
                }
                taskCompletionSource.SetResult(null);
                cb(taskCompletionSource.Task);
            });
            requestCompletion.Start(() => _invoker.Invoke(_arguments, _routeData, requestCompletion));

            return(taskCompletionSource.Task);
        }
示例#15
0
        protected override void beforeEach()
        {
            var waitHandle = new ManualResetEvent(false);
            var completion = new RequestCompletion();

            completion.WhenCompleteDo(x => waitHandle.Set());
            Services.Container.Configure(x =>
            {
                x.For <IRequestCompletion>().Use(completion);
                x.For <IAsyncCoordinator>().Use <AsyncCoordinator>();
            });
            var task = Task.Factory.StartNew(() =>
            {
                throw new Exception("Failed!");
            });

            MockFor <IFubuRequest>().Expect(x => x.Get <Task>()).Return(task);

            ClassUnderTest.Invoke();
            waitHandle.WaitOne(TimeSpan.FromSeconds(1)).ShouldBeTrue();
        }
示例#16
0
        protected override void beforeEach()
        {
            var waitHandle = new ManualResetEvent(false);
            var completion = new RequestCompletion();

            completion.WhenCompleteDo(x => waitHandle.Set());
            Services.Container.Configure(x =>
            {
                x.For <IRequestCompletion>().Use(completion);
                x.For <IAsyncCoordinator>().Use <AsyncCoordinator>();
            });
            ClassUnderTest.Inner = MockFor <IActionBehavior>();
            expectedOutput       = new Output();
            var task = new Task <Output>(() => expectedOutput);

            task.RunSynchronously();

            MockFor <IFubuRequest>().Expect(x => x.Get <Task <Output> >()).Return(task);

            ClassUnderTest.Invoke();
            waitHandle.WaitOne(TimeSpan.FromSeconds(1)).ShouldBeTrue();
        }
示例#17
0
        public static IEnumerable <object[]> Events()
        {
            foreach (var @event in events())
            {
                yield return(new object[] { @event });
            }

            IEnumerable <IKernelEvent> events()
            {
                var submitCode = new SubmitCode("123");

                yield return(new CodeSubmissionReceived(
                                 submitCode));

                yield return(new CommandFailed(
                                 "Oooops!",
                                 submitCode));

                yield return(new CommandHandled(
                                 submitCode));

                yield return(new CompleteCodeSubmissionReceived(submitCode));

                var requestCompletion = new RequestCompletion("Console.Wri", 11);

                yield return(new CompletionRequestCompleted(
                                 new[]
                {
                    new CompletionItem(
                        "WriteLine",
                        "Method",
                        "WriteLine",
                        "WriteLine",
                        "WriteLine",
                        "Writes the line")
                },
                                 requestCompletion));

                yield return(new CompletionRequestReceived(requestCompletion));

                yield return(new CurrentCommandCancelled(submitCode));

                yield return(new DiagnosticLogEventProduced("oops!", submitCode));

                yield return(new DisplayedValueProduced(
                                 new HtmlString("<b>hi!</b>"),
                                 new SubmitCode("b(\"hi!\")", "csharp", SubmissionType.Run),
                                 new[]
                {
                    new FormattedValue("text/html", "<b>hi!</b>"),
                }));

                yield return(new DisplayedValueUpdated(
                                 new HtmlString("<b>hi!</b>"),
                                 "the-value-id",
                                 new SubmitCode("b(\"hi!\")", "csharp", SubmissionType.Run),
                                 new[]
                {
                    new FormattedValue("text/html", "<b>hi!</b>"),
                }));

                yield return(new ErrorProduced("oops!"));

                yield return(new ExtensionLoaded(new FileInfo(Path.GetTempFileName())));

                yield return(new IncompleteCodeSubmissionReceived(submitCode));

                yield return(new KernelBusy());

                yield return(new KernelExtensionLoadException("oops!"));

                yield return(new KernelIdle());

                yield return(new PackageAdded(
                                 new AddPackage(new PackageReference("ThePackage", "1.2.3"))));

                yield return(new ReturnValueProduced(

                                 new HtmlString("<b>hi!</b>"),
                                 new SubmitCode("b(\"hi!\")", "csharp", SubmissionType.Run),
                                 new[]
                {
                    new FormattedValue("text/html", "<b>hi!</b>"),
                }));

                yield return(new StandardErrorValueProduced(
                                 "oops!",
                                 submitCode,
                                 new[]
                {
                    new FormattedValue("text/plain", "oops!"),
                }));

                yield return(new StandardOutputValueProduced(
                                 123,
                                 new SubmitCode("Console.Write(123);", "csharp", SubmissionType.Run),
                                 new[]
                {
                    new FormattedValue("text/plain", "123"),
                }));
            }
        }
示例#18
0
        public static IEnumerable <object[]> Events()
        {
            foreach (var @event in events())
            {
                yield return(new object[] { @event });
            }

            IEnumerable <IKernelEvent> events()
            {
                var submitCode = new SubmitCode("123");

                yield return(new CodeSubmissionReceived(
                                 submitCode));

                yield return(new CommandFailed(
                                 "Oooops!",
                                 submitCode));

                yield return(new CommandFailed(
                                 new InvalidOperationException("Oooops!"),
                                 submitCode,
                                 "oops"));

                yield return(new CommandHandled(submitCode));

                yield return(new CompleteCodeSubmissionReceived(submitCode));

                var requestCompletion = new RequestCompletion("Console.Wri", 11);

                yield return(new CompletionRequestCompleted(
                                 new[]
                {
                    new CompletionItem(
                        "WriteLine",
                        "Method",
                        "WriteLine",
                        "WriteLine",
                        "WriteLine",
                        "Writes the line")
                },
                                 requestCompletion));

                yield return(new CompletionRequestReceived(requestCompletion));

                yield return(new DiagnosticLogEventProduced("oops!", submitCode));

                yield return(new DisplayedValueProduced(
                                 new HtmlString("<b>hi!</b>"),
                                 new SubmitCode("b(\"hi!\")", "csharp", SubmissionType.Run),
                                 new[]
                {
                    new FormattedValue("text/html", "<b>hi!</b>"),
                }));

                yield return(new DisplayedValueUpdated(
                                 new HtmlString("<b>hi!</b>"),
                                 "the-value-id",
                                 new SubmitCode("b(\"hi!\")", "csharp", SubmissionType.Run),
                                 new[]
                {
                    new FormattedValue("text/html", "<b>hi!</b>"),
                }));

                yield return(new ErrorProduced("oops!"));

                yield return(new IncompleteCodeSubmissionReceived(submitCode));

                yield return(new InputRequested("prompt", submitCode));

                var requestHoverTextCommand = new RequestHoverText("document-contents", new LinePosition(1, 2));

                yield return(new HoverMarkdownProduced(
                                 requestHoverTextCommand,
                                 "markdown",
                                 new LinePositionSpan(new LinePosition(1, 2), new LinePosition(3, 4))));

                yield return(new HoverPlainTextProduced(
                                 requestHoverTextCommand,
                                 "plaintext",
                                 new LinePositionSpan(new LinePosition(1, 2), new LinePosition(3, 4))));

                yield return(new PackageAdded(
                                 new ResolvedPackageReference("ThePackage", "1.2.3", new[] { new FileInfo(Path.GetTempFileName()) })));

                yield return(new PasswordRequested("password", submitCode));

                yield return(new ReturnValueProduced(
                                 new HtmlString("<b>hi!</b>"),
                                 new SubmitCode("b(\"hi!\")", "csharp", SubmissionType.Run),
                                 new[]
                {
                    new FormattedValue("text/html", "<b>hi!</b>"),
                }));

                yield return(new StandardErrorValueProduced(
                                 "oops!",
                                 submitCode,
                                 new[]
                {
                    new FormattedValue("text/plain", "oops!"),
                }));

                yield return(new StandardOutputValueProduced(
                                 123,
                                 new SubmitCode("Console.Write(123);", "csharp", SubmissionType.Run),
                                 new[]
                {
                    new FormattedValue("text/plain", "123"),
                }));
            }
        }
示例#19
0
 public void AttachRequestCompletion()
 {
     Completion = new RequestCompletion(this);
 }
示例#20
0
        public void ProcessRequest(System.Web.HttpContext context)
        {
            var requestCompletion = new RequestCompletion();

            requestCompletion.Start(() => _invoker.Invoke(_arguments, _routeData, requestCompletion));
        }
示例#21
0
 protected override Task HandleRequestCompletion(RequestCompletion command, KernelInvocationContext context)
 {
     Handle(command, context);
     return(Task.CompletedTask);
 }
 public void AttachRequestCompletion()
 {
     Completion = new RequestCompletion(this);
 }
示例#23
0
 protected override Task HandleRequestCompletion(RequestCompletion command, KernelInvocationContext context)
 {
     throw new NotSupportedException();
 }
 public void ProcessRequest(HttpContext context)
 {
     var requestCompletion = new RequestCompletion();
     requestCompletion.Start(() => _invoker.Invoke(_arguments, _routeData, requestCompletion));
 }