/// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        /// <remarks>
        /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>.
        /// </remarks>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as Received;
            if (msg == null)
            {
                context.SendUpstream(message);
                return;
            }

            // byte + byte + int
            if (msg.BufferSlice.RemainingLength < 6)
            {
                return;
            }

            var header = new SimpleHeader
            {
                Version = msg.BufferSlice.Buffer[msg.BufferSlice.Position++],
                ContentId = msg.BufferSlice.Buffer[msg.BufferSlice.Position++],
                ContentLength = BitConverter.ToInt32(msg.BufferSlice.Buffer, msg.BufferSlice.Position)
            };
            msg.BufferSlice.Position += 4;
            context.SendUpstream(new ReceivedHeader(header));

            if (msg.BufferSlice.RemainingLength > 0)
                context.SendUpstream(msg);            
        }
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as Received;
            if (msg == null)
            {
                context.SendUpstream(message);
                return;
            }

            var bytesToCopy = Math.Min(msg.BufferReader.Count, _bytesLeft);
            msg.BufferReader.Read(_header, _position, bytesToCopy);
            _position += bytesToCopy;
            _bytesLeft -= bytesToCopy;

            if (_bytesLeft > 0)
            {
                return;
            }

            var header = new SimpleHeader
                {
                    Version = _header[0],
                    Length = BitConverter.ToInt32(_header, 1)
                };

            _bytesLeft = 5;
            _position = 0;
            context.SendUpstream(new ReceivedHeader(header));

            if (msg.BufferReader.Position < msg.BufferReader.Count)
                context.SendUpstream(msg);
        }
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        /// <remarks>
        /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>.
        /// </remarks>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as ReceivedHttpRequest;

            if (msg == null)
            {
                context.SendUpstream(message);
                return;
            }

            var authHeader = msg.HttpRequest.Headers["Authorization"];

            if (authHeader == null)
            {
                context.SendUpstream(message);
                return;
            }

            var user = _authenticator.Authenticate(msg.HttpRequest);

            if (user == null)
            {
                var response = msg.HttpRequest.CreateResponse(HttpStatusCode.Unauthorized,
                                                              "Invalid username or password.");
                context.SendDownstream(new SendHttpResponse(msg.HttpRequest, response));
            }
            else
            {
                var principal =
                    _principalFactory.Create(new PrincipalFactoryContext {
                    Request = msg.HttpRequest, User = user
                });
                Thread.CurrentPrincipal = principal;
            }
        }
Esempio n. 4
0
        /// <summary>
        /// A message have been sent through the pipeline and are ready to be handled by the channel.
        /// </summary>
        /// <param name="message">Message that the channel should process.</param>
        public virtual void HandleDownstream(IPipelineMessage message)
        {
            Logger.Debug("Got message " + message);

            if (message is SendSlice)
                Send((SendSlice) message);
            if (message is SendStream)
            {
                SendStream((SendStream) message);
            }
            if (message is SendBuffer)
            {
                Send((SendBuffer) message);
            }
            if (message is Disconnect)
                HandleDisconnect(new SocketException((int) SocketError.Success));
            else if (message is Close)
            {
                Disconnect();
            }

            if (message is IDisposable)
            {
                ((IDisposable) message).Dispose();
            }
        }
        /// <summary>
        /// Process message
        /// </summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        /// <remarks>
        /// Should always call either <see cref="IPipelineHandlerContext.SendDownstream"/> or <see cref="IPipelineHandlerContext.SendUpstream"/>
        /// unless the handler really wants to stop the processing.
        /// </remarks>
        public void HandleDownstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg =  message as SendResponse;
            if (msg == null)
            {
                context.SendDownstream(message);
                return;
            }

            var buffer = _bufferPool.PopSlice();
            var stream = new BufferPoolStream(_bufferPool, buffer);
            _encoder.Encode(msg.Response, stream);
            stream.Position = 0;

            // send header
            var header = new byte[6];
            header[0] = 1;
            header[1] = _mapper.GetContentId(msg.Response);
            var lengthBuffer = BitConverter.GetBytes(buffer.Count);
            Buffer.BlockCopy(lengthBuffer, 0, header, 2, lengthBuffer.Length);
            context.SendDownstream(new SendBuffer(header, 0, 6));

            // send body
            context.SendDownstream(new SendStream(stream));
        }
 public override void HandleDownstream(IPipelineMessage message)
 {
     if (message is Connect)
         Connect((IPEndPoint) ((Connect) message).RemoteEndPoint);
     else
         base.HandleDownstream(message);
 }
        /// <summary>
        /// Process message
        /// </summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        /// <remarks>
        /// Should always call either <see cref="IPipelineHandlerContext.SendDownstream"/> or <see cref="IPipelineHandlerContext.SendUpstream"/>
        /// unless the handler really wants to stop the processing.
        /// </remarks>
        public virtual void HandleDownstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var sendBuffer = message as SendBuffer;

            if (sendBuffer != null)
            {
                _context.Send(new BufferSlice(sendBuffer.Buffer, sendBuffer.Offset, sendBuffer.Count), sendBuffer.Count);
                return;
            }

            var sendSlice = message as SendSlice;

            if (sendSlice != null)
            {
                _context.Send(sendSlice.Slice, sendSlice.Length);
                return;
            }

            var send = message as SendStream;

            if (send != null)
            {
                _context.Send(send.Stream);
                return;
            }

            if (message is Disconnect)
            {
                _context.Close();
                return;
            }

            throw new InvalidOperationException("Unsupported pipeline message: " + message);
        }
