Exemple #1
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();
        }
        /// <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;
            }
        }
        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);
        }
Exemple #4
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)
            {
                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;
            }
        }
        private void HandleBackgroundCompletion(IPipelineHandlerContext context, EventRecieved message)
        {
            var msg = message.FreeSwitchEvent as BackgroundJob;

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

            BgApiCmd command;

            lock (_pending)
            {
                command = _pending.FirstOrDefault(x => x.Id == msg.JobUid);
                if (command == null)
                {
                    throw new InvalidOperationException("Got a command reply but no pending background job: " + msg);
                }

                _pending.Remove(command);
            }


            context.SendUpstream(new CommandReply(command.Inner, msg.CommandResult.StartsWith("+"), msg.CommandResult));
        }
        /// <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)
        {
            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);
            }
        }
        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();
        }
        /// <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);
        }
Exemple #12
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);
        }
        /// <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)
        {
            if (message is Closed)
            {
                _bodyBytesLeft = 0;
                _headerParser.Reset();
            }
            else if (message is Received)
            {
                var msg = (Received)message;

                // complete the body
                if (_bodyBytesLeft > 0)
                {
                    var bytesToSend = Math.Min(_bodyBytesLeft, msg.BufferReader.RemainingLength);
                    _bodyBytesLeft -= bytesToSend;
                    context.SendUpstream(message);
                    return;
                }

                _headerParser.Parse(msg.BufferReader);
                if (_headerCompleted)
                {
                    var request = (IRequest)_message;

                    var ourRequest = _message as HttpRequest;
                    if (ourRequest != null)
                    {
                        ourRequest.RemoteEndPoint = msg.RemoteEndPoint as IPEndPoint;
                    }
                    request.AddHeader("RemoteAddress", msg.RemoteEndPoint.ToString());

                    var receivedHttpRequest = new ReceivedHttpRequest(request);

                    _headerParser.Reset();
                    _headerCompleted = false;

                    context.SendUpstream(receivedHttpRequest);
                    if (msg.BufferReader.RemainingLength > 0)
                    {
                        context.SendUpstream(msg);
                    }
                }

                return;
            }

            context.SendUpstream(message);
        }
        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);
            }
        }
        /// <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)
        {
            if (message is Closed)
            {
                _bodyBytesLeft = 0;
                _headerParser.Reset();
            }
            else if (message is Received)
            {
                var msg = (Received) message;

                // complete the body
                if (_bodyBytesLeft > 0)
                {
                    var bytesToSend = Math.Min(_bodyBytesLeft, msg.BufferReader.RemainingLength);
                    _bodyBytesLeft -= bytesToSend;
                    context.SendUpstream(message);
                    return;
                }

                _headerParser.Parse(msg.BufferReader);
                if (_headerCompleted)
                {
                    var request = (IRequest) _message;

                    var ourRequest = _message as HttpRequest;
                    if (ourRequest != null)
                        ourRequest.RemoteEndPoint = msg.RemoteEndPoint as IPEndPoint;
                    request.AddHeader("RemoteAddress", msg.RemoteEndPoint.ToString());

                    var receivedHttpRequest = new ReceivedHttpRequest(request);

                    _headerParser.Reset();
                    _headerCompleted = false;

                    context.SendUpstream(receivedHttpRequest);
                    if (msg.BufferReader.RemainingLength > 0)
                        context.SendUpstream(msg);
                }

                return;
            }

            context.SendUpstream(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)
     {
         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)
        {
            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;
            }

            IAuthenticationUser user;

            try
            {
                user = this._authenticator.Authenticate(msg.HttpRequest);
            }
            catch (HttpException err)
            {
                var response = msg.HttpRequest.CreateResponse(err.StatusCode, err.Message);
                context.SendDownstream(new SendHttpResponse(msg.HttpRequest, response));
                return;
            }

            if (user == null)
            {
                var response = msg.HttpRequest.CreateResponse(HttpStatusCode.Unauthorized,
                                                              "Invalid username or password.");
                context.SendDownstream(new SendHttpResponse(msg.HttpRequest, response));
            }
            else
            {
                var principal = this._principalFactory.Create(new PrincipalFactoryContext(msg.HttpRequest, user));
                //Thread.CurrentPrincipal = principal;
                context.SendUpstream(message);
            }
        }
