public async Task <StartTlsResult> TryStartTls(Stream networkStream) { try { using (IStreamReader streamReader = new StreamReaderWrapper(networkStream, Encoding.ASCII, true, 1024, true)) { using (IStreamWriter streamWriter = new StreamWriterWrapper(networkStream, Encoding.ASCII, 1024, true) { AutoFlush = true, NewLine = LineEnding }) { SmtpResponse response1 = await _smtpDeserializer.Deserialize(streamReader); _log.Debug($"<: {response1}"); if (response1.Responses.FirstOrDefault()?.ResponseCode != ResponseCode.ServiceReady) { return(new StartTlsResult(false, response1.Responses.Select(_ => _.ToString()).ToList(), "The server did not present a service ready response code (220).")); } EhloCommand ehloCommand = new EhloCommand(_mxSecurityTesterConfig.SmtpHostName); _log.Debug($">: {ehloCommand.CommandString}"); await _smtpSerializer.Serialize(ehloCommand, streamWriter); SmtpResponse response2 = await _smtpDeserializer.Deserialize(streamReader); _log.Debug($"<: {response2}"); if (!response2.Responses.Any(_ => _.Value.ToLower() == Starttls && _.ResponseCode == ResponseCode.Ok)) { return(new StartTlsResult(false, response2.Responses.Select(_ => _.ToString()).ToList(), "The server did not present a STARTTLS command with a response code (250).")); } StartTlsCommand startTlsCommand = new StartTlsCommand(); _log.Debug($">: {startTlsCommand.CommandString}"); await _smtpSerializer.Serialize(startTlsCommand, streamWriter); SmtpResponse response3 = await _smtpDeserializer.Deserialize(streamReader); _log.Debug($"<: {response3}"); return(new StartTlsResult( response3.Responses.FirstOrDefault()?.ResponseCode == ResponseCode.ServiceReady, response3.Responses.Select(_ => _.Value).ToList(), string.Empty)); } } } catch (Exception e) { _log.Error( $"SMTP session initalization failed with error: {e.Message} {Environment.NewLine} {e.StackTrace}"); return(new StartTlsResult(false, null, e.Message)); } }
private async Task WriteLoop() { try { ulong cycle = 0; while (true) { if (linequeue.IsEmpty) { await addedEvent.WaitAsync(cts.Token); cts.Token.ThrowIfCancellationRequested(); } cycle++; if (linequeue.TryDequeue(out string line)) { string directory = GetDirectory(basePath, line, layers); //describes the dir in which the file belongs string path = GetFilePath(basePath, line, layers); if (fileStreams.TryGetValue(path, out StreamWriterWrapper streamWriterW)) { await streamWriterW.streamWriter.WriteLineAsync(line); } else { CreateDirectory(directory); StreamWriterWrapper sww = new StreamWriterWrapper( new StreamWriter(new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.None, bufferSize: 4096, useAsync: true)), cycle); fileStreams.Add(path, sww); await sww.streamWriter.WriteLineAsync(line); } //prune the fileStreams if we have to many if (fileStreams.Count > 5000) { KeyValuePair <string, StreamWriterWrapper>[] ar = fileStreams.ToArray(); Array.Sort(ar, Compare); await AsyncParallelForEach(ar.Take(750), async (kv) => { await kv.Value.streamWriter.FlushAsync(); await kv.Value.streamWriter.DisposeAsync(); lock (fileStreams) { fileStreams.Remove(kv.Key); } }); } } } } catch (OperationCanceledException) { } catch (Exception e) { Debugger.Break(); throw e; } }
private static void Write <T>(StreamWriterWrapper writer, in T[] value)
private static void Write <T>(StreamWriterWrapper writer, in List <T> value)
private static void Write <TKey, TValue>(StreamWriterWrapper writer, in Dictionary <TKey, TValue> value)
private static void Write(StreamWriterWrapper writer, in Type value) => writer.WriteLine(TypeNames.Get(value));
private static void Write(StreamWriterWrapper writer, in string value) => writer.WriteLine(value);
public NonBlockingFileWriter(string filename) { logOutput = new StreamWriterWrapper(filename); }
private static void Write(StreamWriterWrapper writer, in string value)