Esempio n. 8
0
        private void HandleHeader(IPipelineHandlerContext context, IPipelineMessage message, ReceivedHeader headerMsg)
        {
            _packetType = _mapper.GetPacketType(_header.ContentId);
            if (_packetType == null)
            {
                // not supported, let the rest of the pipeline
                // handle the packet.
                context.SendUpstream(message);
            }
            else
            {
                _header = headerMsg.Header;
                var buffer = _bufferPool.PopSlice();
                if (_header.ContentLength > buffer.Capacity)
                {
                    throw new InvalidOperationException(
                              string.Format(
                                  "Buffer ({0} bytes) is less than the packet content ({1} bytes). Sorry, that's not possible in the current version.",
                                  buffer.Capacity, _header.ContentLength));
                }

                _bytesLeft = _header.ContentLength;
                _stream    = new BufferPoolStream(_bufferPool, buffer);
            }
        }
Esempio n. 9
0
        /// <summary>
        /// Process message
        /// </summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        /// <remarks>
        /// Should always call either <see cref="IPipelineHandlerContext.SendDownstream"/> or <see cref="IPipelineHandlerContext.SendUpstream"/>
        /// unless the handler really wants to stop the processing.
        /// </remarks>
        public void HandleDownstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as SendResponse;

            if (msg == null)
            {
                context.SendDownstream(message);
                return;
            }

            var buffer = _bufferPool.PopSlice();
            var stream = new BufferPoolStream(_bufferPool, buffer);

            _encoder.Encode(msg.Response, stream);
            stream.Position = 0;

            // send header
            var header = new byte[6];

            header[0] = 1;
            header[1] = _mapper.GetContentId(msg.Response);
            var lengthBuffer = BitConverter.GetBytes(buffer.Count);

            Buffer.BlockCopy(lengthBuffer, 0, header, 2, lengthBuffer.Length);
            context.SendDownstream(new SendBuffer(header, 0, 6));

            // send body
            context.SendDownstream(new SendStream(stream));
        }
Esempio n. 10
0
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        /// <remarks>
        /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>.
        /// </remarks>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as Received;

            if (msg == null)
            {
                context.SendUpstream(message);
                return;
            }

            // byte + byte + int
            if (msg.BufferSlice.RemainingLength < 6)
            {
                return;
            }

            var header = new SimpleHeader
            {
                Version       = msg.BufferSlice.Buffer[msg.BufferSlice.Position++],
                ContentId     = msg.BufferSlice.Buffer[msg.BufferSlice.Position++],
                ContentLength = BitConverter.ToInt32(msg.BufferSlice.Buffer, msg.BufferSlice.Position)
            };

            msg.BufferSlice.Position += 4;
            context.SendUpstream(new ReceivedHeader(header));

            if (msg.BufferSlice.RemainingLength > 0)
            {
                context.SendUpstream(msg);
            }
        }
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        /// <remarks>
        /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>.
        /// </remarks>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as ReceivedHttpRequest;
            if (msg == null)
                return;

            if (!Thread.CurrentPrincipal.Identity.IsAuthenticated)
            {
                var authResponse = msg.HttpRequest.CreateResponse(HttpStatusCode.Unauthorized, "Authorize");
                context.SendDownstream(new SendHttpResponse(msg.HttpRequest, authResponse));
                return;
            }

            var request = msg.HttpRequest;
            var response = request.CreateResponse(HttpStatusCode.OK, "OK");

            if (request.Uri.AbsolutePath.Contains("submit.php") && request.Method == "POST")
            {
                Console.WriteLine(request.Form["arne"]);
            }
            var stream = new MemoryStream();
            var writer = new StreamWriter(stream);
            writer.WriteLine("Welcome " + Thread.CurrentPrincipal.Identity.Name);
            writer.WriteLine("the time is: " + DateTime.Now);

            writer.Flush();

            stream.Position = 0;
            response.Body = stream;
            context.SendDownstream(new SendHttpResponse(request, response));
        }
Esempio n. 12
0
        /// <summary>
        /// Process message
        /// </summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        /// <remarks>
        /// Should always call either <see cref="IPipelineHandlerContext.SendDownstream"/> or <see cref="IPipelineHandlerContext.SendUpstream"/>
        /// unless the handler really wants to stop the processing.
        /// </remarks>
        public void HandleDownstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as SendSlice;

            if (msg != null)
            {
                var str = Encoding.UTF8.GetString(msg.BufferSlice.Buffer, msg.BufferSlice.Position, msg.BufferSlice.RemainingLength);
                var sb  = GetAlphaNumeric(str);
                _logger.Trace(sb.ToString());
            }

            var msg2 = message as SendStream;

            if (msg2 != null)
            {
                var buffer = new byte[msg2.Stream.Length];
                msg2.Stream.Read(buffer, 0, buffer.Length);
                msg2.Stream.Position = 0;
                var str = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
                var sb  = GetAlphaNumeric(str);
                _logger.Trace(sb.ToString());
            }

            context.SendDownstream(message);
        }