Exemple #18
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="M:Griffin.Networking.IPipelineHandlerContext.SendUpstream(Griffin.Networking.IPipelineMessage)"/>.
        /// </remarks>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var headerMsg = message as ReceivedHeader;

            if (headerMsg != null)
            {
                HandleHeader(context, message, headerMsg);
                return;
            }

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

            var msg = message as Received;

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


            var bytesToRead = Math.Min(msg.BufferSlice.RemainingLength, _bytesLeft);

            _stream.Write(msg.BufferSlice.Buffer, msg.BufferSlice.Position, bytesToRead);
            msg.BufferSlice.Position += bytesToRead;

            if (_stream.Length == _header.ContentLength)
            {
                _stream.Position = 0;
                var packet = _decoder.Decode(_packetType, _stream);
                _stream.SetLength(0);
                context.SendUpstream(new ReceivedPacket(packet));
                Clear();
                return;
            }

            // There are remaining received bytes.
            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)
        {
            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);
            }
        }
        private void HandleBgApi(IPipelineHandlerContext context, Message response, BgApiCmd curMsg)
        {
            if (response.Headers["Reply-Text"][0] != '+')
            {
                context.SendUpstream(new CommandReply(curMsg.Inner, false, response.Headers["Reply-Text"]));
                return;
            }

            curMsg.Id = response.Headers["Job-UUID"];
            _pending.AddLast(curMsg);
        }
Exemple #22
0
        /// <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 headerMsg = message as ReceivedHeader;

            if (headerMsg != null)
            {
                _header = headerMsg.Header;
                if (_header.Length > 65535)
                {
                    var error = new ErrorResponse("-9999", new RpcError
                    {
                        Code    = RpcErrorCode.InvalidRequest,
                        Message =
                            "Support requests which is at most 655355 bytes.",
                    });
                    context.SendDownstream(new SendResponse(error));
                }

                return;
            }

            var received = message as Received;

            if (received != null)
            {
                var count = Math.Min(received.BufferSlice.RemainingLength, _header.Length);
                _stream.Write(received.BufferSlice.Buffer, received.BufferSlice.Position, count);
                received.BufferSlice.Position += count;

                if (_stream.Length == _header.Length)
                {
                    _stream.Position = 0;
                    var request = DeserializeRequest(_stream);
                    context.SendUpstream(new ReceivedRequest(request));
                }

                return;
            }

            context.SendUpstream(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 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>
        /// 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));
        }
        /// <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="M:Griffin.Networking.IPipelineHandlerContext.SendUpstream(Griffin.Networking.IPipelineMessage)"/>.
        /// </remarks>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var headerMsg = message as ReceivedHeader;
            if (headerMsg != null)
            {
                HandleHeader(context, message, headerMsg);
                return;
            }

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

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


            var bytesToRead = Math.Min(msg.BufferSlice.RemainingLength, _bytesLeft);
            _stream.Write(msg.BufferSlice.Buffer, msg.BufferSlice.Position, bytesToRead);
            msg.BufferSlice.Position += bytesToRead;

            if (_stream.Length == _header.ContentLength)
            {
                _stream.Position = 0;
                var packet = _decoder.Decode(_packetType, _stream);
                _stream.SetLength(0);
                context.SendUpstream(new ReceivedPacket(packet));
                Clear();
                return;
            }

            // There are remaining received bytes.
            context.SendUpstream(msg);
        }
