private async Task HandleDele(string command) { var messageNumber = CommandParser.ParseDele(command); if (messageNumber.HasValue) { var commandResult = await _commandHandler.HandleDele(messageNumber.Value); await SendCommandResult(commandResult); } else { await SendCommandResult(Pop3CommandReply.CreateNoSuchMessage()); } }
private async Task HandleRetr(string command) { var messageIndex = CommandParser.ParseRetr(command); if (messageIndex.HasValue) { var stream = await _commandHandler.HandleRetr(messageIndex.Value); if (stream == null) { await SendCommandResult(Pop3CommandReply.CreateNoSuchMessage()); } else { using (stream) { await _connection.WriteString("+OK\r\n"); // TODO: Add transmission period. byte[] buf = new byte[4096]; int bytesRead = 0; while ((bytesRead = stream.Read(buf, 0, buf.Length)) > 0) { if (bytesRead < buf.Length) { var reducedBuffer = new byte[bytesRead]; Buffer.BlockCopy(buf, 0, reducedBuffer, 0, bytesRead); await _connection.WriteBytes(reducedBuffer); } else { await _connection.WriteBytes(buf); } } } await _connection.WriteString("\r\n.\r\n"); } } else { await SendCommandResult(Pop3CommandReply.CreateNoSuchMessage()); } }