Esempio n. 13
0
        /// <summary>
        /// Process message
        /// </summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        /// <remarks>
        /// Should always call either <see cref="IPipelineHandlerContext.SendDownstream"/> or <see cref="IPipelineHandlerContext.SendUpstream"/>
        /// unless the handler really wants to stop the processing.
        /// </remarks>
        public void HandleDownstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as SendResponse;

            if (msg == null)
            {
                context.SendDownstream(message);
                return;
            }

            var result = JsonConvert.SerializeObject(msg.Response, Formatting.None);

            // send header
            var header = new byte[5];

            header[0] = 1;
            var lengthBuffer = BitConverter.GetBytes(result.Length);

            Buffer.BlockCopy(lengthBuffer, 0, header, 1, lengthBuffer.Length);
            context.SendDownstream(new SendBuffer(header, 0, 5));

            // send JSON
            var slice = _bufferPool.PopSlice();

            Encoding.UTF8.GetBytes(result, 0, result.Length, slice.Buffer, slice.StartOffset);
            slice.Position = slice.StartOffset;
            slice.Count    = result.Length;
            context.SendDownstream(new SendSlice(slice));
        }
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as ReceivedMessage;

            if (msg != null && msg.Message.Headers["Content-Type"] == "auth/request")
            {
                var api = new AuthCmd(Password);
                context.SendDownstream(new SendCommandMessage(api));
                return;
            }

            var reply = message as CommandReply;

            if (reply != null && reply.OriginalCommand is AuthCmd)
            {
                if (!reply.IsSuccessful)
                {
                    context.SendUpstream(new AuthenticationFailed(reply.Body));
                }
                else
                {
                    context.SendUpstream(new Authenticated());
                }

                return;
            }

            context.SendUpstream(message);
        }
Esempio n. 15
0
        /// <summary>
        /// Process message
        /// </summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        /// <remarks>
        /// Should always call either <see cref="IPipelineHandlerContext.SendDownstream"/> or <see cref="IPipelineHandlerContext.SendUpstream"/>
        /// unless the handler really wants to stop the processing.
        /// </remarks>
        public void HandleDownstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as SendSlice;

            if (msg != null)
            {
                var stream = new MemoryStream();
                stream.Write(msg.Slice.Buffer, msg.Slice.Offset, msg.Length);

                var reader = new StreamReader(stream);
                var str    = reader.ReadToEnd();

                var sb = GetAlphaNumeric(str);
                _logger.Trace(sb.ToString());
            }

            var msg2 = message as SendStream;

            if (msg2 != null)
            {
                var buffer = new byte[msg2.Stream.Length];
                msg2.Stream.Read(buffer, 0, buffer.Length);
                msg2.Stream.Position = 0;
                var str = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
                var sb  = GetAlphaNumeric(str);
                _logger.Trace(sb.ToString());
            }

            context.SendDownstream(message);
        }
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        /// <remarks>
        /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>.
        /// </remarks>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as ReceivedHttpRequest;
            if (msg == null)
            {
                context.SendUpstream(message);
                return;
            }

            var authHeader = msg.HttpRequest.Headers["Authorization"];
            if (authHeader == null)
            {
                context.SendUpstream(message);
                return;
            }

            var user = _authenticator.Authenticate(msg.HttpRequest);
            if (user == null)
            {
                var response = msg.HttpRequest.CreateResponse(HttpStatusCode.Unauthorized,
                                                              "Invalid username or password.");
                context.SendDownstream(new SendHttpResponse(msg.HttpRequest, response));
            }
            else
            {
                var principal =
                    _principalFactory.Create(new PrincipalFactoryContext {Request = msg.HttpRequest, User = user});
                Thread.CurrentPrincipal = principal;
            }
        }
        /// <summary>
        /// Process message
        /// </summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        /// <remarks>
        /// Should always call either <see cref="IPipelineHandlerContext.SendDownstream"/> or <see cref="IPipelineHandlerContext.SendUpstream"/>
        /// unless the handler really wants to stop the processing.
        /// </remarks>
        public void HandleDownstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as SendSlice;
            if (msg != null)
            {
                var stream = new MemoryStream();
                stream.Write(msg.Slice.Buffer, msg.Slice.Offset, msg.Length);

                var reader = new StreamReader(stream);
                var str = reader.ReadToEnd();

                var sb = GetAlphaNumeric(str);
                _logger.Trace(sb.ToString());
            }

            var msg2 = message as SendStream;
            if (msg2 != null)
            {
                var buffer = new byte[msg2.Stream.Length];
                msg2.Stream.Read(buffer, 0, buffer.Length);
                msg2.Stream.Position = 0;
                var str = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
                var sb = GetAlphaNumeric(str);
                _logger.Trace(sb.ToString());
            }

            context.SendDownstream(message);
        }
Esempio n. 18
0
        /// <summary>
        /// Process message
        /// </summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        public void HandleDownstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as SendHttpResponse;

            if (msg == null)
            {
                context.SendDownstream(message);
                return;
            }

            var slice      = _pool.Pop();
            var serializer = new HttpHeaderSerializer();
            var stream     = new SliceStream(slice);

            serializer.SerializeResponse(msg.Response, stream);
            context.SendDownstream(new SendSlice(slice, (int)stream.Length));
            if (msg.Response.Body != null)
            {
                context.SendDownstream(new SendStream(msg.Response.Body));
            }

            if (!msg.Response.KeepAlive)
            {
                context.SendDownstream(new Close());
            }
        }
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        void IUpstreamHandler.HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            if (message is Connected)
                IsConnected = true;
            if (message is Disconnected)
            {
                OnDisconnect();
            }
            if (message is Authenticated)
            {
                IsAuthenticated = true;
                _pipeline.SendDownstream(
                    new SendCommandMessage(new SubscribeOnEvents(EventSubscriptionType.Plain, _eventCollection)));
            }
            if (message is CommandReply)
            {
                var reply = (CommandReply) message;
                _waitingObjects.Trigger(reply.OriginalCommand, reply);

                if (reply.OriginalCommand is SubscribeOnEvents)
                {
                    Initialized(this, EventArgs.Empty);                    
                }
            }
            if (message is EventRecieved)
            {
                var msg = (EventRecieved) message;
                EventReceived(this, new EventRecievedEventArgs(msg.FreeSwitchEvent));
            }
        }
        /// <summary>
        /// Process message
        /// </summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        /// <remarks>
        /// Should always call either <see cref="IPipelineHandlerContext.SendDownstream"/> or <see cref="IPipelineHandlerContext.SendUpstream"/>
        /// unless the handler really wants to stop the processing.
        /// </remarks>
        public virtual void HandleDownstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var sendBuffer = message as SendBuffer;
            if (sendBuffer != null)
            {
                _context.Send(new BufferSlice(sendBuffer.Buffer, sendBuffer.Offset, sendBuffer.Count), sendBuffer.Count);
                return;
            }

            var sendSlice = message as SendSlice;
            if (sendSlice != null)
            {
                _context.Send(sendSlice.Slice, sendSlice.Length);
                return;
            }

            var send = message as SendStream;
            if (send != null)
            {
                _context.Send(send.Stream);
                return;
            }

            if (message is Disconnect)
            {
                _context.Close();
                return;
            }

            throw new InvalidOperationException("Unsupported pipeline message: " + message);
        }
