public void TestExecuteFail() { using (ShimsContext.Create()) { var server = new ShimSMTPServer(); var settings = new StubIReceiveSettings(); var transaction = new SMTPTransaction(server, settings); server.GetHandlerString = s => null; var response = transaction.ExecuteCommand(new SMTPCommand("NonExistentCommand", "Params")); Assert.Equal(SMTPStatusCode.SyntaxError, response.Code); } }
public void TestExecuteSuccess() { const string command = "Test"; var expectedResponse = new SMTPResponse(SMTPStatusCode.NotAvailiable, "Fu", "bar"); const string expectedParams = "Fubar blubb"; using (ShimsContext.Create()) { var server = new ShimSMTPServer(); var settings = new StubIReceiveSettings(); var transaction = new SMTPTransaction(server, settings); SMTPTransaction actualTransaction = null; string actualParams = null; var handler = new StubICommandHandler { ExecuteSMTPTransactionString = (smtpTransaction, s) => { actualTransaction = smtpTransaction; actualParams = s; return(expectedResponse); } }; server.GetHandlerString = s => { if (s.Equals(command, StringComparison.InvariantCultureIgnoreCase)) { return(handler); } throw new InvalidOperationException("Invalid name."); }; var response = transaction.ExecuteCommand(new SMTPCommand(command, expectedParams)); Assert.Same(expectedResponse, response); Assert.Equal(expectedParams, actualParams); Assert.Same(transaction, actualTransaction); } }
public async Task Process() { try { Log(LogEventType.Connect); SMTPResponse response; _transaction = _smtpServer.SMTPServer.StartTransaction(_remoteEndpoint.Address, _smtpServer.Settings, out response); if (_tlsConnector.Settings.Mode == TLSMode.FullTunnel) { await StartTLS(); } RefreshReaderAndWriter(); _transaction.OnStartTLS += OnStartTLS; _transaction.OnClose += OnCloseHandler; await Write(response); try { while (!_reader.EndOfStream && !_transaction.Closed) { await Write(_transaction.ExecuteCommand(await Read())); while (_transaction.InDataMode) { string line; var data = new StringBuilder(); do { line = await _reader.ReadLineAsync(); } while (_transaction.HandleDataLine(line, data)); await Write(_transaction.HandleData(data.ToString())); } if (_startTLS) { await StartTLS(); RefreshReaderAndWriter(); RefreshTransaction(); _startTLS = false; } } } catch (IOException) { } } catch (Exception e) { Logger.Error("Error while handling client connection.", e); } finally { Close(); } }