Exemplo n.º 1
0
        /// <summary>
        /// Generates a http response based on the specified <see cref="response"/> object and send it to the client
        /// </summary>
        /// <param name="response"></param>
        /// <param name="context"></param>
        private static void SendWADOResponse(WADOResponse response, HttpListenerContext context)
        {
            context.Response.StatusCode = (int)HttpStatusCode.OK;  // TODO: what does http protocol say about how error that occurs after OK status has been sent should  be handled?

            context.Response.ContentType = response.ContentType;

            if (response.Output == null)
            {
                context.Response.ContentLength64 = 0;
            }
            else
            {
                context.Response.ContentLength64 = response.Output.Length;
                Stream output = context.Response.OutputStream;
                output.Write(response.Output, 0, response.Output.Length);
            }
        }
Exemplo n.º 2
0
        private static void HandleRequest(HttpListenerContext context)
        {
            WADORequestProcessorStatistics statistics;

            if (Platform.IsLogLevelEnabled(LogLevel.Debug))
            {
                statistics = new WADORequestProcessorStatistics("Image Streaming");
                statistics.TotalProcessTime.Start();
                //Don't hold up this thread for logging.
                Task.Factory.StartNew(() => LogRequest(context));
            }
            else
            {
                statistics = null;
            }

            try
            {
                using (WADORequestTypeHandlerManager handlerManager = new WADORequestTypeHandlerManager())
                {
                    string requestType = context.Request.QueryString["requestType"];
                    IWADORequestTypeHandler typeHandler = handlerManager.GetHandler(requestType);

                    WADORequestTypeHandlerContext ctx = new WADORequestTypeHandlerContext
                    {
                        HttpContext = context,
                        ServerAE    = UriHelper.GetServerAE(context)
                    };

                    using (WADOResponse response = typeHandler.Process(ctx))
                    {
                        if (response != null)
                        {
                            if (statistics != null)
                            {
                                statistics.TransmissionSpeed.Start();
                            }

                            SendWADOResponse(response, context);

                            if (statistics != null)
                            {
                                statistics.TransmissionSpeed.End();
                            }

                            if (statistics != null && response.Output != null)
                            {
                                statistics.TransmissionSpeed.SetData(response.Output.Length);
                            }
                        }
                    }
                }
            }
            catch (MimeTypeProcessorError error)
            {
                SendError(error.HttpError, context);
            }

            if (statistics != null)
            {
                statistics.TotalProcessTime.End();
            }

            //Seems like something you'd only want to log if there was a problem.
            if (Platform.IsLogLevelEnabled(LogLevel.Debug))
            {
                //Don't hold up this thread for logging.
                Task.Factory.StartNew(() => StatisticsLogger.Log(LogLevel.Debug, statistics));
            }
        }