Esempio n. 21
0
        /// <summary>
        /// A message have been sent through the pipeline and are ready to be handled by the channel.
        /// </summary>
        /// <param name="message">Message that the channel should process.</param>
        public virtual void HandleDownstream(IPipelineMessage message)
        {
            Logger.Debug("Got message " + message);

            if (message is SendSlice)
            {
                Send((SendSlice)message);
            }
            if (message is SendStream)
            {
                SendStream((SendStream)message);
            }
            if (message is SendBuffer)
            {
                Send((SendBuffer)message);
            }
            if (message is Disconnect)
            {
                HandleDisconnect(new SocketException((int)SocketError.Success));
            }
            else if (message is Close)
            {
                Disconnect();
            }

            if (message is IDisposable)
            {
                ((IDisposable)message).Dispose();
            }
        }
Esempio n. 22
0
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        void IUpstreamHandler.HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            if (message is Connected)
            {
                IsConnected = true;
            }
            if (message is Disconnected)
            {
                OnDisconnect();
            }
            if (message is Authenticated)
            {
                IsAuthenticated = true;
                _pipeline.SendDownstream(
                    new SendCommandMessage(new SubscribeOnEvents(EventSubscriptionType.Plain, _eventCollection)));
            }
            if (message is CommandReply)
            {
                var reply = (CommandReply)message;
                _waitingObjects.Trigger(reply.OriginalCommand, reply);

                if (reply.OriginalCommand is SubscribeOnEvents)
                {
                    Initialized(this, EventArgs.Empty);
                }
            }
            if (message is EventRecieved)
            {
                var msg = (EventRecieved)message;
                EventReceived(this, new EventRecievedEventArgs(msg.FreeSwitchEvent));
            }
        }
Esempio n. 23
0
        public void HandleUpstream(IPipelineHandlerContext ctx, IPipelineMessage message)
        {
            if (message is Connected)
            {
                _context = new DecoderContext {
                    ParserMethod = ParseBeforeHeader
                };
            }
            else if (message is Closed)
            {
                _context = null;
            }
            if (!(message is Received))
            {
                ctx.SendUpstream(message);
                return;
            }


            var evt    = (Received)message;
            var buffer = evt.BufferSlice;

            _logger.Trace("Pos: " + buffer.Position);
            _context.Reader.Assign(buffer);


            try
            {
                var canrun = true;
                while (canrun)
                {
                    _logger.Trace("Parsing using " + _context.ParserMethod.Method.Name);
                    canrun = _context.ParserMethod();
                }
            }
            catch (Exception err)
            {
                _logger.Error("Failed to parse message.", err);
                ctx.SendUpstream(new PipelineFailure(err));
                return;
            }

            if (!_context.IsComplete)
            {
                //_leftOvers = Encoding.UTF8.GetString(buffer.Buffer, buffer.Offset, buffer.RemainingLength);
                return; // Need more data from the channel
            }

            _context.ParserMethod = ParseBeforeHeader;
            _logger.Debug("Got message " + _context.Message.Headers["Content-Type"]);
            if (string.IsNullOrEmpty(_context.Message.Headers["Content-Type"]))
            {
                _logger.Warning("Malformed message\r\n" +
                                Encoding.ASCII.GetString(buffer.Buffer, buffer.StartOffset, buffer.Count));
                Debugger.Break();
            }

            ctx.SendUpstream(new ReceivedMessage(_context.Message));
            _context.Message = new Message();
        }
Esempio n. 24
0
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        /// <remarks>
        /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>.
        /// </remarks>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as ReceivedHttpRequest;

            if (msg == null)
            {
                return;
            }

            if (!Thread.CurrentPrincipal.Identity.IsAuthenticated)
            {
                var authResponse = msg.HttpRequest.CreateResponse(HttpStatusCode.Unauthorized, "Authenticate");
                context.SendDownstream(new SendHttpResponse(msg.HttpRequest, authResponse));
                return;
            }

            var request  = msg.HttpRequest;
            var response = request.CreateResponse(HttpStatusCode.OK, "OK");

            if (request.Uri.AbsolutePath.Contains("submit.php") && request.Method == "POST")
            {
                Console.WriteLine(request.Form["arne"]);
            }
            var stream = new MemoryStream();
            var writer = new StreamWriter(stream);

            writer.WriteLine("Welcome " + Thread.CurrentPrincipal.Identity.Name);
            writer.WriteLine("the time is: " + DateTime.Now);

            writer.Flush();

            stream.Position = 0;
            response.Body   = stream;
            context.SendDownstream(new SendHttpResponse(request, response));
        }