Exemple #26
0
        /// <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)
        {
            if (message is Closed)
            {
                _bodyBytesLeft = 0;
                _parser.Reset();
            }
            else if (message is Received)
            {
                var msg = (Received)message;

                // complete the body
                if (_bodyBytesLeft > 0)
                {
                    _bodyBytesLeft -= msg.BufferSlice.Count;
                    context.SendUpstream(message);
                    return;
                }

                var httpMsg = _parser.Parse(msg.BufferSlice);
                if (httpMsg != null)
                {
                    var recivedHttpMsg = new ReceivedHttpRequest((IRequest)httpMsg);
                    _bodyBytesLeft = recivedHttpMsg.HttpRequest.ContentLength;
                    _parser.Reset();

                    // send up the message to let someone else handle the body
                    context.SendUpstream(recivedHttpMsg);
                    if (msg.BufferSlice.RemainingLength > 0)
                    {
                        context.SendUpstream(msg);
                    }
                }

                return;
            }

            context.SendUpstream(message);
        }
Exemple #27
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>
        /// 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 ReceivedMessage;

            if (msg == null || msg.Message.Headers["Content-Type"] != "text/event-plain")
            {
                context.SendUpstream(message);
                return;
            }


            var body    = ParseBody(msg.Message);
            var fsEvent = CreateEvent(message, body);

            if (fsEvent == null)
            {
                using (var reader = new StreamReader(msg.Message.Body))
                {
                    msg.Message.Body.Position = 0;
                    Console.WriteLine(reader.ReadToEnd());
                }
                context.SendUpstream(message);
                return;
            }

            try
            {
                _logger.Debug("Parsing event " + fsEvent.GetType().Name);
                fsEvent.Parse(body);
                context.SendUpstream(new EventRecieved(fsEvent));
            }
            catch (Exception err)
            {
                msg.Message.Body.Position = 0;
                var reader = new StreamReader(msg.Message.Body);
                throw new InvalidOperationException("Failed to parse event body.\r\n" + reader.ReadToEnd(), err);
            }
        }
        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);
        }
        /// <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;
            }


        }
Exemple #31
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));
        }
        /// <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;
            }

            try
            {
                context.SendUpstream(message);
            }
            catch (HttpException err)
            {
                var response = msg.HttpRequest.CreateResponse(err.StatusCode, err.Message);

                FormatException(response, msg, err);
                response.Body.Position = 0;

                context.SendDownstream(new SendHttpResponse(msg.HttpRequest, response));
            }
        }
        /// <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)
        {
            if (message is Closed)
            {
                _bodyBytesLeft = 0;
                _parser.Reset();
            }
            else if (message is Received)
            {
                var msg = (Received) message;

                // complete the body
                if (_bodyBytesLeft > 0)
                {
                    _bodyBytesLeft -= msg.BufferSlice.Count;
                    context.SendUpstream(message);
                    return;
                }

                var httpMsg = _parser.Parse(msg.BufferSlice);
                if (httpMsg != null)
                {
                    var recivedHttpMsg = new ReceivedHttpRequest((IRequest) httpMsg);
                    _bodyBytesLeft = recivedHttpMsg.HttpRequest.ContentLength;
                    _parser.Reset();

                    // send up the message to let someone else handle the body
                    context.SendUpstream(recivedHttpMsg);
                    if (msg.BufferSlice.RemainingLength > 0)
                        context.SendUpstream(msg);
                }

                return;
            }

            context.SendUpstream(message);
        }
        /// <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)
        {
            if (message is Closed)
            {
                _bodyBytesLeft = 0;
                _headerParser.Reset();
            }
            else if (message is Received)
            {
                var msg = (Received) message;

                // complete the body
                if (_bodyBytesLeft > 0)
                {
                    var bytesToSend = Math.Min(_bodyBytesLeft, msg.BufferReader.RemainingLength);
                    _bodyBytesLeft -= bytesToSend;
                    context.SendUpstream(message);
                    return;
                }

                _headerParser.Parse(msg.BufferReader);
                if (_headerCompleted)
                {
                    var recivedHttpMsg = new ReceivedHttpRequest((IRequest) _message);
                    _headerParser.Reset();
                    _headerCompleted = false;

                    context.SendUpstream(recivedHttpMsg);
                    if (msg.BufferReader.RemainingLength > 0)
                        context.SendUpstream(msg);
                }

                return;
            }

            context.SendUpstream(message);
        }
        /// <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 headerMsg = message as ReceivedHeader;
            if (headerMsg != null)
            {
                _header = headerMsg.Header;
                if (_header.Length > 65535)
                {
                    var error = new ErrorResponse("-9999", new RpcError
                        {
                            Code = RpcErrorCode.InvalidRequest,
                            Message =
                                "Support requests which is at most 655355 bytes.",
                        });
                    context.SendDownstream(new SendResponse(error));
                }

                return;
            }

            var received = message as Received;
            if (received != null)
            {
                var count = Math.Min(received.BufferReader.Count, _header.Length);
                received.BufferReader.CopyTo(_stream, count);
                if (_stream.Length == _header.Length)
                {
                    _stream.Position = 0;
                    var request = DeserializeRequest(_stream);
                    context.SendUpstream(new ReceivedRequest(request));
                }

                return;
            }

            context.SendUpstream(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;
            }

            try
            {
                context.SendUpstream(message);
            }
            catch (HttpException err)
            {
                var response = msg.HttpRequest.CreateResponse(err.StatusCode, err.Message);

                FormatException(response, msg, err);
                response.Body.Position = 0;

                context.SendDownstream(new SendHttpResponse(msg.HttpRequest, response));
            }
        }
