/// <summary> /// May throw exceptions if there are pipe problems. /// </summary> /// <param name="stream"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public static async Task <BuildResponse> ReadAsync(Stream stream, CancellationToken cancellationToken = default(CancellationToken)) { Log("Reading response length"); // Read the response length var lengthBuffer = new byte[4]; await ReadAllAsync(stream, lengthBuffer, 4, cancellationToken).ConfigureAwait(false); var length = BitConverter.ToUInt32(lengthBuffer, 0); // Read the response Log("Reading response of length {0}", length); var responseBuffer = new byte[length]; await ReadAllAsync(stream, responseBuffer, responseBuffer.Length, cancellationToken).ConfigureAwait(false); using (var reader = new BinaryReader(new MemoryStream(responseBuffer), Encoding.Unicode)) { var responseType = (ResponseType)reader.ReadInt32(); switch (responseType) { case ResponseType.Completed: return(CompletedBuildResponse.Create(reader)); case ResponseType.MismatchedVersion: return(new MismatchedVersionBuildResponse()); case ResponseType.IncorrectHash: return(new IncorrectHashBuildResponse()); case ResponseType.AnalyzerInconsistency: return(new AnalyzerInconsistencyBuildResponse()); case ResponseType.Shutdown: return(ShutdownBuildResponse.Create(reader)); case ResponseType.Rejected: return(new RejectedBuildResponse()); default: throw new InvalidOperationException("Received invalid response type from server."); } } }
private async Task<ConnectionData> HandleShutdownRequest(CancellationToken cancellationToken) { var id = Process.GetCurrentProcess().Id; var response = new ShutdownBuildResponse(id); await response.WriteAsync(_stream, cancellationToken).ConfigureAwait(false); return new ConnectionData(CompletionReason.ClientShutdownRequest); }
public async Task ShutdownResponseWriteRead() { var response = new ShutdownBuildResponse(42); Assert.Equal(BuildResponse.ResponseType.Shutdown, response.Type); var memoryStream = new MemoryStream(); await response.WriteAsync(memoryStream, CancellationToken.None); memoryStream.Position = 0; var read = await BuildResponse.ReadAsync(memoryStream, CancellationToken.None); Assert.Equal(BuildResponse.ResponseType.Shutdown, read.Type); var typed = (ShutdownBuildResponse)read; Assert.Equal(42, typed.ServerProcessId); }