Esempio n. 25
0
        /// <summary>
        /// Process message
        /// </summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        /// <remarks>
        /// Should always call either <see cref="IPipelineHandlerContext.SendDownstream"/> or <see cref="IPipelineHandlerContext.SendUpstream"/>
        /// unless the handler really wants to stop the processing.
        /// </remarks>
        public void HandleDownstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as SendSlice;
            if (msg != null)
            {
                var str = Encoding.UTF8.GetString(msg.BufferSlice.Buffer, msg.BufferSlice.Position, msg.BufferSlice.RemainingLength);
                var sb = GetAlphaNumeric(str);
               _logger.Trace(sb.ToString());

            }

            var msg2 = message as SendStream;
            if (msg2 != null)
            {
                var buffer = new byte[msg2.Stream.Length];
                msg2.Stream.Read(buffer, 0, buffer.Length);
                msg2.Stream.Position = 0;
                var str = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
                var sb = GetAlphaNumeric(str);
                _logger.Trace(sb.ToString());

            }

            context.SendDownstream(message);
        }
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        /// <remarks>
        /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>.
        /// </remarks>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as ReceivedRequest;
            if (msg == null)
                return;


            var parray = msg.Request.Parameters as object[];
            if (parray == null)
                return; // muhahaha, violating the API specification

            object result;
            switch (msg.Request.Method)
            {
                case "add":
                    result = int.Parse(parray[0].ToString()) + int.Parse(parray[0].ToString());
                    break;
                case "substract":
                    result = int.Parse(parray[0].ToString()) + int.Parse(parray[0].ToString());
                    break;
                default:
                    result = "Nothing useful.";
                    break;
            }

            var response = new Response(msg.Request.Id, result);
            context.SendDownstream(new SendResponse(response));
        }
Esempio n. 27
0
 public void SendDownstream(IPipelineMessage message)
 {
     DownstreamMessages2.Add(message);
     if (_downstreamTypeToWaitOn != null && _downstreamTypeToWaitOn.IsInstanceOfType(message))
     {
         _downstreamEvent.Set();
     }
 }
Esempio n. 28
0
 /// <summary>
 /// Sends a message in the pipeline
 /// </summary>
 /// <param name="message">The message.</param>
 protected void SendUpstream(IPipelineMessage message)
 {
     Pipeline.SendUpstream(message);
     if (message is IDisposable)
     {
         ((IDisposable)message).Dispose();
     }
 }
Esempio n. 29
0
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        /// <remarks>
        /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>.
        /// </remarks>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as PipelineFailure;

            if (msg != null)
            {
                throw new TargetInvocationException("Pipeline failed", msg.Exception);
            }
        }
 /// <summary>
 /// Handle an message
 /// </summary>
 /// <param name="context">Context unique for this handler instance</param>
 /// <param name="message">Message to process</param>
 /// <remarks>
 /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>.
 /// </remarks>
 public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
 {
     var msg = message as Received;
     if (msg == null)
     {
         context.SendUpstream(message);
         return;
     }
 }
        public void HandleUpstream(IPipelineHandlerContext ctx, IPipelineMessage message)
        {
            if (message is Connected)
            {
                _context = new DecoderContext {ParserMethod = ParseBeforeHeader};
            }
            else if (message is Closed)
            {
                _context = null;
            }
            if (!(message is Received))
            {
                ctx.SendUpstream(message);
                return;
            }


            var evt = (Received) message;
            var buffer = evt.BufferReader;
            _logger.Trace("Pos: " + buffer.Position);
            _context.Reader.Assign(buffer);


            try
            {
                var canrun = true;
                while (canrun)
                {
                    _logger.Trace("Parsing using " + _context.ParserMethod.Method.Name);
                    canrun = _context.ParserMethod();
                }
            }
            catch (Exception err)
            {
                _logger.Error("Failed to parse message.", err);
                ctx.SendUpstream(new PipelineFailure(err));
                return;
            }

            if (!_context.IsComplete)
            {
                //_leftOvers = Encoding.UTF8.GetString(buffer.Buffer, buffer.Offset, buffer.RemainingLength);
                return; // Need more data from the channel
            }

            _context.ParserMethod = ParseBeforeHeader;
            _logger.Debug("Got message " + _context.Message.Headers["Content-Type"]);
            if (string.IsNullOrEmpty(_context.Message.Headers["Content-Type"]))
            {
                _logger.Warning("Malformed message\r\n" +
                                Encoding.ASCII.GetString(buffer.Buffer, buffer.StartOffset, buffer.Count));
                Debugger.Break();
            }

            ctx.SendUpstream(new ReceivedMessage(_context.Message));
            _context.Message = new Message();
        }
Esempio n. 32
0
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        /// <remarks>
        /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>.
        /// </remarks>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            if (message is EventRecieved)
            {
                HandleBackgroundCompletion(context, (EventRecieved)message);
                return;
            }
            if (!(message is ReceivedMessage))
            {
                context.SendUpstream(message);
                return;
            }


            var msg  = (ReceivedMessage)message;
            var type = msg.Message.Headers["Content-Type"];

            if (type == null || type != "command/reply")
            {
                context.SendUpstream(message);
                return;
            }

            SendCommandMessage nextCommand = null;
            ICommand           curMsg;

            lock (_outbound)
            {
                if (_current == null)
                {
                    throw new InvalidOperationException("No active command set.");
                }
                _logger.Trace("Got reply for " + _current);
                curMsg      = _current;
                nextCommand = _outbound.Count > 0 ? _outbound.Dequeue() : null;
                _current    = null;
            }

            if (curMsg is BgApiCmd)
            {
                HandleBgApi(context, msg.Message, (BgApiCmd)curMsg);
            }
            else
            {
                var result = msg.Message.Headers["Reply-Text"].StartsWith("+");
                var body   = msg.Message.Headers["Reply-Text"];
                var reply  = new CommandReply(curMsg, result, body);
                _logger.Debug("Sending reply " + body);
                context.SendUpstream(reply);
            }

            if (nextCommand != null)
            {
                _logger.Trace("Sending next command down: " + nextCommand.Command);
                SendCommand(context, nextCommand);
            }
        }