Exemple #37
0
        /// <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 ReceivedMessage;
            if (msg == null || msg.Message.Headers["Content-Type"] != "text/event-plain")
            {
                context.SendUpstream(message);
                return;
            }


            var body = ParseBody(msg.Message);
            var fsEvent = CreateEvent(message, body);
            if (fsEvent == null)
            {
                using (var reader = new StreamReader(msg.Message.Body))
                {
                    msg.Message.Body.Position = 0;
                    Console.WriteLine(reader.ReadToEnd());
                }
                context.SendUpstream(message);
                return;
            }

            try
            {
                _logger.Debug("Parsing event " + fsEvent.GetType().Name);
                fsEvent.Parse(body);
                context.SendUpstream(new EventRecieved(fsEvent));
            }
            catch (Exception err)
            {
                msg.Message.Body.Position = 0;
                var reader = new StreamReader(msg.Message.Body);
                throw new InvalidOperationException("Failed to parse event body.\r\n" + reader.ReadToEnd(), err);
            }
        }
        /// <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);
        }
Exemple #40
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);
        }
        /// <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);
        }
        /// <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);
        }
        /// <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);
        }
        /// <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)
            {
                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);
        }
 public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
 {
     Assert.Equal(_index, CurrentIndex);
     CurrentIndex++;
     context.SendUpstream(message);
 }
        private void HandleBackgroundCompletion(IPipelineHandlerContext context, EventRecieved message)
        {
            var msg = message.FreeSwitchEvent as BackgroundJob;
            if (msg == null)
            {
                context.SendUpstream(message);
                return;
            }

            BgApiCmd command;
            lock (_pending)
            {
                command = _pending.FirstOrDefault(x => x.Id == msg.JobUid);
                if (command == null)
                {
                    throw new InvalidOperationException("Got a command reply but no pending background job: " + msg);
                }

                _pending.Remove(command);
            }


            context.SendUpstream(new CommandReply(command.Inner, msg.CommandResult.StartsWith("+"), msg.CommandResult));
        }
        private void HandleBgApi(IPipelineHandlerContext context, Message response, BgApiCmd curMsg)
        {
            if (response.Headers["Reply-Text"][0] != '+')
            {
                context.SendUpstream(new CommandReply(curMsg.Inner, false, response.Headers["Reply-Text"]));
                return;
            }

            curMsg.Id = response.Headers["Job-UUID"];
            _pending.AddLast(curMsg);
        }
Exemple #48
0
 public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
 {
     Assert.Equal(_index, CurrentIndex);
     CurrentIndex++;
     context.SendUpstream(message);
 }
        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);
            }
        }