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