Esempio n. 33
0
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        /// <remarks>
        /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>.
        /// </remarks>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as Received;

            if (msg == null)
            {
                context.SendUpstream(message);
                return;
            }
        }
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        /// <remarks>
        /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>.
        /// </remarks>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            if (message is EventRecieved)
            {
                HandleBackgroundCompletion(context, (EventRecieved) message);
                return;
            }
            if (!(message is ReceivedMessage))
            {
                context.SendUpstream(message);
                return;
            }


            var msg = (ReceivedMessage) message;
            var type = msg.Message.Headers["Content-Type"];
            if (type == null || type != "command/reply")
            {
                context.SendUpstream(message);
                return;
            }

            SendCommandMessage nextCommand = null;
            ICommand curMsg;
            lock (_outbound)
            {
                if (_current == null)
                {
                    throw new InvalidOperationException("No active command set.");
                }
                _logger.Trace("Got reply for " + _current);
                curMsg = _current;
                nextCommand = _outbound.Count > 0 ? _outbound.Dequeue() : null;
                _current = null;
            }

            if (curMsg is BgApiCmd)
            {
                HandleBgApi(context, msg.Message, (BgApiCmd) curMsg);
            }
            else
            {
                var result = msg.Message.Headers["Reply-Text"].StartsWith("+");
                var body = msg.Message.Headers["Reply-Text"];
                var reply = new CommandReply(curMsg, result, body);
                _logger.Debug("Sending reply " + body);
                context.SendUpstream(reply);
            }

            if (nextCommand != null)
            {
                _logger.Trace("Sending next command down: " + nextCommand.Command);
                SendCommand(context, nextCommand);
            }
        }
Esempio n. 35
0
 /// <summary>
 /// A message have been sent through the pipeline and are ready to be handled by the channel.
 /// </summary>
 /// <param name="message">Message that the channel should process.</param>
 public override void HandleDownstream(IPipelineMessage message)
 {
     if (message is Connect)
     {
         Connect((IPEndPoint)((Connect)message).RemoteEndPoint);
     }
     else
     {
         base.HandleDownstream(message);
     }
 }
        /// <summary>
        /// Takes a <see cref="Message"/> and converts it into a byte buffer.
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="message"></param>
        public void HandleDownstream(IPipelineHandlerContext ctx, IPipelineMessage message)
        {
            if (message is SendCommandMessage)
            {
                var evt = (SendCommandMessage) message;
                var slice = EncodeCommand(evt.Command);
                message = new SendSlice(slice);
            }

            ctx.SendDownstream(message);
        }
Esempio n. 37
0
        /// <summary>
        /// Takes a <see cref="Message"/> and converts it into a byte buffer.
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="message"></param>
        public void HandleDownstream(IPipelineHandlerContext ctx, IPipelineMessage message)
        {
            if (message is SendCommandMessage)
            {
                var evt   = (SendCommandMessage)message;
                var slice = EncodeCommand(evt.Command);
                message = new SendSlice(slice);
            }

            ctx.SendDownstream(message);
        }
        /// <summary>
        /// A message have been sent through the pipeline and are ready to be handled by the channel.
        /// </summary>
        /// <param name="message">Message that the channel should process.</param>
        public virtual void HandleDownstream(IPipelineMessage message)
        {
            Logger.Debug("Got message " + message);

            if (message is SendMessage)
                Send((SendMessage) message);
            if (message is Disconnect)
                HandleDisconnect(new SocketException((int) SocketError.Success));
            else if (message is Close)
                Dispose(true);
        }
 public void SendDownstream(IPipelineMessage message)
 {
     if (_nextHandler != null)
     {
         _logger.Trace("Down: " + _myHandler.ToStringOrClassName() + " is passing on message");
         _nextHandler.Invoke(message);
     }
     else
     {
         _logger.Warning("Down: " +_myHandler.ToStringOrClassName() + " tried to send message, but there are no more handlers.");
     }
 }
 /// <summary>
 /// Handle an message
 /// </summary>
 /// <param name="context">Context unique for this handler instance</param>
 /// <param name="message">Message to process</param>
 /// <remarks>
 /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>.
 /// </remarks>
 public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
 {
     try
     {
         _listener.ScopeStarted(_id);
     }
     catch (Exception)
     {
         _listener.ScopeEnded(_id);
         throw;
     }
 }
Esempio n. 41
0
 public void SendUpstream(IPipelineMessage message)
 {
     if (_nextHandler != null)
     {
         _logger.Trace("Up: " + _myHandler.ToStringOrClassName() + " sends message " + message.ToStringOrClassName());
         _nextHandler.Invoke(message);
     }
     else
     {
         _logger.Warning("Up: " + _myHandler.ToStringOrClassName() + " tried to send message " + message.ToStringOrClassName() + ", but there are no handler upstream.");
     }
 }
 public void SendUpstream(IPipelineMessage message)
 {
     if (_nextHandler != null)
     {
         _logger.Trace("Up: " + _myHandler.ToStringOrClassName() + " sends message " + message.ToStringOrClassName());
         _nextHandler.Invoke(message);
     }
     else
     {
         _logger.Warning("Up: " + _myHandler.ToStringOrClassName() + " tried to send message " + message.ToStringOrClassName() + ", but there are no handler upstream.");
     }
 }
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        /// <remarks>
        /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>.
        /// </remarks>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as ReceivedRequest;
            if (msg == null)
            {
                context.SendUpstream(message);
                return;
            }

            var response = _rpcInvoker.Invoke(msg.Request);
            context.SendDownstream(new SendResponse(response));
        }
Esempio n. 44
0
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        /// <remarks>
        /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>.
        /// </remarks>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as Received;
            if (msg != null)
            {
                var str = Encoding.UTF8.GetString(msg.BufferSlice.Buffer, msg.BufferSlice.Position, msg.BufferSlice.RemainingLength);
                var sb = GetAlphaNumeric(str);
                _logger.Trace(sb.ToString());
            }

            context.SendUpstream(message);
        }
 public void SendDownstream(IPipelineMessage message)
 {
     if (_nextHandler != null)
     {
         _logger.Trace("Down: " + _myHandler.ToStringOrClassName() + " is passing on message");
         _nextHandler.Invoke(message);
     }
     else
     {
         _logger.Warning("Down: " + _myHandler.ToStringOrClassName() + " tried to send message, but there are no more handlers.");
     }
 }
Esempio n. 46
0
 /// <summary>
 /// Handle an message
 /// </summary>
 /// <param name="context">Context unique for this handler instance</param>
 /// <param name="message">Message to process</param>
 /// <remarks>
 /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>.
 /// </remarks>
 public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
 {
     try
     {
         _listener.ScopeStarted(_id);
     }
     catch (Exception)
     {
         _listener.ScopeEnded(_id);
         throw;
     }
 }
Esempio n. 47
0
        public void HandleDownstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as SendHttpResponse;
            if (msg == null)
            {
                context.SendDownstream(message);
                return;
            }

            var stream = SerializeHeaders(msg.Response);
            context.SendDownstream(new SendStream(stream));
            context.SendDownstream(new SendStream(msg.Response.Body));
        }
Esempio n. 48
0
        public void SendUpstream(IPipelineMessage message)
        {
            UpstreamMessages.Add(message);
            _logger.Debug("Received: " + message);
            var waiters = _upstreamers.Where(x => x._requestedType == message.GetType()).ToList();

            foreach (var observer in waiters)
            {
                _logger.Trace("Trigering observer: " + observer);
                observer.Trigger(message);
            }
            _upstreamers.RemoveAll(waiters.Contains);
        }
Esempio n. 49
0
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        /// <remarks>
        /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>.
        /// </remarks>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as Received;

            if (msg != null)
            {
                var str = Encoding.UTF8.GetString(msg.BufferSlice.Buffer, msg.BufferSlice.Position, msg.BufferSlice.RemainingLength);
                var sb  = GetAlphaNumeric(str);
                _logger.Trace(sb.ToString());
            }

            context.SendUpstream(message);
        }
        /// <summary>
        /// Handles an upstream message in a request pipeline.
        /// </summary>
        /// <param name="context">Context.</param>
        /// <param name="message">Message.</param>
        void IUpstreamHandler.HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as Received;

            // if we don't know what we got, then send it
            // up stream
            if (msg == null)
            {
                context.SendUpstream(message);
                return;
            }


        }
Esempio n. 51
0
        public void SendUpStreamAndSwitchToDown()
        {
            var pipeline             = new Pipeline();
            IPipelineMessage downMsg = null;

            pipeline.AddUpstreamHandler(new MyUpHandler((ctx, m) =>
            {
                var upMsg = m;
                ctx.SendDownstream(upMsg);
            }));
            pipeline.AddDownstreamHandler(new MyDownHandler((ctx, m) => downMsg = m));
            pipeline.SendUpstream(new Disconnected(new Exception()));
            Assert.NotNull(downMsg);
        }
Esempio n. 52
0
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        /// <remarks>
        /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>.
        /// </remarks>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as ReceivedRequest;

            if (msg == null)
            {
                context.SendUpstream(message);
                return;
            }

            var response = _rpcInvoker.Invoke(msg.Request);

            context.SendDownstream(new SendResponse(response));
        }
Esempio n. 53
0
        protected virtual EventBase CreateEvent(IPipelineMessage message, NameValueCollection msg)
        {
            var name = String.Compare(msg["Event-Name"], "custom", StringComparison.OrdinalIgnoreCase) == 0
                           ? msg["Event-Subclass"]
                           : msg["Event-Name"];

            if (string.IsNullOrEmpty(name))
            {
                _logger.Warning("Failed to create event " + name);
                return(null);
            }

            return(msg["Event-Subclass"] == null?_factory.Create(name) : _factory.CreateCustom(name));
        }
Esempio n. 54
0
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        /// <remarks>
        /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>.
        /// </remarks>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var httpmsg = message as ReceivedHttpRequest;

            if (httpmsg != null)
            {
                if (httpmsg.HttpRequest.ContentLength > _sizeLimit)
                {
                    var response = httpmsg.HttpRequest.CreateResponse(HttpStatusCode.RequestEntityTooLarge,
                                                                      string.Format("Max body size is {0} bytes.",
                                                                                    _sizeLimit));
                    context.SendDownstream(new SendHttpResponse(httpmsg.HttpRequest, response));
                    return;
                }

                if (httpmsg.HttpRequest.ContentLength == 0)
                {
                    context.SendUpstream(message);
                    return;
                }

                _currentMessage = httpmsg.HttpRequest;
                return; // don't send the request upwards.
            }

            var msg = message as Received;

            if (msg != null)
            {
                if (_currentMessage == null)
                {
                    throw new InvalidOperationException("Current message is not set. We have no way of knowing when to stop decoding the body.");
                }

                var result = ParseBody(msg.BufferReader);
                if (!result)
                {
                    return;
                }

                _currentMessage.Body.Position = 0;
                _decoderService.Decode((IRequest)_currentMessage);
                context.SendUpstream(new ReceivedHttpRequest((HttpRequest)_currentMessage));
                _currentMessage = null;
                return;
            }

            // pass on all other messages
            context.SendUpstream(message);
        }
        /// <summary>
        /// Process message
        /// </summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        /// <remarks>
        /// Should always call either <see cref="IPipelineHandlerContext.SendDownstream"/> or <see cref="IPipelineHandlerContext.SendUpstream"/>
        /// unless the handler really wants to stop the processing.
        /// </remarks>
        public void HandleDownstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as SendHttpResponse;
            if (msg == null)
            {
                context.SendDownstream(message);
                return;
            }

            if (msg.Response.StatusCode == (int) HttpStatusCode.Unauthorized)
            {
                _authenticator.CreateChallenge(msg.Request, msg.Response);
            }

            context.SendDownstream(message);
        }
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        /// <remarks>
        /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>.
        /// </remarks>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as Received;
            if (msg != null)
            {
                var bytes =
                    Encoding.ASCII.GetBytes("\r\nFrom FreeSwitch***************** " + DateTime.Now.ToShortDateString() +
                                            " " +
                                            DateTime.Now.ToString("HH:mm:ss.nnn") + " ******************\r\n\r\n");
                _destinationStream.Write(bytes, 0, bytes.Length);
                _destinationStream.Write(msg.BufferSlice.Buffer, 0, msg.BufferSlice.Count);
                _destinationStream.Flush();
            }

            context.SendUpstream(message);
        }
Esempio n. 57
0
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        /// <remarks>
        /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>.
        /// </remarks>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as ReceivedHttpRequest;
            if (msg == null)
            {
                context.SendUpstream(message);
                return;
            }

            var ifModifiedSince = DateTime.MinValue;
            var header = msg.HttpRequest.Headers["If-Modified-Since"];
            if (header != null)
            {
                ifModifiedSince = DateTime.Parse(header.Value).ToUniversalTime();

                // Allow for file systems with subsecond time stamps
                ifModifiedSince = new DateTime(ifModifiedSince.Year, ifModifiedSince.Month, ifModifiedSince.Day,
                                               ifModifiedSince.Hour, ifModifiedSince.Minute, ifModifiedSince.Second,
                                               ifModifiedSince.Kind);
            }

            
            var fileContext = new FileContext(msg.HttpRequest, ifModifiedSince);
            _fileService.GetFile(fileContext);
            if (fileContext.LastModifiedAtUtc > DateTime.MinValue)
            {
                var response = msg.HttpRequest.CreateResponse(HttpStatusCode.OK, "File found");
                var filename = msg.HttpRequest.Uri.Segments[msg.HttpRequest.Uri.Segments.Length - 1];
                response.ContentType = _mimeTypeProvider.Get(filename);
                if (fileContext.FileStream == null)
                {
                    response.StatusDescription = "File have not changed since " + fileContext.LastModifiedAtUtc;
                    response.StatusCode = (int) HttpStatusCode.NotModified;
                }
                else
                {
                    response.AddHeader("Last-Modified", fileContext.LastModifiedAtUtc.ToString("R"));
                    response.Body = fileContext.FileStream;
                }

                context.SendDownstream(new SendHttpResponse(msg.HttpRequest, response));
                return;
            }


            context.SendUpstream(message);
        }
 public void HandleDownstream(IPipelineHandlerContext context, IPipelineMessage message)
 {
     if (message is Connect)
     {
         _endPoint = (IPEndPoint) ((Connect) message).RemoteEndPoint;
         if (_timer != null)
         {
             _timer.Dispose();
             _timer = null;
         }
         _forcedDisconnect = false;
     }
     if (message is Disconnect)
     {
         _forcedDisconnect = true;
     }
 }
        /// <summary>
        /// Process message
        /// </summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        public void HandleDownstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as SendHttpResponse;
            if (msg == null)
            {
                context.SendDownstream(message);
                return;
            }

            var stream = SerializeHeaders(msg.Response);
            stream.Position = 0;
            context.SendDownstream(new SendStream(stream));
            if (msg.Response.Body != null)
                context.SendDownstream(new SendStream(msg.Response.Body));
            if (!msg.Response.KeepAlive)
                context.SendDownstream(new Close());
        }
        /// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param>
        /// <param name="message">Message to process</param>
        /// <remarks>
        /// All messages that can't be handled MUST be send up the chain using <see cref="IPipelineHandlerContext.SendUpstream"/>.
        /// </remarks>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as Received;
            if (msg != null)
            {
                var stream = new MemoryStream();
                msg.BufferReader.CopyTo(stream, msg.BufferReader.Count);
                msg.BufferReader.Position = 0;

                var reader = new StreamReader(stream);
                var str = reader.ReadToEnd();
                var sb = GetAlphaNumeric(str);
                _logger.Trace(sb.ToString());
            }

            context.SendUpstream(message);
        }